Java实现五子棋的基础方法

 更新时间:2020年09月03日 13:42:15   作者:MSJ_743579531  
这篇文章主要为大家详细介绍了Java实现五子棋的基础方法,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了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经典小游戏汇总

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Java爬虫爬取漫画示例

    Java爬虫爬取漫画示例

    这篇文章主要介绍了Java爬虫爬取漫画示例,大部分的爬虫入门教学都是爬取图片的,本文就来测试一下爬取网站的漫画,需要的朋友可以参考下
    2023-04-04
  • 简单理解遵循接口隔离原则的Java设计模式编程

    简单理解遵循接口隔离原则的Java设计模式编程

    这篇文章主要介绍了遵循接口隔离原则的Java设计模式编程,针对Java编程中interface接口方面的编写进行约束,需要的朋友可以参考下
    2016-02-02
  • SpringBoot实现简单文件上传功能

    SpringBoot实现简单文件上传功能

    这篇文章主要为大家详细介绍了SpringBoot实现简单文件上传功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • Java连接Mysql数据库详细代码实例

    Java连接Mysql数据库详细代码实例

    这篇文章主要介绍了Java连接Mysql数据库详细代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-02-02
  • Maven坐标和依赖的实现示例

    Maven坐标和依赖的实现示例

    本文主要介绍了Maven坐标和依赖的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-04-04
  • Spring之详解bean的实例化

    Spring之详解bean的实例化

    这篇文章主要介绍了Spring之详解bean的实例化,文章内容详细,简单易懂,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2023-01-01
  • Java9版本新特性同一个Jar支持多JDK版本运行

    Java9版本新特性同一个Jar支持多JDK版本运行

    这篇文章主要为大家介绍了Java9新版本的特性之同一个Jar支持多JDK版本运行的示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-03-03
  • Spring条件注解@Conditional示例详解

    Spring条件注解@Conditional示例详解

    这篇文章主要给大家介绍了关于Spring条件注解@Conditional的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Spring具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-08-08
  • java解析XML Node与Element的区别(推荐)

    java解析XML Node与Element的区别(推荐)

    下面小编就为大家分享一篇java解析XML Node与Element的区别,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-01-01
  • 基于Java和Lua实现IP锁定功能

    基于Java和Lua实现IP锁定功能

    本文主要介绍了 Lua 语言的特点、应用场景、基本语法,以及使用 Redis + Lua 脚本实现限制 IP 多次输入错误密码功能,包括 Lua 脚本示例、参数解释、逻辑流程、执行方式,并给出了 Java 应用示例及代码解释,还阐述了参数传递和使用,需要的朋友可以参考下
    2025-01-01

最新评论