============= Player.h ============== #include #include #ifndef CONNECT_FOUR_PLAYERS_H #define CONNECT_FOUR_PLAYERS_H class player{ public: virtual ~player() {} virtual int playTurn(int max) {return -1;} }; class HumanPlayer : public player { public: HumanPlayer() {} ~HumanPlayer() {} int playTurn(int max); }; class ComputerPlayer : public player{ public: ComputerPlayer(); ~ComputerPlayer() {} int playTurn(int max); }; class field{ private: int m_height; int m_width; char ** gameboard; public: field(int height, int width); ~field(); void print(); bool setTurn(char player, int column); bool check_win(char player, int last_turn); bool check_draw(); }; #endif //CONNECT_FOUR_PLAYERS_H ============== Player.cpp ============= #include "players.h" #include #include #include using namespace std; field::field(int height, int width){ m_height = height; m_width = width; gameboard = new char *[height]; for (int i = 0; i < height; i++) { gameboard[i] = new char[width]; } for (int j = 0; j < height ; ++j) { for (int i = 0; i < width; ++i) { gameboard[j][i] = '.'; } } } field::~field() { for (int i = 0; i < m_height; i++) { delete[] gameboard[i]; } delete[] gameboard; } bool field::setTurn(char player, int column) { for (int i = m_height - 1; i >= 0; --i) { if(gameboard[i][column - 1] == '.'){ gameboard[i][column - 1] = player; return true; } } return false; } bool field::check_win(char player, int column){ column --; int row = 0; int check_win = 0; for (int i = 0; i < m_height; ++i) { if(gameboard[i][column] == player){ row = i; break; } } ///senkrechte Überprüfung for (int j = row; j < m_height; ++j) { if(gameboard[j][column] == player){ check_win ++; }else{ break; } } if (check_win == 4){ return true; } ///Waagrechte Überprüfung check_win = 0; for (int j = column + 1; j < m_width ; ++j) { if(gameboard[row][j] == player){ check_win ++; }else{ break; } } for (int j = column - 1; j >= 0; --j) { if(gameboard[row][j] == player){ check_win ++; }else{ break; } } if (check_win == 3){ return true; } ///Diagonale Überprüfung int row_tmp = row; check_win = 0; ///links oben -> rechts unten for (int j = column; j < m_width; ++j) { if(gameboard[row_tmp][j] == player){ if(row_tmp == m_height - 1){ check_win ++; break; }else{ row_tmp ++; check_win ++; } }else{ break; } } if (row != 0) { row_tmp = row - 1; for (int j = column - 1; j > m_width; --j) { if (gameboard[row_tmp][j] == player) { if (row_tmp == 0) { check_win++; break; } else { row_tmp--; check_win++; } } else { break; } } } if (check_win == 4){ return true; } ///rechts oben -> links unten row_tmp = row; check_win = 0; for (int j = column; j < m_width; ++j) { if(gameboard[row_tmp][j] == player){ if(row_tmp == 0){ check_win ++; break; }else{ row_tmp --; check_win ++; } }else{ break; } } if(row != m_height - 1){ row_tmp = row + 1; for (int j = column - 1; j >= 0; --j) { if(gameboard[row_tmp][j] == player){ if(row_tmp == m_height - 1){ check_win ++; break; }else{ row_tmp ++; check_win ++; } }else{ break; } } } if (check_win == 4){ return true; }else{ return false; } } bool field::check_draw() { for (int i = 0; i < m_width; ++i) { if(gameboard[0][i] == '.'){ return false; } } return true; } void field::print() { for (int j = 0; j < m_height; ++j) { for (int i = 0; i < m_width; ++i) { cout << gameboard[j][i]; } cout << j + 1; cout << endl; } for (int k = 0; k < m_width; ++k) { cout << k + 1; } cout << endl; } ComputerPlayer::ComputerPlayer() { srand((unsigned)time(NULL)); } int HumanPlayer::playTurn(int max) { int column; cout << "Welche Spalte soll die Muenze eingeworfen werden: 1-" << max << endl; cin >> column; return column; } int ComputerPlayer::playTurn(int max) { return rand() % max + 1; } =============== connect4.cpp ============= #include #include "players.h" using namespace std; int main() { int height, width, gamemode, turn; bool check_win = false; bool check_turn = false; cout << "Height: " << endl; cin >> height; cout << "Width: " << endl; cin >> width; cout << "Gamemode:" << endl << "1 = Player vs Player" << endl << "2 = Player vs Computer" << endl << "3 = Computer vs Computer" << endl; cin >> gamemode; field *GameBoard = new field (height, width); player *Player1; player *Player2; switch (gamemode){ case 1: Player1 = new HumanPlayer(); Player2 = new HumanPlayer(); break; case 2: Player1 = new HumanPlayer(); Player2 = new ComputerPlayer(); break; default: Player1 = new ComputerPlayer(); Player2 = new ComputerPlayer(); break; } while (!check_win) { check_turn = false; GameBoard->print(); while(!check_turn) { turn = Player1->playTurn(width); check_turn = GameBoard->setTurn('X', turn); } if(GameBoard->check_win('X', turn)) { check_win = true; GameBoard->print(); cout << "Player 1 wins!" << endl; } if(GameBoard->check_draw()){ check_win = true; GameBoard->print(); cout << "It's a draw" << endl; } if(!check_win){ GameBoard->print(); check_turn = false; while(!check_turn){ turn = Player2->playTurn(width); check_turn = GameBoard->setTurn('O', turn); } if(GameBoard->check_draw()){ check_win = true; GameBoard->print(); cout << "It's a draw" << endl; } if(GameBoard->check_win('O', turn)) { check_win = true; GameBoard->print(); cout << "Player 2 wins!" << endl; } } } delete Player1; delete Player2; delete GameBoard; return 0; }