Java实现五子棋的基础方法

作者:MSJ_743579531 时间:2021-07-11 12:32:08 

本文实例为大家分享了Java实现五子棋的具体代码,供大家参考,具体内容如下

任务概述:

五子棋是全国智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏。通常双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成五子连线者获胜。

任务过程:

1.绘制棋盘
2.提示黑方(用 1 表示)和白方(用 2 表示)分别下棋(X,Y 轴位置)并重新绘制棋盘
3.每当一方下棋后判断是否获胜

重点讲解:

1.关于胜利的判断:

根据用户所下棋子的位置对其周围进行检测,分为以下情况:
横向:当前下棋位置左右各4颗棋子连续相同5颗
竖向:当前下棋位置上下各4颗棋子连续相同5颗
斜向:当前下棋位置左上右下各4颗棋子连续相同5颗、当前下棋位置左下右上各4颗棋子连续相同5颗
在检测时要注意数组的下标,若用户下棋位置处于棋盘边缘,则周围坐标很可能已经在棋盘之外,要注意加上相应的判断避免下标越界!

2.关于棋盘下满:

我的思路是,先认为棋盘已经下满,然后在打印棋盘的同时,若当前打印值为0,则认为棋盘未满,可继续下棋操作,若棋盘已经打印完毕,仍然没有打印值为0的情况,则认为棋盘下满,双方平局,游戏结束。

其余内容在代码上有详细的注释,以下为代码:


import java.util.Scanner;

public class Chess {

public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int order = 1;//储存顺序,当order为1时轮到黑方下棋,当order为2时轮到白方下棋
int row = 0;//用来储存要下棋的行数
int column = 0;//用来储存要下棋的列数
int win = 0;//用来储存获胜者编号,为0则双方均未获胜,为1则白方获胜,为2则黑方获胜
int count1 = 0;//用来储存当前下棋位置左右各4颗棋子的相同数量
int count2 = 0;//用来储存当前下棋位置上下各4颗棋子的相同数量
int count3 = 0;//用来储存当前下棋位置左上右下各4颗棋子的相同数量
int count4 = 0;//用来储存当前下棋位置左下右上各4颗棋子的相同数量
int full = 1;//用来判断棋盘是否下满,默认值1认为已满,只要有1处空则置0
int board[][] = new int[16][16];//用来记录棋盘

//为棋盘的坐标赋值
for(int i = 0;i<16;i++) {
 board[i][0] = i;//为棋盘的Y轴赋值
}
for(int j = 0;j<16;j++) {
 board[0][j] = j;//为棋盘的X轴赋值
}

//开始下棋,无限循环直到有一方胜利或棋盘下满
while(true) {

//首先输出棋盘
 for(int i = 0;i<16;i++) {
 for(int j = 0;j<16;j++) {
  if(board[i][j] == 0)//若棋盘有1处空则认为棋盘未满
  full = 0;
  System.out.print(board[i][j]+"\t");
 }
 System.out.println();
 }

//然后判断棋盘是否下满
 if(full == 1) {//棋盘自始至终未有空值,则认为棋盘已经下满
 System.out.print("棋盘已下满,双方平局,游戏结束!");
 break;//跳出循环
 }

//棋盘未满,进入下棋过程
 if(order == 1) {//order为1黑方下棋
 order = 2;//切换order,下一次则白方下棋
 //无限循环直到下棋点可以正常下棋
 while(true) {
  System.out.println("请黑方下棋,请先输入X轴位置(列数,1-15):");
  column = scanner.nextInt();//储存要下棋的列数
  System.out.println("请黑方下棋,请输入Y轴位置(行数,1-15):");
  row = scanner.nextInt();//储存要下棋的行数
  if(board[row][column] != 0)//下棋点已有棋子,需重新下棋
  System.out.println("此次下棋无效,请重新下棋!");
  else {
  board[row][column] = 1;//放置黑棋
  break;//跳出循环
  }
 }
 }
 else {//order为2白方下棋
 order = 1;//切换order,下一次则黑方下棋
 //无限循环直到下棋点可以正常下棋
 while(true) {
  System.out.println("请白方下棋,请先输入X轴位置(列数,1-15):");
  column = scanner.nextInt();//储存要下棋的列数
  System.out.println("请白方下棋,请输入Y轴位置(行数,1-15):");
  row = scanner.nextInt();//储存要下棋的行数
  if(board[row][column] != 0)//下棋点已有棋子,需重新下棋
  System.out.println("此次下棋无效,请重新下棋!");
  else {
  board[row][column] = 2;//放置白棋
  break;//跳出循环
  }
 }
 }

//本次下棋完毕,判断是否有人获胜
 for(int i = -4;i < 4;i++) {

//判断当前下棋位置左右各4颗棋子的相同数量,连续4组相同则获胜
 if(column+i>0 && column+i+1<16) {//防止下标越界
  if(board[row][column+i] == board[row][column+i+1] && board[row][column+i] != 0) {
  count1++;
  if(count1 == 4) {//连续4组相同,获胜
   win = order;
   break;
  }
  }
  else
  count1 = 0;//未连续相同,清除相同计数
 }

//判断当前下棋位置上下各4颗棋子的相同数量,连续4组相同则获胜
 if(row+i>0 && row+i+1<16) {//防止下标越界
  if(board[row+i][column] == board[row+i+1][column] && board[row+i][column] != 0) {
  count2++;
  if(count2 == 4) {//连续4组相同,获胜
   win = order;
   break;
  }
  }
  else
  count2 = 0;//未连续相同,清除相同计数
 }

//判断当前下棋位置左上右下各4颗棋子的相同数量,连续4组相同则获胜
 if(column+i>0 && column+i+1<16 && row+i>0 && row+i+1<16) {//防止下标越界
  if(board[row+i][column+i] == board[row+i+1][column+i+1] && board[row+i][column+i] != 0) {
  count3++;
  if(count3 == 4) {//连续4组相同,获胜
   win = order;
   break;
  }
  }
  else
  count3 = 0;//未连续相同,清除相同计数
 }

//判断当前下棋位置左下右上各4颗棋子的相同数量,连续4组相同则获胜
 if(column+i>0 && column+i+1<16 && row-i-1>0 && row-i<16) {//防止下标越界
  if(board[row-i][column+i] == board[row-i-1][column+i+1] && board[row-i][column+i] != 0) {
  count4++;
  if(count4 == 4) {//连续4组相同,获胜
   win = order;
   break;
  }
  }
  else
  count4 = 0;//未连续相同,清除相同计数
 }

}

//有人获胜,输出棋盘及获胜者,跳出循环
 if(win == 2) {//由于win是order的值,order轮到白方,说明黑方获胜
 //输出棋盘
 for(int i = 0;i<16;i++) {
  for(int j = 0;j<16;j++) {
  System.out.print(board[i][j]+"\t");
  }
  System.out.println();
 }
 System.out.println("恭喜黑方获胜,游戏结束!");
 break;//跳出循环
 }
 else if(win == 1) {//由于win是order的值,order轮到黑方,说明白方获胜
 //输出棋盘
 for(int i = 0;i<16;i++) {
  for(int j = 0;j<16;j++) {
  System.out.print(board[i][j]+"\t");
  }
  System.out.println();
 }
 System.out.println("恭喜白方获胜,游戏结束!");
 break;//跳出循环
 }

//无人获胜,清除相同棋子计数,开始新循环
 count1 = 0;
 count2 = 0;
 count3 = 0;
 count4 = 0;
 full = 1;//再次认为棋盘已满

}
}

}

