首先我们要知道做一个五子棋游戏的流程。①、用户输入坐标,根据坐标下棋。②判断用户是否赢棋。③如果没有,电脑随机产生坐标,下棋。④、判断电脑是否赢棋。然后就根据这个流程一直循环。

下面看代码,主要有三个类,游戏类,棋盘类,棋子类。我们从最简单的棋子类说起。棋子我们只需要黑棋和白棋,在这里我们使用枚举的方式。构造器传入当前棋子。getChessman()获取当前棋子。

/*** 棋子枚举类*/
public enum  Chessman {WHITE("○"),BLACK("●");private String chessman;/*** 构造器* @param chessman 棋子*/private Chessman(String chessman){this.chessman = chessman;}/*** 获取棋子* @return 返回棋子*/public String getChessman(){return this.chessman;}
}

接下来是棋盘类,直接看代码,代码中都有详细的注释。

/*** 棋盘*/
public class Chessboard {//使用二维数组作为棋盘private String[][] board;//棋盘大小public static final int BOARD_SIZE = 15;/*** 初始化棋盘*/public void initChessboard(){board = new String[BOARD_SIZE][BOARD_SIZE];for (int i = 0; i < board.length; i++){for (int j = 0; j < board[i].length; j++){board[i][j] = "十";}}}/*** 输出棋盘*/public void printBoard(){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();}}/*** 给棋盘位置赋值* @param posX  x坐标* @param posY  y坐标* @param chessman  棋子*/public void setBoard(int posX,int posY,String chessman){this.board[posX][posY] = chessman;}/*** 获取棋盘* @return  返回当前棋盘*/public String[][] getBoard(){return this.board;}
}

