#include #include #include using namespace std; class Board { public: Board(); char at(int x, int y) const; bool game_over(char& winner) const; void print() const; bool place_brick(int column, char player); private: bool is_horizontal_win_at(int x, int y) const; bool is_vertical_win_at(int x, int y) const; bool is_down_right_diagonal_win_at(int x, int y) const; bool is_up_right_diagonal_win_at(int x, int y) const; bool is_full_board() const; using matrix = vector >; matrix board; }; Board::Board() : board() { for ( int row = 0; row < 7; row++ ) { board.push_back(vector(7, ' ')); } } char Board::at(int x, int y) const { if ( 0 <= x && x < 7 && 0 <= y && y < 7 ) return board[y][x]; else return ' '; } bool Board::is_horizontal_win_at(int x, int y) const { char c = at(x, y); for ( int i = 1; i < 4; ++i ) { if ( at(x + i, y) != c ) return false; } return true; } bool Board::is_vertical_win_at(int x, int y) const { char c = at(x, y); for ( int i = 1; i < 4; ++i ) { if ( at(x, y + i) != c ) return false; } return true; } bool Board::is_down_right_diagonal_win_at(int x, int y) const { char c = at(x, y); for ( int i = 1; i < 4; ++i ) { if ( at(x + i, y + i) != c ) return false; } return true; } bool Board::is_up_right_diagonal_win_at(int x, int y) const { char c = at(x, y); for ( int i = 1; i < 4; ++i ) { if ( at(x + i, y - i) != c ) return false; } return true; } bool Board::is_full_board() const { for ( vector const& row : board ) { for ( char col : row ) { if ( col == ' ' ) return false; } } return true; } bool Board::game_over(char& winner) const { for ( int x = 0; x < 7; ++x ) { for ( int y = 0; y < 7; ++y ) { if ( at(x, y) != ' ' ) { if ( is_horizontal_win_at(x, y) || is_vertical_win_at(x, y) || is_down_right_diagonal_win_at(x, y) || is_down_right_diagonal_win_at(x, y) ) { winner = at(x, y); return true; } } } } if ( is_full_board() ) return true; return false; } bool Board::place_brick(int column, char player) { for ( matrix::reverse_iterator it = board.rbegin(); it != board.rend(); ++it) { if ( it->at(column) == ' ' ) { it->at(column) = player; return true; } } return false; } void Board::print() const { cout << "|0123456|" << endl; for ( vector const& row : board ) { cout << '|'; for ( char col : row ) { cout << col; } cout << '|' << endl; } cout << "+-------+" << endl; } int main() { Board board; char turn{'x'}; char winner{' '}; while ( ! board.game_over( winner ) ) { int column; cout << turn << " chose column: "; cin >> column; cout << turn << " picked column " << column << endl; if ( board.place_brick( column, turn) ) { board.print(); if ( turn == 'x' ) turn = 'o'; else turn = 'x'; } } if (winner == ' ') cout << "It's a draw." << endl; else cout << "'" << winner << "' wins!" << endl; cout << endl; return 0; }