当前位置: 首页 > news >正文

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过程中的一些个人体会总结和借鉴,如有不当、错误的地方,请各位大佬批评指正,定当努力改正,如有侵权请联系作者删帖。)

http://www.xdnf.cn/news/364393.html

相关文章:

  • 【二】CURL命令解析
  • 报错 <pcl/features/feature_evaluation/feature_evaluation_framework.h> 不存在的解决办法
  • Java中的控制流语句:if、switch、for、foreach、while、do-while
  • Redis 8.0携新功能,重新开源
  • 【Unity】Unity中修改网格的大小和倾斜网格
  • 如何解决Jmeter中的乱码问题?
  • 【PHP】基于币安链,一个完整的USDT转账示例
  • 【python】 python拆包
  • 【QT】项目打包与发布安装
  • 图灵爬虫练习平台第七题千山鸟飞绝js逆向
  • 宠物医院预约|基于Java+vue的宠物医院预约平台系统(源码+数据库+文档)
  • windows celery OSError: [WinError 6] 句柄无效
  • ELF-如何学习
  • C++(1):整数常量
  • Mysql存储引擎
  • 期刊论文写作注意点
  • LVGL源码学习之渲染、更新过程(1)---标记和激活
  • 【C/C++】为什么要noexcept
  • 机器学习第二讲:对比传统编程:解决复杂规则场景
  • 机器学习实操 第二部分 第19章 大规模训练和部署 TensorFlow 模型
  • RPG11.创建玩家Ability类
  • 基于CNN的猫狗图像分类系统
  • 推荐系统(二十五):基于阿里DIN(Deep Interest Network)的CTR模型实现
  • SpringCloud的作用
  • Java高频基础面试题
  • EMC|AC/DC转换器ESD静电防护
  • The 2024 ICPC Kunming Invitational Contest G. Be Positive
  • 【Python-Day 11】列表入门:Python 中最灵活的数据容器 (创建、索引、切片)
  • 【Spring】手动创建Spring|Boot项目
  • 【Golang】gin框架动态更新路由