一、两人井字棋游戏

在井字游戏中,两个玩家使用各自的标志(一方用 X 则另一方就用 O ),轮流标记 3 ×3 的网格中的某个空格。当一个玩家在网格的水平方向、垂直方向或者对角线方向上标记了三个相同的 X 或三个相同的 O 时,游戏结束,该玩家获胜。平局(没有赢家)是指当网格中所有的空格都被填满时没有玩家获胜的情况。

完整代码来自这篇博客:

Java 井字游戏_Sun Tech的博客-CSDN博客_java 井字游戏创建一个玩井字游戏的程序。程序提示两个玩家交替输入 X 和 O 标记。当输入一个标记时,程序在控制台上重新显示棋盘,然后确定游戏的状态(是获胜、平局还是继续)。https://blog.csdn.net/baidu_34431530/article/details/100133846

import java.util.Scanner;
public class Game {private static Scanner input = new Scanner(System.in);public static void main(String[] args) {char[][] board = new char[3][3];displayBoard(board);while (true) {makeAMove(board, 'X');displayBoard(board);if (isWon('X', board)) {System.out.println("玩家 X 获胜");System.exit(1);}else if (isDraw(board)) {System.out.println("平局");System.exit(2);}makeAMove(board, 'O');displayBoard(board);if (isWon('O', board)) {System.out.println("玩家 O 获胜");System.exit(3);}else if (isDraw(board)) {System.out.println("平局");System.exit(4);}}}private static void makeAMove(char[][] board, char player) {boolean done = false;do {System.out.print("玩家 " + player + " :(行,列) = ");int row = input.nextInt();int column = input.nextInt();if (board[row][column] == '\0') {board[row][column] = player;done = true;}elseSystem.out.println("无效输入");}while (!done);}private static void displayBoard(char[][] board) {System.out.println("\n ——— ——— ———");for (int i = 0; i < 3; i++) {System.out.print("| ");for (int j = 0; j < 3; j++)System.out.print(board[i][j] != '\0' ?  board[i][j] + " | ": "  | ");System.out.println("\n ——— ——— ———");}}private static boolean isWon(char ch, char[][] board) {for (int i = 0; i < 3; i++)if (ch == board[i][0] && ch == board[i][1] && ch == board[i][2])return true;for (int j = 0; j < 3; j++)if (ch == board[0][j] && ch == board[1][j] && ch == board[2][j])return true;if (ch == board[0][0] && ch == board[1][1] && ch == board[2][2])return true;return ch == board[0][2] && ch == board[1][1] && ch == board[2][0];}private static boolean isDraw(char[][] board) {for (int i = 0; i < 3; i++)for (int j = 0; j < 3; j++)if (board[i][j] == '\0')return false;return true;}
}

二、多人井字棋游戏

今天我们要做的就是对其进行创新。新增规则如下:

(1)支持3~10人同时玩游戏。棋盘大小为玩家人数+1

(2)游戏开始前,设定游戏获胜需要多少个连续的棋子,连续棋子的个数最少为3,最大为玩家人数+1(即棋盘的大小)

代码

设计了3个类

1. Board 类

package com.tictactoe;public class Board {private char[][] board ;//创建棋盘//Done!public void createBoard(int size){board = new char[size][size];  //创建初始棋盘,棋子默认为空}//绘制棋盘//Done!public void drawBoard(int size){for(int i=0; i< size; i++){  //最上面的线System.out.print(" ———");}System.out.print("\n");for (int i = 0; i < size; i++) { //每一列System.out.print("| ");for (int j = 0; j < size; j++)System.out.print(board[i][j] != '\0' ?  board[i][j] + " | ": "  | ");System.out.print("\n");for(int k=0; k< size; k++){  //最下面的线System.out.print(" ———");}System.out.print("\n");}System.out.print("\n");}//玩家下棋后,改变棋盘数组board//Done!public void changeBoard(int row,int column,char player){board[row][column]=player;}//查看棋盘//Done!public char[][] getBoard() {return board;}
}

棋盘类中没有什么难点。主要就是创建一个二维char类型的空棋盘、在控制台画出棋盘和已有的棋子、改变棋盘等操作。

2. GameLogic 类(难点!)

