如何在Java中编码TIC-TAC-TOE游戏

Java教程 2025-08-28

学习编码有时会感到沮丧,但是将其变成游戏可以使过程更容易处理。

游戏体验的一种好方法是编码简单的游戏。初学者通常从类似的项目开始:

  • 一个数字猜测游戏

  • 岩纸剪裁

  • 蛇或cent

  • 太空入侵者

  • 跳棋或国际象棋

TIC-TAC-TOE位于此难度范围的中间。如果您可以构建数字猜测者或岩纸剪裁游戏,即使它更具挑战性,您就可以在Java进行TIC-TAC-TOE。

虽然它不像Checkers或Checkess那样复杂,但建立TIC-TAC-TOE教授有关多维阵列,异常处理和流量控制的有价值的课程。当您继续进行更大,更复杂的棋盘游戏时,这些技能将很有用。

如何编码Java TIC-TAC-TOE游戏

要编码Java Tic-TAC-TOE程序,我们将遵循以下八个步骤,使我们能够逐步朝着完成游戏的目标迈进:

  1. 创建一个可运行的Java类,称为TicTacToe

  2. 声明所有必需的变量。

  3. 打印一个基本的TIC-TAC-TOE板。

  4. 从两个播放器中获取用户输入。

  5. 检查获胜的比赛。

  6. 如果没有赢得比赛,请切换玩家。

  7. 如果采用所有正方形,则结束游戏。

  8. 运行Java TIC-TAC-TOE应用程序。

步骤1:创建Tictactoe Java类

首先,创建一个名为TicTacToe的类,该类具有可运行的主方法,如下所示。

此示例中的所有代码都在TicTacToe类的主要方法中,或声明为本类的一部分的内部方法。可选地,您可以在JSHELL中运行此示例,我总是建议您学习Java和快速原型。

 / *用Java编码的TIC TAC TOE游戏 */公共类Tictactoe {public static void main(string [] args){}}}

步骤2:声明所需的变量

TIC-TAC-TOE板有9个正方形。在我们的游戏中,我们显示每个未选择的广场的数量,并询问播放器要标记哪个正方形。

板的每个元素[]阵列代表游戏板上的位置。

 char [] board = {'1','2','3','4','4','5','6','7','8','9'};

我们还需要跟踪转弯的转弯以及弹奏了多少个正方形。如果所有九个正方形都没有赢家,比赛就以平局结束。

 var Numberofsquaresplayed = 0; var whoseternitis ='x';

为此,我们从一个符合数字1-9的字符阵列开始,如:

步骤3:打印出TIC-TAC-TOE板

每次选择正方形时,我们都会重新绘制董事会。

由于这是一个简单的控制台游戏,因此板的显示并不复杂。它看起来像下面的图片:

在游戏过程中,玩家选择了一个空位数。

我们输入逻辑以生成和打印出Java TIC-TAC-toe游戏板,以名为printTheBoard()的方法

私有静态空隙printtheboard(char []板){系统。 out .println(板[0] +“ | ” +板[1] +“ | ” +板[2]);系统。 out .println( “  -  +  -  +  - ” );系统。 out .println(板[3] +“ | ” +板[4] +“ | ” +板[5]);系统。 out .println( “  -  +  -  +  - ” );系统。 out .println(board [6] +“ | ” +板[7] +“ | ” +板[8]);}

首先绘制板时,它仅显示数字:

 1 | 2 | 3 -  +  -  +  - 4 | 5 | 6 -  +  -  +  - 7 | 8 | 9

随着游戏的进行,董事会将使用X和O更新。完整的TIC-TAC-TOE JAVA战斗看起来像这样:

 X | O | X -  +  -  +  - X | 5 | o -  +  -  +  - x | O | 9

步骤4:获取用户输入

只要numberOfSquaresPlayed小于9,我们向播放器显示板的当前状态,并提示他们选择一个正方形,利用Java的Scanner仪类用于用户输入:

 while(数字播放<9){ printtheboard (board);系统。 Out .printf(“选择一个方形播放器%s:”,Whoseternitis炎); var scanner = new java.util.scanner( System。in ); var input = scanner.nextint();板[Input-1] = Whoseternitis;}

请注意, char数组如何使用X或O更新,具体取决于转弯的转弯。

董事会[INPUT-1] = WHOSETRERSI炎;

由于数组基于零,因此我们从用户提供的数字中减去一个。如果用户选择数字5的正方形,则对应于我们数组中的索引4。

步骤5:检查获胜者

每次用户选择一个正方形时,我们都会检查他们是否完成了一条线并赢得了游戏。

