Java实现五子棋的基础方法
作者:MSJ_743579531 发布时间:2021-07-11 12:32:08
标签: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经典小游戏汇总
来源:https://blog.csdn.net/qq_35221384/article/details/108347818


猜你喜欢
- 想在Linux进行JAVA开发吗?环境如何搭建,第一个HelloWorld如何实现,下面马上奉献:1、环境搭建1.1 Java JDK 的安
- Cookie1. 概念是服务器通知客户端保存键值对的一种技术。cookie 是 servlet(服务器) 发送到 Web 浏览器(客户端)的
- 在Java的内存分配中,总共3种常量池:Java 常量池详解(二)class文件常量池 和 Java 常量池详解(三)class运行时常量池
- Android中可以创建三种对话框、确定取消对话框、单选对话框、多选对话框android中的确定取消对话框演示示例Android中使用单选对
- Java多线程综合案例数字加减设计4个线程对象,两个线程执行减操作,两个线程执行加操作public class ThreadDemo{ &n
- 本文实例为大家分享了Android仿Iphone屏幕底部弹出效果的具体代码,供大家参考,具体内容如下main.xml如下: <?xml
- 本文实例讲述了C#实现输入10个数存入到数组中并求max和min及平均数的方法。分享给大家供大家参考,具体如下:using System;u
- 一、TabHost用法通常情况下我们会通过继承TabActivity,调用getTabHost()获取TabHost实例,下面是具体过程。T
- 什么是响应式简单来说当数据发生变化时,对数据有依赖的代码会重新执行。例如在Vue中,当我们的数据发生改变,界面上对该数据的引用组件会重新渲染
- 在servlet3.0标准之前,是每一个请求对应一个线程。如果此时一个线程出现了高延迟,就会产生阻塞问题,从而导致整个服务出现严重的性能情况
- Sentinel 是什么随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel 以流量为切入点,从流量控制、熔断降级、系统
- 前面文章介绍了Android利用麦克风采集并显示模拟信号的实现方法,这种采集手段适用于无IO控制、单纯读取信号的情况。如果传感器本身需要包含
- 一、封装封装:是面向对象方法的重要原则,就是把对象的属性和行为(数据)结合为一个独立的整体,并尽可能隐藏对象的内部实现细节,就是把不想告诉或
- 概要应同学邀请,演示如何使用 PyQt5 内嵌浏览器浏览网页,并注入 Javascript 脚本实现自动化操作。下面测试的是一个廉价机票预订
- 一、需求分析最近公司项目要实现一个需求要满足以下功能: 1)显示一个 list
- 核心代码: File fatherFile = new File(path);File[] files = fatherFile.listF
- 麦洛开通博客以来,有一段时间没有更新博文了.主要是麦洛这段时间因项目开发实在太忙了.今天周六还在公司加班,苦逼程序猿都是这样生活的.今天在做
- 前言在上篇文章《初识GraphQL》中我们大致的了解了GraphQL作用,并通过简单示例初步体验了GraphQL的使用。下面我们从Hello
- 一、饿汉式单例类public class Singleton { privat
- 本文主要包括以下内容:使用Xfermode设置圆角图片使用BitmapShader设置圆角图片滑动旋转缩放的bimp图片图片颜色处理(滑动)