这次我们使用二维数组在控制台上实现五子棋的游戏,先看成果图:

思考下这个项目要怎么做,其实很简单:15x15的棋盘,黑子先下,并且只能下在中间。当一个棋子下到棋盘后,以这个棋子为中心向其他方向延伸:上下,左右,左切角或者右切角每个角度单独有连续出现同颜色的5个或以上数量的棋子就胜利。


先创建一些变量,用于表示我们游戏内的一些元素。

    //棋盘public static String[][] GoBang = new String[15][15];//判断是不是黑色方移动public static boolean isBlackMove = true;//整个棋盘的棋子数量public static int piece_count = 0;//用于接收玩家输入坐标public static Scanner inputManager = new Scanner(System.in);//黑色棋子public static final String BLACKPIECE = "●";//白色棋子public static final String WHITEPIECE = "○";//空位public static final String CLEARPIECE = "+";

创建完基本数据后,可以开始编写我们的游戏了,首先编写一个初始化棋盘数据的方法。

    public static void initGobang(){for (int x = 0;x<15;x++){for (int i = 0;i<15;i++){GoBang[x][i] = CLEARPIECE;}}}

非常简单,只是往数组里填充数据而已。


接下来为了方便玩家观察棋盘,另外编写一个打印棋盘的方法。

    public static void printGobang(){System.out.print("\t");for (int x = 1;x<=15;x++){System.out.print(x + "\t");}System.out.println();for (int x = 1;x<=15;x++){System.out.print(x + "\t");for (int i = 1;i<=15;i++){System.out.print(GoBang[x-1][i-1] + "\t");}System.out.println();}}

总之怎样看着舒服怎样来....