更多有趣的经典小游戏实现专题,分享给大家:

C++经典小游戏汇总

python经典小游戏汇总

python俄罗斯方块游戏集合

JavaScript经典游戏 玩不停

javascript经典小游戏汇总

来源:https://blog.csdn.net/qq_35221384/article/details/108347818

标签:java,五子棋
0
投稿

猜你喜欢

  • java导出大批量(百万以上)数据的excel文件

    2023-11-16 13:13:22
  • Android使用Gradle依赖配置compile、implementation与api的区别介绍

    2023-09-27 18:11:40
  • Redis之GEO存储地理位置信息的使用

    2023-12-22 14:29:49
  • 如何用Stream解决两层List属性求和问题

    2022-07-31 20:32:35
  • Spring MVC 学习 之 - URL参数传递详解

    2022-03-04 22:05:12
  • Java关键字this与super详解用法

    2023-05-28 05:28:04
  • java语言实现猜数字游戏

    2023-11-24 00:19:38
  • java多线程之铁路售票系统

    2022-01-31 12:25:14
  • 浅析Java SPI 与 dubbo SPI

    2021-10-23 16:54:12
  • 详解Struts2中json 相互引用死循环解决办法

    2022-09-08 04:04:46
  • java语言自行实现ULID过程底层原理详解

    2023-04-13 22:38:50
  • 详解java中String、StringBuilder、StringBuffer的区别

    2023-06-17 06:03:23
  • Spring Security 中如何让上级拥有下级的所有权限(案例分析)

    2022-01-28 16:55:26
  • mybatisplus之Wrappers.ne踩坑记录解决

    2021-08-28 10:13:13
  • 详解Java使用Jsch与sftp服务器实现ssh免密登录

    2023-11-24 18:34:18
  • java在网页上面抓取邮件地址的方法

    2023-10-01 19:18:21
  • springboot使用redis实现从配置到实战

    2023-05-05 09:49:08
  • 基于SpringBoot多线程@Async的使用体验

    2021-07-15 04:47:04
  • Java Socket实现单线程通信的方法示例

    2022-04-22 15:43:02
  • 重写hashCode()和equals()方法详细介绍

    2023-11-24 16:13:33
  • asp之家 软件编程 m.aspxhome.com