#include \n#include \n\nusing namespace std;\n\nclass TicTacToe {\nprivate:\n int boardSize;\n vector<vector> board;\n char userPiece;\n char computerPiece;\n\npublic:\n TicTacToe(int size) {\n boardSize = size;\n board.resize(boardSize, vector(boardSize, ''));\n }\n\n void setUserPiece(char piece) {\n userPiece = piece;\n computerPiece = (userPiece == 'X') ? 'O' : 'X';\n }\n\n void printBoard() {\n for (int i = 0; i < boardSize; i++) {\n for (int j = 0; j < boardSize; j++) {\n cout << board[i][j] << " ";\n }\n cout << endl;\n }\n }\n\n bool isBoardFull() {\n for (int i = 0; i < boardSize; i++) {\n for (int j = 0; j < boardSize; j++) {\n if (board[i][j] == '') {\n return false;\n }\n }\n }\n return true;\n }\n\n bool isWin(char piece) {\n // Check rows\n for (int i = 0; i < boardSize; i++) {\n bool win = true;\n for (int j = 0; j < boardSize; j++) {\n if (board[i][j] != piece) {\n win = false;\n break;\n }\n }\n if (win) {\n return true;\n }\n }\n\n // Check columns\n for (int i = 0; i < boardSize; i++) {\n bool win = true;\n for (int j = 0; j < boardSize; j++) {\n if (board[j][i] != piece) {\n win = false;\n break;\n }\n }\n if (win) {\n return true;\n }\n }\n\n // Check diagonals\n bool win = true;\n for (int i = 0; i < boardSize; i++) {\n if (board[i][i] != piece) {\n win = false;\n break;\n }\n }\n if (win) {\n return true;\n }\n\n win = true;\n for (int i = 0; i < boardSize; i++) {\n if (board[i][boardSize - 1 - i] != piece) {\n win = false;\n break;\n }\n }\n if (win) {\n return true;\n }\n\n return false;\n }\n\n int evaluatePosition(char piece) {\n char opponentPiece = (piece == 'X') ? 'O' : 'X';\n int score = 0;\n\n // Check rows\n for (int i = 0; i < boardSize; i++) {\n int countPlayer = 0;\n int countOpponent = 0;\n for (int j = 0; j < boardSize; j++) {\n if (board[i][j] == piece) {\n countPlayer++;\n } else if (board[i][j] == opponentPiece) {\n countOpponent++;\n }\n }\n if (countPlayer == boardSize) {\n score += 50; // Player wins\n } else if (countOpponent == boardSize) {\n score += 25; // Opponent wins\n } else if (countPlayer == boardSize - 1 && countOpponent == 0) {\n score += 10; // Player has 1 empty spot in a row\n } else if (countOpponent == boardSize - 1 && countPlayer == 0) {\n score += 8; // Opponent has 1 empty spot in a row\n } else if (countPlayer == 0 && countOpponent == 0) {\n score += 4; // All spots are empty\n }\n }\n\n // Check columns\n for (int i = 0; i < boardSize; i++) {\n int countPlayer = 0;\n int countOpponent = 0;\n for (int j = 0; j < boardSize; j++) {\n if (board[j][i] == piece) {\n countPlayer++;\n } else if (board[j][i] == opponentPiece) {\n countOpponent++;\n }\n }\n if (countPlayer == boardSize) {\n score += 50; // Player wins\n } else if (countOpponent == boardSize) {\n score += 25; // Opponent wins\n } else if (countPlayer == boardSize - 1 && countOpponent == 0) {\n score += 10; // Player has 1 empty spot in a column\n } else if (countOpponent == boardSize - 1 && countPlayer == 0) {\n score += 8; // Opponent has 1 empty spot in a column\n } else if (countPlayer == 0 && countOpponent == 0) {\n score += 4; // All spots are empty\n }\n }\n\n // Check diagonals\n int countPlayer1 = 0;\n int countOpponent1 = 0;\n for (int i = 0; i < boardSize; i++) {\n if (board[i][i] == piece) {\n countPlayer1++;\n } else if (board[i][i] == opponentPiece) {\n countOpponent1++;\n }\n }\n if (countPlayer1 == boardSize) {\n score += 50; // Player wins\n } else if (countOpponent1 == boardSize) {\n score += 25; // Opponent wins\n } else if (countPlayer1 == boardSize - 1 && countOpponent1 == 0) {\n score += 10; // Player has 1 empty spot in a diagonal\n } else if (countOpponent1 == boardSize - 1 && countPlayer1 == 0) {\n score += 8; // Opponent has 1 empty spot in a diagonal\n } else if (countPlayer1 == 0 && countOpponent1 == 0) {\n score += 4; // All spots are empty\n }\n\n int countPlayer2 = 0;\n int countOpponent2 = 0;\n for (int i = 0; i < boardSize; i++) {\n if (board[i][boardSize - 1 - i] == piece) {\n countPlayer2++;\n } else if (board[i][boardSize - 1 - i] == opponentPiece) {\n countOpponent2++;\n }\n }\n if (countPlayer2 == boardSize) {\n score += 50; // Player wins\n } else if (countOpponent2 == boardSize) {\n score += 25; // Opponent wins\n } else if (countPlayer2 == boardSize - 1 && countOpponent2 == 0) {\n score += 10; // Player has 1 empty spot in a diagonal\n } else if (countOpponent2 == boardSize - 1 && countPlayer2 == 0) {\n score += 8; // Opponent has 1 empty spot in a diagonal\n } else if (countPlayer2 == 0 && countOpponent2 == 0) {\n score += 4; // All spots are empty\n }\n\n return score;\n }\n\n void makeMove(int row, int col, char piece) {\n board[row][col] = piece;\n }\n\n void computerMove() {\n int bestScore = -1;\n int bestRow = -1;\n int bestCol = -1;\n\n for (int i = 0; i < boardSize; i++) {\n for (int j = 0; j < boardSize; j++) {\n if (board[i][j] == '') {\n board[i][j] = computerPiece;\n int score = evaluatePosition(computerPiece);\n if (score > bestScore) {\n bestScore = score;\n bestRow = i;\n bestCol = j;\n }\n board[i][j] = '';\n }\n }\n }\n\n makeMove(bestRow, bestCol, computerPiece);\n }\n\n void play() {\n cout << "Welcome to Tic Tac Toe!" << endl;\n cout << "Enter the board size: ";\n cin >> boardSize;\n TicTacToe game(boardSize);\n\n cout << "Choose your piece (X/O): ";\n cin >> userPiece;\n game.setUserPiece(userPiece);\n\n bool userTurn = true;\n\n while (!game.isBoardFull()) {\n if (userTurn) {\n cout << "Your turn!" << endl;\n game.printBoard();\n\n int row, col;\n cout << "Enter the row (1-" << boardSize << "): ";\n cin >> row;\n cout << "Enter the column (1-" << boardSize << "): ";\n cin >> col;\n\n if (row < 1 || row > boardSize || col < 1 || col > boardSize || game.board[row - 1][col - 1] != '*') {\n cout << "Invalid move! Try again." << endl;\n continue;\n }\n\n game.makeMove(row - 1, col - 1, userPiece);\n\n if (game.isWin(userPiece)) {\n cout << "Congratulations! You win!" << endl;\n game.printBoard();\n break;\n }\n\n userTurn = false;\n } else {\n cout << "Computer's turn!" << endl;\n game.computerMove();\n\n if (game.isWin(computerPiece)) {\n cout << "Oops! Computer wins!" << endl;\n game.printBoard();\n break;\n }\n\n userTurn = true;\n }\n }\n\n if (game.isBoardFull() && !game.isWin(userPiece) && !game.isWin(computerPiece)) {\n cout << "It's a tie!" << endl;\n game.printBoard();\n }\n }\n};\n\nint main() {\n TicTacToe game(3);\n game.play();\n\n return 0;\n

C++ 井字棋游戏:人机对战 - 代码实现与优化

原文地址: https://www.cveoy.top/t/topic/qp2H 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录