有八种赢得Tic Tac Toe的方法:

  • 三条水平线。

  • 三个垂直线。

  • 两条线穿过广场。

在这种情况下,有条件的逻辑可能会变得丑陋,因为必须根据当前玩家的字母检查潜在的获胜行中的每个正方形。

对第一条水平线的检查可能是这样的:

 if(((板[0] == Whoseternitis)&&(板[1] == Whoseternitis)&&(板[2] == Whoseternitis)){系统。 Out .println(“您赢了!!!恭喜!”);休息;}

需要进行八次检查以检查游戏是否赢得了,这可能会变得丑陋。

另一个选项略微少一些,涉及使用char类型的鲜为人知的功能。

炭是整数类型

很少有人知道这一点,但是Java char实际上是整数类型。您可以像使用INTDouble或Float一样对其进行数学操作。

这意味着您可以在给定的行中添加三个chars ,看看结果是否等于“ x”炭自身三次。如果确实如此,您知道您连续三个“ X” chars 。如果轮到第二个球员,则对“ O” char做同样的事情。

以下逻辑使用CHAR的基于整数的性质来查看给定的行,列或交叉是否已完成:

 if((板[0] +板[1] +板[2] ==(Whoseternitis * 3))//第一行||(板[3] +板[4] +板[4] +板[5] ==(Whoseternitis * 3))//第二行||(木板[6] +板[7] +板[7] +板[8] ==(whoseteritian Is * 3) + boart + boart + boart + boart + boart + boart + boart + board + barbs + board + barbs + barbs + board + board + board + barbs(3) (Whoseternitis * 3)//第一列||(板[1] +板[4] +板[7] ==(Whoseternitis * 3)//第二列(板[2] +板[4] +板[6] ==(Whoseternitis * 3))//第二个对角线){ printtheboard (board);系统。 Out .println(“您赢了!!!恭喜!”); break;} else {numberOfsquaresplayed ++; Whoseternitis =(Whoseternitis =='X')? 'o':'x';}

char上成功执行数学操作的光芒。您可能会在整个职业生涯中享受其余的职业,再也看不到Java char再次使用过这样的Char。

步骤6:开关转

如果我们的条件检查显示了一条线已经完成,我们将祝贺玩家并脱离循环,如上所述:

打印板(板);系统。 Out .println(“您赢了!!!恭喜!”);休息;

如果一排未完成,我们会增加播放正方形的数量和变化转弯。我们与三元操作员一起做到这一点。

 squaresplayed ++; Whoseternitis =(Whoseternitis =='X')? 'o':'x';

Java的条件操作员

三元运算符是一个快捷方式,可根据条件语句的结果简化分配。

我们可以简单地说:

如果(Whoseternitis =='X'){Whoseternitis ='o';} else {Whoseternitis ='X';}

但是,我们使用三元运算符来使语法更精确。

 Whoseternitis =(Whoseternitis =='X')? 'o':'x';

作为新开发人员,我总是不喜欢三元运营商的神秘语法。作为经验丰富的Java开发人员,我仍然不喜欢它,但我更感谢它。

步骤7:处理领带

如果比赛是9次,没有赢家,则循环退出。

在此时间点,我们宣布比赛是一场比赛,并祝贺双方:

 if(numberSquaresplayed == 9){ printtheboard (board);系统。 Out .println(“一场艰苦的战斗为平局而战!”);};}

步骤8:运行TIC-TAC-TOE JAVA游戏

将所有这些代码拉在一起并节省您的更改,并运行Java Tic-Tac-toe游戏。

只要您提供有效的输入并遵循快乐的道路,游戏就会完美地执行。

这是完整的,可运行的TicTacToe Java类编码到这一点:

软件包com.mcnz.vector;公共类Tictactest {public static void main(string [] args){char [] board = {'1','2','2','3','4','4','5','6','7','7',8','8','9'}; var numberOfsquaresplayed = 0; var whoseternitis ='x'; while(数字播放<9){ printtheboard (board);系统。 Out .printf(“选择一个方形播放器%s:”,Whoseternitis炎); var scanner = new java.util.scanner( System。in ); var input = scanner.nextint();董事会[输入-1] = Whoseternitis; if((板[0] +板[1] +板[2] ==(Whoseternitis * 3))//第一行||(板[3] +板[4] +板[4] +板[5] ==(Whoseternitis * 3))//第二行||(木板[6] +板[7] +板[7] +板[8] ==(whoseteritian Is * 3) + boart + boart + boart + boart + boart + boart + boart + board + barbs + board + barbs + barbs + board + board + board + barbs(3) (Whoseternitis * 3)//第一列||(板[1] +板[4] +板[7] ==(Whoseternitis * 3)//第二列(板[2] +板[4] +板[6] ==(Whoseternitis * 3))//第二个对角线){ printtheboard (board);系统。 Out .println(“您赢了!!!恭喜!”);休息; } else {numberOfSquaresplayed ++; Whoseternitis =(Whoseternitis =='X')? 'o':'x'; }}} private static void printtheboard(char []板){系统。 out .printf(“%n%s |%s |%s%n”,董事会[0],董事会[1],董事会[2]);系统。 out .println(“  -  +  -  +  - ”);系统。 out .printf(“%s |%s |%s%n”,董事会[3],董事会[4],董事会[5]);系统。 out .println(“  -  +  -  +  - ”);系统。 out .printf(“%s |%s |%s%n%n”,董事会[6],董事会[7],董事会[8]); }} / * Java Tictactoe游戏的结尾 * /

增强Java TIC-TAC-TOE应用程序

通过实现核心逻辑,您可以通过增强Java TIC-TAC-TOE游戏来推动编程知识。

可能的增强包括以下内容:

  • 验证该用户输入在所需范围内。

  • 执行异常处理以处理运行时错误。

  • 对核心逻辑进行重构为较小的方法。

  • 让游戏继续玩,直到玩家决定退出。

  • 从秋千包装中添加GUI组件。

  • 使用扫描仪类的自动氯糖特征。

  • 使用枚举定义转弯是谁。

  • 使用Java字符串格式化功能进行显示功能。

  • 自动化服务器,因此游戏支持单人游戏模式。

Java TIC-TAC-TOE游戏的源代码

稍微增强的Java Tic-TAC-TOE游戏的完整代码如下。添加自己的增强功能,并进一步推动对Java的了解。

 / * java tic-tac-toe游戏源代码 */软件包com.mcnz.tictactoe; public class tictactoe {public static void main(string [] args [] args){char [char [] board = {'1','2','2','3','3','4','4',5',5',6','7','7'',''''','','''''''''}; var numberOfsquaresplayed = 0; var whoseternitis ='x'; var gameNdendMessage =“”; while(数字播放<9){ printtheboard (board); GetTheusertoselecttheirsquare (董事会,Whoseternitis);如果(他们wontheGame (董事会,Whoseternitis)){gameendendMessage =“您赢了!恭喜!”;休息; } else if(numberOfSquaresplayed == 9){gameendendMessage =“一场艰难的战斗进行了抽奖!”; } else {numberOfSquaresplayed ++; Whoseternitis =(Whoseternitis =='X')? 'o':'x';继续; }} printtheboard (board);系统。 Out .println(gameendendmessage); }私有静态void printtheboard(char []板){系统。 out .printf(“%n%s |%s |%s%n”,董事会[0],董事会[1],董事会[2]);系统。 out .println(“  -  +  -  +  - ”);系统。 out .printf(“%s |%s |%s%n”,董事会[3],董事会[4],董事会[5]);系统。 out .println(“  -  +  -  +  - ”);系统。 out .printf(“%s |%s |%s%n%n”,董事会[6],董事会[7],董事会[8]); }私有静态无效的gettheusertoselecttheirsquare(char []板,char Whoseternitis){do {try {system。 Out .printf(“播放器%s请选择一个未选出的正方形:”,Whoseternitis); var scanner = new java.util.scanner( System。in ); var input = scanner.nextint(); if(字符。Isdigit (board [Input -1])){板[输入-1] = Whoseternitis;休息; } else {系统。 Out .println(“对不起,那是摄取的。”); }} catch(异常E){系统。 Out .println(“出现问题。让我们再试一次。”); }打印板(板); } while(true); }私人静态布尔值HewonTheGame(char []板,char Whoseternitis){return(board [0] +板[1] +板[1] +板[2] ==(Whoseternitis * 3))//第一行|| (板[3] +板[4] +板[5] ==(Whoseternitis * 3))//第二行|| (板[6] +板[7] +板[8] ==(Whoseternitis * 3))//第三行|| (板[0] +板[3] +板[6] ==(Whoseternitis * 3))//第一列|| (板[1] +板[4] +板[7] ==(Whoseternitis * 3))//第二列|| (板[2] +板[5] +板[8] ==(Whoseternitis * 3))//第三列|| (董事会[0] +板[4] +板[8] ==(Whoseternitis * 3))//第一次十字架|| (板[2] +板[4] +板[6] ==(Whoseternitis * 3)); //第二十字}}}