int MovePlayer(BNTPlayer player, BNTField field, BNTBoard board) { if (player == BNTPlayerNone) { printf("Could not make the move: error -1"); return -1; } if (IsBoardFull(board)) { printf("Could not make the move: error -2"); return -2; } if (NextPlayer(board) != player) { printf("Could not make the move: error -3"); return -3; } if (board[field.x][field.y] == BNTPlayerO || board[field.x][field.y] == BNTPlayerX) { printf("Could not make the move: error -4"); return -4; } if (IsGameEnd(board)) { printf("Could not make the move: error -5"); return -5; } board[field.x][field.y] = player; return 1; }
int IsGameEnd(BNTBoard board) { if (IsBoardFull(board)) { return 1; } return WinningPlayer(board) != BNTPlayerNone; }
BNTPlayer NextPlayer(BNTBoard board) { int countX = 0; int countO = 0; for (int i = 0; i < BOARD_SIZE; ++i) { for (int j = 0; j < BOARD_SIZE; ++j) { if (board[i][j] == BNTPlayerX) { ++countX; } if (board[i][j] == BNTPlayerO) { ++countO; } } } if (IsBoardFull(board)) { return BNTPlayerNone; } if (IsGameEnd(board)) { return BNTPlayerNone; } if (countX > countO) { return BNTPlayerO; } return BNTPlayerX; }
Controller::Controller(Settings* settings) { this->settings = settings; board = new Board(settings->columns, settings->rows); boardPanel = new BoardPanel(); switch (settings->gameType) { case 1: playerA = new Human(settings->playerA, 'O'); playerB = new Human(settings->playerB, 'X'); break; case 2: playerA = new Human(settings->playerA, 'O'); playerB = new Ai(settings->playerB, 'X', board); break; case 3: playerA = new Ai(settings->playerA, 'O', board); playerB = new Ai(settings->playerB, 'X', board); break; case 4: playerA = new Human(settings->playerA, 'O'); playerB = new Remote(settings->playerB, 'X', true); break; case 5: playerA = new Ai(settings->playerA, 'O', board); playerB = new Remote(settings->playerB, 'X', true); break; default: break; } Player* currentPlayer = playerA; if (settings->startingPlayer == 1) currentPlayer = playerB; int xMove = 0, yMove = 0; bool draw = false; while (!CalculateWin(xMove, yMove)) { if (currentPlayer == playerA) currentPlayer = playerB; else currentPlayer = playerA; do { system("cls"); boardPanel->DrawField((*board)); xMove = currentPlayer->GetMove(); } while (!IsValideMove(xMove)); yMove = board->SetSquare(xMove, currentPlayer->symbol); boardPanel->DrawLastMove(xMove, yMove); try{ IsBoardFull(); } catch (BoardFullException exception){ std::cout << exception.errorMsg << std::endl; draw = true; break; } } if (!draw) { system("cls"); boardPanel->DrawField((*board)); PrintText("Player " + currentPlayer->name + " Wins!"); } system("pause"); }