最后一个是游戏类。代码如下:

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;/*** 五子棋游戏*/
public class GobangGame {private Chessboard chessboard;          //棋盘private int posX;                       //用户输入的X坐标private int posY;                       //用户输入的Y坐标private final int WIN_COUNT = 5;        //判断赢棋的棋子数/*** 空构造器*/public GobangGame(){}/*** 含参构造器,初始化棋盘和棋子属性* @param chessboard 棋盘*/public GobangGame(Chessboard chessboard){this.chessboard = chessboard;}/*** 判断用户输入是否合法* @param inputStr  用户输入的字符串* @return*/public boolean isValid(String inputStr){//将用户输入的字符串使用英文逗号,分隔成一个字符串数组,分别储存X和Y坐标String[] inputStrArr = inputStr.split(",");//将字符串类型的坐标转换成Int型的坐标try {posX = Integer.parseInt(inputStrArr[0]) - 1;posY = Integer.parseInt(inputStrArr[1]) - 1;}catch (NumberFormatException e){       //异常处理,当数字的格式不正确的时候chessboard.printBoard();        //输出棋盘System.out.println("请按照(数字,数字)格式输入:");return false;       //返回不合法}//判断用户输入的坐标是否在规定范围内,大于0,小于BOARD_SIZEif (posX < 0 || posX >= Chessboard.BOARD_SIZE || posY < 0 || posY >= Chessboard.BOARD_SIZE){chessboard.printBoard();System.out.println("坐标只能大于0小于等于" + Chessboard.BOARD_SIZE + ",请重新输入:");return false;}//获取当前棋盘String[][] board = chessboard.getBoard();//判断输入位置是否有棋子,如果不等于“十”,说明已经有棋子了if (board[posX][posY] != "十"){chessboard.printBoard();System.out.println("当前位置已有棋子,请重新输入:");return false;}return true;}/*** 再来一次* @param chessman 最后赢棋的是电脑玩家还是用户* @return* @throws IOException*/public boolean isReplay(String chessman) throws IOException {chessboard.printBoard();        //输出棋盘//判断最后一步,是电脑玩家还是用户,如果是用户(用户使用黑棋)提示赢棋。String message = chessman.equals(Chessman.BLACK.getChessman()) ? "恭喜你赢了!" : "很遗憾你输了!";System.out.println(message + "再来一次?(y/n)");BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));//是否再来一次if (bufferedReader.readLine().equals("y")){return true;}return false;}/*** 随机获取电脑玩家,下棋的坐标* @return  返回电脑玩家下棋的坐标数组*/public int[] computerDo(){//在棋盘大小范围内,进行随机int posX = (int) (Math.random() * (Chessboard.BOARD_SIZE - 1));int posY = (int) (Math.random() * (Chessboard.BOARD_SIZE - 1));String[][] board = chessboard.getBoard();//如果当前随机的坐标位置已有棋子,则重新随机坐标while (board[posX][posY] != "十"){posX = (int) (Math.random() * (Chessboard.BOARD_SIZE - 1));posY = (int) (Math.random() * (Chessboard.BOARD_SIZE - 1));}//返回坐标数组int[] result = {posX,posY};return result;}/*** 判断是否赢棋* @param posX  X坐标* @param posY  Y坐标* @param icon  棋子类型,黑棋还是白棋* @return*/public boolean isWin(int posX,int posY, String icon){//满足赢棋条件最开始的X坐标int startX = 0;//满足赢棋条件最开始的Y坐标int startY = 0;//满足赢棋条件结束的X坐标int endX = Chessboard.BOARD_SIZE - 1;//满足赢棋条件结束的Y坐标int endY = Chessboard.BOARD_SIZE - 1;//当前棋子,落棋后的,周围相同棋子数int sameCount = 0;int temp = 0;//判断最开始的X坐标和Y坐标是否超过棋盘大小temp = posX - WIN_COUNT + 1;startX = temp < 0 ? 0 : temp;temp = posY - WIN_COUNT + 1;startY = temp < 0 ? 0 : temp;temp = posX + WIN_COUNT - 1;//判断满足赢棋条件结束棋子的X坐标和Y坐标是否超过棋盘的大小endX = temp > Chessboard.BOARD_SIZE - 1 ? Chessboard.BOARD_SIZE : temp;temp = posY + WIN_COUNT - 1;endY = temp > Chessboard.BOARD_SIZE - 1 ? Chessboard.BOARD_SIZE : temp;String[][] board = chessboard.getBoard();//计算从左到右,相同棋子的个数for (int i = startY; i < endY ;i++){if (board[posX][i] == icon && board[posX][i + 1] == icon){sameCount++;}else if (sameCount != WIN_COUNT - 1){sameCount = 0;}}//计算从上到下,相同棋子的个数if (sameCount == 0){for (int i = startX; i < endX; i++){if (board[i][posY] == icon && board[i + 1][posY] == icon) {sameCount++;} else if (sameCount != WIN_COUNT - 1) {sameCount = 0;}}}if (sameCount == 0) {// 从左上到右下计算相同相邻棋子的数目int j = startY;for (int i = startX; i < endX; i++) {if (j < endY) {if (board[i][j] == icon && board[i + 1][j + 1] == icon) {sameCount++;} else if (sameCount != WIN_COUNT - 1) {sameCount = 0;}j++;}}}//返回是否赢棋return sameCount == WIN_COUNT - 1 ? true : false;}/*** 开始游戏* @throws IOException 接收输入*/public void start() throws IOException {boolean isOver = false;         //游戏是否结束chessboard.initChessboard();    //初始化棋盘chessboard.printBoard();        //输出棋盘BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));//获取用户输入的坐标String inputStr = null;//如果输入不为空while ((inputStr = bufferedReader.readLine()) != null){isOver = false;//判断输入坐标是否合法,不合法退出本次循环,等待下一次输入if (!isValid(inputStr)){continue;}//用户使用黑棋String chessman = Chessman.BLACK.getChessman();//设置棋子chessboard.setBoard(posX,posY,chessman);//判断是否赢棋if (isWin(posX,posY,chessman)){isOver = true;}else {//如果没有,则电脑玩家进行操作,获取电脑玩家随机的下棋坐标int[] computerPosArr = computerDo();//电脑玩家使用白棋chessman = Chessman.WHITE.getChessman();//设置棋子chessboard.setBoard(computerPosArr[0],computerPosArr[1],chessman);//判断电脑玩家是否赢棋if (isWin(computerPosArr[1],computerPosArr[1],chessman)){isOver = true;}}//判断是否结束游戏if (isOver){//当本次游戏结束是,询问是否再来一次if (isReplay(chessman)){//如果再来一次,则初始化棋盘,输出棋盘chessboard.initChessboard();chessboard.printBoard();continue;}//如果不继续游戏,则退出break;}chessboard.printBoard();System.out.println("请输入坐标:");}}public static void main(String[] args) throws Exception {// write your code hereGobangGame game = new GobangGame(new Chessboard());game.start();}
}

效果如图:

以上就是全部内容,如果发现错误,请指出,谢谢。

有问题欢迎私聊或者发送邮箱(964427082@qq.com)一起讨论