package com.tictactoe;
import java.util.Scanner;public class GameLogic {private static Scanner input = new Scanner(System.in);//玩家下一个棋子,改变棋盘布局//Done!public void makeAMove(Board board, char player) {char[][] board2 = board.getBoard();     //获取棋盘目前状态boolean done = false;  //用来判断循环,用户第一次输入的是正确位置就一次循环;否则进入下一次do {System.out.print("玩家 " + player + " :(行,列) = ");int row = input.nextInt();  //玩家输入棋子的行数int column = input.nextInt();  //玩家输入棋子的列数if (board2[row][column] == '\0') {board.changeBoard(row,column,player);  //玩家成功下了一棋!done = true;  //有位置就放下,跳出这个循环}elseSystem.out.println("无效输入");  //玩家选择的位置已经有棋子了,重新下}while (!done);}//判断player是否赢了,返回true为赢//思路:仿照卷积核进行卷积的过程public boolean isWon(char player, Board board,int piece,int size) {char[][] board2 = board.getBoard();     //获取棋盘目前状态for(int row=0; row<=size-piece;row++){for(int col=0;col<=size-piece;col++){/*-----------------以piece×piece为大小的内部检查-------------*///行相同for(int i=row;i<row+piece;i++){for(int j=col;j<col+piece;j++){if(player==board2[i][j]){if(j==col+piece-1) return true; //找到满足条件的行}else break;  //这一行不满足,跳出内循环,检查下一行}}//列相同for(int j=col;j<col+piece;j++){for(int i=row;i<row+piece;i++){if(player==board2[i][j]){if(i==row+piece-1) return true; //找到满足条件的列}else break; //这一列不满足,检查下一列}}//正对角线相同for(int k=0;k<piece;k++){if(player==board2[row+k][col+k]){if(row+k==row+piece-1) return true; //找到满足条件的正对角线}else break; //正对角线不满足}//负对角线int row2=row+piece-1;int col2=col;for(int k=0;k<piece;k++){if(player==board2[row2-k][col2+k]){if(row2-k==row) return true; //找到满足条件的副对角线}else break; //负对角线不满足}}}return false;}//判断是否平局:返回false为否,返回true为平局//Done!public boolean isDraw(Board board,int size) {char [][]board2 = board.getBoard();for (int i = 0; i < size; i++)for (int j = 0; j < size; j++)if (board2[i][j] == '\0')return false; //棋盘存在空白,未平局return true;}
}

makeAMove()方法较容易理解,一行一行看下来基本上就知道逻辑了,注释也都写得很清晰。

难点在于isWon()方法,即对player是否获胜的判断。这里利用的是卷积核的思想(不懂可以去搜“卷积神经网络”)。我们假设玩家人数为n(那么棋盘大小就是n+1),玩家规定连续m个棋子赢得游戏。那么我们就可以把棋盘看成一张(n+1)×(n+1)大小的图像,卷积核大小是m×m。在m×m大小的区域内,检查行、列、主对角线、副对角线是否有连续相同的,一旦有一种情况满足条件,立刻返回true。

isDraw()方法:判断是否平局。棋盘都下满了就是平局,所以关键在于判断棋盘满了没有。

3. tictactoe2 类

package com.tictactoe;import java.util.Scanner;public class tictactoe2 {private static Scanner input = new Scanner(System.in);public static void main(String[] args) {/*--------输入玩家人数、输入连续棋子的个数------*/System.out.println("请输入玩家的个数(3~10人):");int player_num = input.nextInt();System.out.println("请输入赢家连续棋子的个数(最少为3,最大为玩家人数+1):");int piece_num = input.nextInt();/*-------------初始化棋盘---------------*/int size = player_num + 1; //棋盘的大小Board board = new Board();board.createBoard(size); //创建棋盘board.drawBoard(size); //绘制初始棋盘/*-------------初始化玩家------------*/char player[] = new char[player_num];for(int i=0; i<player_num;i++){int temp = 97+i;  //准备由int向char进行转换player[i]= (char) temp;  //用字母a~j表示0号~9号玩家(根据题目要求,最多10人,第10人为j)}/*--------------开始下棋-------------*/GameLogic logic = new GameLogic();int play_i=0; //从0号玩家开始while (true) {logic.makeAMove(board,player[play_i]);  //下棋,更新棋盘board.drawBoard(size); //绘制新棋盘if (logic.isWon(player[play_i], board,piece_num,size)) {  //判断第i号玩家是否获胜System.out.println("玩家"+player[play_i]+"获胜");System.exit(1);}else if (logic.isDraw(board,size)) {  //判断是否平局System.out.println("平局");System.exit(2);}if(play_i<player_num-1){play_i++; //下一个玩家}else {play_i=0;  //又轮到0号玩家}}}}

这里稍微难一点的地方有两点。

1)利用int类型向char类型的转换,把1~10号玩家分别用字母a~j去表示。

2)另一个难点在于如何实现玩家轮着下棋。重点看play_i这个变量就明白了

4. 玩法示例

(1)示例1

(2)平局示例

5. 总结

(1)对类的封装还不是太好,如果再写一个player类,程序的封装性就更好了

(2)学习了Sanner的使用。主要就是四个函数。