然后我们再编写游戏的核心,判断游戏的输赢,当一个棋子下到棋盘后判断下棋方是否胜利。

    public static boolean isWin(int x,int y){//用于记录已经判断过的棋子数量int count = 1;int findCount = 1;int tempX = x;int tempY = y;final String PIECE = GoBang[x][y];//左切角while (true){//最多的情况一个方向有四个或以上的相连for (int value = 1;value<=4;value++){//防止超出数组的索引if ((tempX - value != -1) && (tempY - value != -1)){//如果是同类型的棋子if (GoBang[tempX - value][tempY - value].equals(PIECE)){//相连数+1,已经进行判断的数量+1findCount += 1;count += 1;}else{//如果不是同类型棋子则代表被不同颜色的棋子或空位截断,把被截断的数量添加到已判断的棋子数量.count += ((4 - value + 1));break;}}else{count += ((4 - value + 1));break;}//如果这个方向已经有5个棋子,返回true,游戏胜利。if (findCount >= 5){return true;}}//左切角的另一个方向,原理相同不再赘述。for (int value = 1;value<=4;value++){if ((tempX + value != 15) && (tempY + value != 15)){if (GoBang[tempX + value][tempY + value].equals(PIECE)){findCount += 1;count += 1;}else{count += ((4 - value + 1));break;}}else{count += ((4 - value + 1));break;}if (findCount >= 5){return true;}}if (count == 9){findCount = 1;break;}}//右切角while (true){for (int value = 1;value<=4;value++){if ((tempX + value != 15) && (tempY - value != -1)){if (GoBang[tempX + value][tempY - value].equals(PIECE)){findCount += 1;count += 1;}else{count += ((4 - value + 1));break;}}else{count += ((4 - value + 1));break;}if (findCount >= 5){return true;}}for (int value = 1;value<=4;value++){if ((tempX - value != -1) && (tempY + value != 15)){if (GoBang[tempX - value][tempY + value].equals(PIECE)){findCount += 1;count += 1;}else{count += ((4 - value + 1));break;}}else{count += ((4 - value + 1));break;}if (findCount >= 5){return true;}}if (count == 17){findCount = 1;break;}}//上下while (true){for (int value = 1;value<=4;value++){if ((tempY - value != -1)){if (GoBang[tempX][tempY - value].equals(PIECE)){findCount += 1;count += 1;}else{count += ((4 - value + 1));break;}}else{count +=((4 - value + 1));break;}if (findCount >= 5){return true;}}for (int value = 1;value<=4;value++){if ((tempY + value != 15)){if (GoBang[tempX][tempY + value].equals(PIECE)){findCount += 1;count += 1;}else{count += (4 - value + 1);break;}}else{count += (4 - value + 1);break;}if (findCount >= 5){return true;}}if (count == 25){findCount = 1;break;}}//左右while (true){for (int value = 1;value<=4;value++){if ((tempX - value != -1)){if (GoBang[tempX - value][tempY].equals(PIECE)){findCount += 1;count += 1;}else{count += (4 - value + 1);break;}}else{count += (4 - value + 1);break;}if (findCount >= 5){return true;}}for (int value = 1;value<=4;value++){if ((tempX + value != 15)){if (GoBang[tempX + value][tempY].equals(PIECE)){findCount += 1;count += 1;}else{count += (4 - value + 1);break;}}else{count += (4 - value + 1);break;}if (findCount >= 5){return true;}}if (count == 33){findCount = 1;break;}}//否则游戏继续return false;}

感觉这部分写的有点屎山了。。。。大家看着修改


然后我们再来编写一个下棋子的方法,用来判断下棋的位置是否可用。

    public static boolean playChess(int x,int y){if (piece_count == 0){if (x != 8 || y != 8){System.out.println("第一枚棋子必须下在中央!");return false;}else{GoBang[7][7] = BLACKPIECE;isBlackMove = !isBlackMove;piece_count += 1;return true;}}if (isBlackMove){if (!GoBang[x-1][y-1].equals(CLEARPIECE)){System.out.println("这个地方不是空位!");return false;}else{GoBang[x-1][y-1] = BLACKPIECE;isBlackMove = !isBlackMove;piece_count += 1;return true;}}else{if (!GoBang[x-1][y-1].equals(CLEARPIECE)){System.out.println("这个地方不是空位!");return false;}else{GoBang[x-1][y-1] = WHITEPIECE;isBlackMove = !isBlackMove;piece_count += 1;return true;}}}

这里-1是因为给玩家打印的界面是没有0索引的(从1开始),如果下棋成功返回true,否则返回false


最后编写游戏主循环方法

    public static void gameLoop(){int inputX = 0;int inputY = 0;do {printGobang();//下满棋盘后if (piece_count == 225){System.out.println("棋子已经下完。。。没有赢家。");break;}System.out.println("现在是:" + (isBlackMove ? "黑色方行动" : "白色方行动"));System.out.println("请先输入想放置的行(X):");inputX = inputManager.nextInt();System.out.println("请输入想放置的列(Y):");inputY = inputManager.nextInt();if (!playChess(inputY,inputX)){gameLoop();}}while (!isWin(inputY-1,inputX-1));printGobang();if (!isBlackMove && piece_count < 255){System.out.println("恭喜黑色方获胜!");}else if (piece_count < 255){System.out.println("恭喜白色方获胜!");}}

至此整个游戏已经完成,最后在main方法中调用初始化方法,然后调用游戏主循环即可

    public static void main(String[] args){initGobang();gameLoop();}

快去动手试试吧!

java使用二维数组和控制台实现五子棋单机版相关推荐

  1. java语言二维数组转置_java实现二维数组转置的方法示例

    本文实例讲述了java实现二维数组转置的方法.分享给大家供大家参考,具体如下: 这里在文件中创建Test2.Exchange.Out三个类 在Exchange类中编写exchange()方法,在方法中 ...

  2. java txt 二维数组_java 将一个二维数组存到txt文件里,然后再读取

    java 将一个二维数组存到txt文件里,然后再读取 mip版  关注:286  答案:3  悬赏:30 解决时间 2021-01-26 21:40 已解决 2021-01-26 04:05 将一个d ...

  3. java arraycopy二维数组_System.arraycopy()实现数组的复制与交换

    今天在读别人代码的时候,发现了一个数组之间复制很不错的方法,就分享记录下吧.同时小小的研究下了它的使用方法. System提供了一个静态方法arraycopy(),我们可以使用它来实现数组之间的复制. ...

  4. java二维数组杨辉三角_实验----Java的二维数组的应用及杨辉三角的编写

    (1) 编写一个程序,生成一个10*10的二维随机整数数组,并将该数组的每行最大值保存于一个一维数组中,将每列平均值保存于另外一个一维数组中并分别输出. (2) 编程输出杨辉三角的前10行. 找出一个 ...

  5. java获取二维数组长度

    java获取二维数组长度 二维数组定义:int array[][] = new int[3][4]; 获取行数: int rowLength = array.length;//3 获取列数: int ...

  6. Java获取二维数组行列长度

    Java获取二维数组行列长度 二维数组定义:int array[][]=new int[3][3]; 获取行长度 : int rowlength=array.length; 获取列长度:int col ...

  7. java基础---二维数组方面的一些小编程

    package com.ujiuye.two; /*** @author limengdong* @date 2019年7月16日* @classroom 208bigdata* @descripti ...

  8. Java基础--二维数组

    1.二维数组的定义 二维数组表示行列二维结构,在栈空间中的二维数组的地址指向堆空间中的一维数组,堆空间中的一维数组的地址又指向一维数组所在的内存空间. 2.二维数组的声明 二维数组声明有3种方式,推荐 ...

  9. JAVA实现二维数组中的查找(《剑指offer》)

    最近在刷<剑指offer>里的编程题,但是网上关于<剑指offer>的解答多半是C或者C++的,而且官方(作者)也是在用C++进行讲解,这里自己用java写了一些题目的解答代码 ...

最新文章

  1. python俄罗斯方块算法详解_用 Python 写一个俄罗斯方块游戏 (
  2. android编译的tool版本有多少,macOS Mojave(10.14.2)系统上编译LunarG/VulkanTools工程的Android版本...
  3. if you can not get the full version within 1 minute
  4. 搭建TFS2008的过程及其注意事项
  5. Burpsuite Web渗透-扫描工具(中间攻击,渗透大牛都用来修改包和监视包)
  6. 从内存管理原理,窥探OS内存管理机制
  7. TClientDataSet[2]: Data、XMLData
  8. [转]Windows 下 Apache Virtual hosts 简单配置
  9. MySQL配置文件详解
  10. Linux 指令篇:档案目录管理--ls
  11. html设置一级标题二级标题格式怎么弄,论文一二三级标题格式如何设置
  12. vue实现上传图片识别文字
  13. MySQL主从配置和gtid主从配置
  14. 安卓图书信息管理系统
  15. ECharts实例(4)
  16. VMware 12 Exception 0xc0000005
  17. 虚函数,虚指针和虚表详解
  18. 网页图片采集教程(如何采集图片)
  19. EL与JSTL使用介绍
  20. 给程序猿宅男宅女相亲恋爱窍门

热门文章

  1. java执行sql列名无效_列名无效!java代码里的SQL语句!数据库里可以得到正确为什么放java里出错了?...
  2. windows7 图形界面远程 centos6.5
  3. Python进阶(三十三)Python获取并输出当前日期时间
  4. TOP -P XXXX 查看进程的资源占用率
  5. 铁路行李随车托运办理
  6. 工作5年观察:快速在职场崛起,拼这10个认知
  7. 英国电信将保留EE品牌
  8. 代码整洁之道--阅读
  9. 前苏联IV-18荧光数码管时钟开发(ИВ-18)
  10. 从遥感卫星(Rapideye)的视角见证“蚂蚁森林”的生长——以“蚂蚁森林1号林”为例