java控制台五子棋游戏相关推荐

  1. 五子棋java设计引言_基于JAVA的五子棋游戏系统设计与实现报告.doc

    PAGE \* MERGEFORMAT PAGE \* MERGEFORMAT I 基于JAVA的五子棋游戏系统设计与实现 专 业 电子信息工程 学 生 董永杰 指导教师 曾玉 摘要 PAGE \* ...

  2. java版五子棋分析_基于JAVA的五子棋游戏系统设计实现分析.doc

    WORD格式整理版 WORD格式整理版 学习好帮手 学习好帮手 基于JAVA的五子棋游戏系统设计与实现 专 业 电子信息工程 学 生 董永杰 指导教师 曾玉 WORD格式整理版 学习好帮手 摘 要 目 ...

  3. 基于java的五子棋游戏的设计_基于Java的五子棋游戏的设计

    摘  要 五子棋作为一个棋类竞技运动,在民间十分流行,为了熟悉五子棋规则及技巧,以及研究简单的人工智能,决定用JAVA开发五子棋游戏.主要完成了人机对战和玩家之间联网对战2个功能.网络连接部分为Soc ...

  4. java五子棋游戏设计_基于Java的五子棋游戏的设计

    摘  要 五子棋作为一个棋类竞技运动,在民间十分流行,为了熟悉五子棋规则及技巧,以及研究简单的人工智能,决定用JAVA开发五子棋游戏.主要完成了人机对战和玩家之间联网对战2个功能.网络连接部分为Soc ...

  5. java入门-五子棋游戏的制作

    java入门-五子棋游戏的制作 想要开发一个简单的五子棋游戏,需要实现五子棋的棋盘.棋子.输赢判定.重新开始游戏.悔棋.认输.人机大战以及退出游戏等功能. 1.实现五子棋的棋盘功能 想要实现这个功能, ...

  6. java五子棋游戏人工智能_基于java的五子棋游戏(人机对战)

    [实例简介] 我毕业设计自己做的基于java的五子棋游戏软件,获得优秀论文,功能在单纯的人机对战上算比较齐全,也比较好玩!希望为毕业设计做游戏的同学提供些查考! 软件的基本功能 软件的基本功能介绍如下 ...

  7. 基于Java的五子棋游戏的设计与实现

    基于Java的五子棋游戏的设计 摘  要 五子棋作为一个棋类竞技运动,在民间十分流行,为了熟悉五子棋规则及技巧,以及研究简单的人工智能,决定用Java开发五子棋游戏.主要完成了人机对战和玩家之间联网对 ...

  8. JAVA控制台扑克牌游戏,洗牌,发牌,比较大小

    此游戏是一个简单的并且很基础的java控制台程序.这个扑克牌游戏主要的游戏过程是:首先创建一副扑克牌,创建好了后要进行洗牌,牌洗好了,需要玩家来玩,接下来就创建玩家.有洗好的牌,也有玩家了,那么就开始 ...

  9. java android 五子棋游戏_基于Android平台五子棋游戏最终版.doc

    基于Android平台五子棋游戏最终版 毕业设计(论文)任务书 毕业设计(论文)题目: 基于android平台的五子棋游戏的设计与实现 毕业设计(论文)要求及原始数据(资料): 1.综述国内基于and ...

最新文章

  1. thinkphp-条件判断-范围判断-range标签
  2. 【OpenCV 4开发详解】高斯滤波
  3. [HDOJ2845]Beans(dp)
  4. Vue项目多域名跨域
  5. cocos2d-x游戏实例(1)-视角跟随主角
  6. web开发中的 emmet 效率提升工具
  7. vivado 如何创建工程模式_基于Vivado的FPGA高性能开发研修班2019年8月30日上海举行...
  8. 从本地push到github以及从github拉一个项目,以及克隆
  9. Loadrunner中web_reg_save_param的使用详解
  10. myeclipse 内存不够用报错PermGen space 和 An internal error has occurred.
  11. 怎么新建web程序_前端程序员发展潜力最好,那该怎么学好web前端开发?
  12. 不定期总结程序员常见误区
  13. 显示器屏幕尺寸及分辨率
  14. 计算机考研复试汇总(所有科目)
  15. 韩立刚老师《计算机网络》笔记2
  16. win10熄屏时间不对_win10设置了息屏时间但是很快就息屏
  17. 【数学之美】豆瓣9.1 颠覆世界的混沌理论
  18. 阿里云——杭州云栖大会
  19. BCDEDIT - 启动配置数据存储编辑器
  20. 比尔·盖茨的另一扇视窗

热门文章

  1. 段错误 php,如何解决php扩展出现段错误的问题
  2. Moreau Decomposition 和 共轭次梯度定理
  3. LeetCode 97. 交错字符串(动态规划)
  4. OpenCV精进之路(十七):工具——图像配准工具
  5. 网络传输大数据——内存映射
  6. redis源码剖析(5):基础数据结构inset
  7. Java网络编程:TCP实现聊天
  8. 2013dgtcs 数字编码
  9. 可变、不可变数据类型
  10. 关于Apache2.4版本的phpMyAdmin的配置