【java】井字棋游戏 多人版哦相关推荐

  1. C++游戏game | 井字棋游戏坤坤版(配资源+视频)【赋源码,双人对战】

    博主主页:Yu·仙笙

  2. java——博弈算法实现井字棋游戏

    通过java语言开发了一个简单的井字棋游戏.主要有6个类,其中有一个是主类(Main.java),一个是抽象类(PiecesMove.java)组成. 下面对各个类简单介绍一下: TicTicToe. ...

  3. java 井字棋 人机_一个井字棋tictactoe游戏的java实现 | Soo Smart!

    这是一个井字棋游戏的java实现.摘录于stackoverflow. 游戏规则很简单,只要一方棋子在水平线,垂直线或者对角线任意一条线上排列成功即为获胜. 作者原先的代码存在着一些问题: 代码如下: ...

  4. java井字棋ai_JavaScript实现一个带AI的井字棋游戏源码

    JavaScript实现一个带AI的井字棋游戏源码 发布时间:2020-09-05 00:56:12 来源:脚本之家 阅读:100 作者:小楼夜听雨QAQ 最近有一门课结束了,需要做一个井字棋的游戏, ...

  5. C++井字棋游戏,DOS界面版

    据说有一个能保证不败的算法.明天看看先再写个PVC版的. 正题.今天无聊写了个井字棋游戏,顺便逐渐让自己习惯良好的代码风格,放上来给新手学习学习. jzq2.cpp /*N字棋游戏PVP版,DOS版本 ...

  6. python井字棋ai_[Python100行系列]-井字棋游戏

    博客:Hzy的博客 | Hzy Blog​hzeyuan.cn一些学习python的小项目,小游戏.python小项目​github.com 话不多说,今天尝试用turtle库来写一个井字棋游戏.1. ...

  7. 采用α-β算法实现井字棋游戏

    题目描述 (1)图形化界面. (2)随机选取先手后手. (3)可以人-计算机或计算机-计算机 界面效果 算法 基本思想 Max-Min算法: 采用Max-Min算法进行对抗搜索,Max和Min双方均要 ...

  8. C++实现的基于α-β剪枝算法的井字棋游戏

    "井字棋"游戏(又叫"三子棋"),是一款十分经典的益智小游戏,操作简单,娱乐性强.两个玩家,一个打圈(O),一个打叉(X),轮流在3乘3的格上打自己的符号,最先 ...

  9. [文档和源码分享]C++实现的基于α-β剪枝算法的井字棋游戏

    "井字棋"游戏(又叫"三子棋"),是一款十分经典的益智小游戏,操作简单,娱乐性强.两个玩家,一个打圈(O),一个打叉(X),轮流在3乘3的格上打自己的符号,最先 ...

  10. python井字棋_[Python100行系列]-井字棋游戏

    博客:Hzy的博客 | Hzy Blog​hzeyuan.cn一些学习python的小项目,小游戏.python小项目​github.com 话不多说,今天尝试用turtle库来写一个井字棋游戏.1. ...

最新文章

  1. opencv 人脸检测
  2. 一张图解决Android Studio 项目运行按钮灰色
  3. 表格过滤器_气缸选型其实并不复杂,知道这些再也不怕选错气缸(附计算表格)...
  4. 《SolidWorks 2013中文版机械设计从入门到精通》一1.4 操作环境设置
  5. MongoDB和Elasticsearch的各使用场景对比
  6. 计算机专业中职好就业不,内江计算机专业中职好不好
  7. cc2530设计性实验代码八
  8. 小米9se刷机,miui12.5.1降级miui11.0.5,救砖,magisk面具,viper音效-刷红米6
  9. Tomcat,jsp中文乱码问题解决
  10. beyond compare 注册表删除
  11. Altium Designer 18中查找元器件的四种方法
  12. SFP光模块的多模和单模区别
  13. matlab矩阵size,matlab中size函数用法
  14. 编程题目3——中国大学mooc(这篇博客更新完毕)
  15. QT Creator4.3制作图标
  16. 反汇编---汇编基础学习
  17. ApplePay对接java后台详细代码
  18. 第一章踏上python之旅_神界之唯我逍遥
  19. 做到30条业绩翻十倍
  20. 计算机操作员初级试题及答案,计算机操作员初级考试试题

热门文章

  1. 没有计算机的一天英语作文带翻译,美好的一天糟糕的一天英语作文带翻译
  2. MySQL 查询语句返回某字段出现超过1次的所有记录
  3. linux crontab每小时运行一次
  4. 科技风UI除了蓝色,还有什么配色选择?
  5. Scrapy: 爬虫返回403错误
  6. 聚焦 | 今年,金山云不一样的除夕夜
  7. a+aa+aaa+......+a......a(n个a)之和
  8. IDEACPU占用100%_卡顿 解决办法
  9. 小米笔记本Air13.3加装固态硬盘
  10. 2021南京扬子中学高考成绩查询,2021年南京高考各高中成绩及本科升学率数据排名及分析...