JAVA学习-练习试用Java实现“一个游戏AI :如井字游戏(Tic-Tac-Toe)的AI对手”
问题:
java语言编辑,实现一个游戏AI :如井字游戏(Tic-Tac-Toe)的AI对手。
解答思路:
实现一个井字游戏的AI对手可以通过简单的策略来完成。以下是使用Java语言实现的一个简单的井字游戏AI的示例代码。该AI使用最小-最大算法和α-β剪枝来决定其移动。
import java.util.Scanner;public class TicTacToeAI {private static final char EMPTY = ' ';private static final char HUMAN = 'X';private static final char AI = 'O';public static void main(String[] args) {char[][] board = new char[3][3];initializeBoard(board);Scanner scanner = new Scanner(System.in);while (true) {printBoard(board);System.out.println("Enter your move (row and column separated by space): ");int row = scanner.nextInt() - 1;int col = scanner.nextInt() - 1;if (isValidMove(board, row, col)) {makeMove(board, row, col, HUMAN);if (isGameOver(board)) {printBoard(board);System.out.println("Game over. You lose!");break;}int[] bestMove = minimax(board, Integer.MIN_VALUE, Integer.MAX_VALUE, true);makeMove(board, bestMove[0], bestMove[1], AI);if (isGameOver(board)) {printBoard(board);System.out.println("Game over. You win!");break;}} else {System.out.println("Invalid move. Try again.");}}scanner.close();}private static void initializeBoard(char[][] board) {for (int i = 0; i < board.length; i++) {for (int j = 0; j < board[i].length; j++) {board[i][j] = EMPTY;}}}private static void printBoard(char[][] board) {for (int i = 0; i < board.length; i++) {for (int j = 0; j < board[i].length; j++) {System.out.print(board[i][j] + " ");}System.out.println();}}private static boolean isValidMove(char[][] board, int row, int col) {return row >= 0 && row < board.length && col >= 0 && col < board[row].length && board[row][col] == EMPTY;}private static void makeMove(char[][] board, int row, int col, char player) {board[row][col] = player;}private static boolean isGameOver(char[][] board) {return hasWinner(board, HUMAN) || hasWinner(board, AI) || isBoardFull(board);}private static boolean hasWinner(char[][] board, char player) {// Check rows, columns and diagonals for a winfor (int i = 0; i < board.length; i++) {if (board[i][0] == player && board[i][1] == player && board[i][2] == player) {return true;}if (board[0][i] == player && board[1][i] == player && board[2][i] == player) {return true;}}if (board[0][0] == player && board[1][1] == player && board[2][2] == player) {return true;}if (board[0][2] == player && board[1][1] == player && board[2][0] == player) {return true;}return false;}private static boolean isBoardFull(char[][] board) {for (int i = 0; i < board.length; i++) {for (int j = 0; j < board[i].length; j++) {if (board[i][j] == EMPTY) {return false;}}}return true;}private static int evaluate(char[][] board) {if (hasWinner(board, HUMAN)) {return -1;} else if (hasWinner(board, AI)) {return 1;} else {return 0;}}private static int[] minimax(char[][] board, int alpha, int beta, boolean isMaximizingPlayer) {int score = evaluate(board);if (score == -1 || score == 1 || isBoardFull(board)) {return new int[]{score};}if (isMaximizingPlayer) {int bestScore = Integer.MIN_VALUE;int[] bestMove = new int[]{-1, -1};for (int i = 0; i < board.length; i++) {for (int j = 0; j < board[i].length; j++) {if (board[i][j] == EMPTY) {board[i][j] = AI;int[] moveScore = minimax(board, alpha, beta, false);board[i][j] = EMPTY;moveScore[0] += score;if (moveScore[0] > bestScore) {bestScore = moveScore[0];bestMove[0] = i;bestMove[1] = j;}alpha = Math.max(alpha, bestScore);if (beta <= alpha) {break;}}}}return bestMove;} else {int bestScore = Integer.MAX_VALUE;int[] bestMove = new int[]{-1, -1};for (int i = 0; i < board.length; i++) {for (int j = 0; j < board[i].length; j++) {if (board[i][j] == EMPTY) {board[i][j] = HUMAN;int[] moveScore = minimax(board, alpha, beta, true);board[i][j] = EMPTY;moveScore[0] += score;if (moveScore[0] < bestScore) {bestScore = moveScore[0];bestMove[0] = i;bestMove[1] = j;}beta = Math.min(beta, bestScore);if (beta <= alpha) {break;}}}}return bestMove;}}}
在这个代码中,我们定义了一个简单的井字游戏AI。以下是代码的要点:
1. 'initializeBoard'函数初始化游戏板。
2. 'printBoard'函数打印当前游戏板的状态。
3. 'isValidMove'函数检查玩家输入的移动是否有效。
4. 'makeMove'函数在游戏板上执行玩家的移动。
5. 'isGameOver'函数检查游戏是否结束(有人获胜或棋盘已满)。
6. 'hasWinner'函数检查是否有玩家获胜。
7. 'evaluate'函数评估当前游戏板的状态,返回获胜玩家的分数。
8. 'minimax'函数实现最小-最大算法,并使用α-β剪枝优化搜索。
当运行这个程序时,它会提示用户输入他们的移动。AI将尝试做出最佳回应。这个AI对手相当简单,但它能够使用策略来击败大多数随机玩家。
(文章为作者在学习java过程中的一些个人体会总结和借鉴,如有不当、错误的地方,请各位大佬批评指正,定当努力改正,如有侵权请联系作者删帖。)