目录

题目展示

题目分析

代码实现

结果展示

题目展示

1.使用二维数组存储五子棋棋盘

如下图

2.在控制台通过Scanner输入黑白棋坐标( 表示二维数组坐标),使用实心五角星和空心五角星表示黑白棋子。

如下图:

输入后重新输出棋盘如下图:

白棋输入后如下图:

黑白棋依次重复输入下棋。

3.每下一个棋子后需要判断该棋子是否出界,此位置是否已经有棋子,判断是否有5个棋子连在一起,有则表示胜利,否则继续下棋。

题目分析

1.输出棋盘(重复使用)方法

(1)棋盘是15行15列的,先创建容量为[15][15]的二维数组,素材与数组的创建如下:

static String white = "☆";static String black = "★";static String[][] qp = new String[15][15];static String[] num = {"⒈", "⒉", "⒊", "⒋", "⒌", "⒍", "⒎", "⒏", "⒐", "⒑", "⒒", "⒓", "⒔", "⒕", "⒖"};static String line = "十";

(2)对数组进行初始化,将默认的null替换为"十",再将最后一行和最后一列进行替换;创建了initQP方法,用两层循环,取出二维数组里的每一个元素,判断是否为最后一行和最后一列,如果是,则用num数组进行替换:

public static void initQP() {for (int i = 0; i < qp.length; i++) {for (int j = 0; j < qp[i].length; j++) {//取出每一个元素if (i == qp.length - 1) {//判断是否为最后一行元素qp[i][j] = num[j];//令最后一行第一位为num数组里的第一位......} else if (j == qp.length - 1) {//判断是否为最后一列元素qp[i][j] = num[i];//令最后一列第一位为num数组里的第一位......} else {//如果不是最后一列qp[i][j] = line;//将null替换为line中的"十"}}}}

(3)初始化棋盘已经完成,现在进行打印棋盘;注意:二维数组不能用Arrays.toString()输出,不能输出里层数组的值,只能通过数组的遍历进行输出,注意换行:

    public static void printQP() {//二维数组不能用Arrays.toString()输出,不能输出里层数组的值,通过遍历进行输出;for (int i = 0; i < qp.length; i++) {for (int j = 0; j < qp[i].length; j++) {System.out.print(qp[i][j]);}System.out.println("");//一行输出完了,进行换行;}}

2.开始下棋,判断黑白双方谁下棋,进行交替下棋,基本判断:棋子是否越界,棋子是否重复

(1)五子棋黑棋先落子,用户输入落子位置,判断是否有效,无效则需重新落子,有效则判断输赢,未获胜,则轮到白棋落子,进行循环,直至一方获胜;注:索引从0开始,故输入值均减一,在这里创建了check方法,来检查棋子是否有效,有效则返回true,替换上黑棋,打印棋盘,判断输赢,同样,创建iswin方法,未获胜,则令p=false,进入白棋落子,这里的y代表行数,x代表列数;

 static boolean p = true;
.
.
.
while (true) {if (p) {System.out.println("请黑子下子:");int y = sc.nextInt() - 1;int x = sc.nextInt() - 1;Boolean t = Demo7.check(x, y);//检查x,y是否有效if (t) {//有效qp[y][x] = black;printQP();//判断输赢Boolean w=iswin(y, x, black);if(w){System.out.println("黑棋获胜!");break;}else{p = false;//进入白棋下子}} else {System.out.println("无效棋!请重新下子!");}}else {System.out.println("请白子下子:");int y = sc.nextInt() - 1;int x = sc.nextInt() - 1;Boolean t = Demo7.check(x, y);if (t) {qp[y][x] = white;printQP();//判断输赢Boolean w=iswin(y, x, white);if(w){System.out.println("白棋获胜!");break;}else{p = true;//有效则进入下一轮}}else {System.out.println("无效棋!请重新下子!");}}}}

(2)判断棋子是否有效,主要从两个方面:是否出界,是否下过棋子(判断该点元素是否为"十"),equals判断两数组元素是否相同,相同返回true;

    public static boolean check(int x, int y) {if (x < 0 || x > qp.length - 1 || y < 0 || y > qp.length - 1) {//判断是否超出边界return false;}if (!qp[y][x].equals(line)) {//判断位置是否下过棋子return false;}return true;}

3.判断输赢

(1)每下一个棋子都要判断输赢,以当前下的棋子为中心,以水平为例,设定一个水平计数器,int spsum=1,先向左找,知道第0列,spsum>=5,如果不够,则继续向右找,直至<length-1

int spsum=1;//水平计数器for(int lx=x-1;lx>=0;lx--){//水平向左查找if(qp[y][lx].equals(qz)){spsum++;}else{break;}if(spsum>=5){return true;}}for(int rx=x+1;rx<qp.length-1;rx++){//水平向右查找if(qp[y][rx].equals(qz)){spsum++;}else{break;}if(spsum>=5){return true;}}

(2)竖直找与水平找相似

int szsum=1;//竖直计数器for(int ny=y-1;ny>=0;ny--){//竖直向上查找if(qp[ny][x].equals(qz)){szsum++;}else{break;}if(szsum>=5){return true;}}for(int sy=y+1;sy<qp.length-1;sy++){//数值向下查找if(qp[sy][x].equals(qz)){szsum++;}else{break;}if(szsum>=5){return true;}}

(3)斜着查找两个都在变

int lsum=1;//左对角计数器for(int lnx=x-1,lny=y-1;lnx>=0&&lny>=0;lnx--,lny--){//左斜向上查找if(qp[lny][lnx].equals(qz)){lsum++;}else{break;}if(lsum>=5){return true;}}for(int lsx=x+1,lsy=y+1;lsx<qp.length-1&&lsy<qp.length-1;lsx++,lsy++){//左斜向下查找if(qp[lsy][lsx].equals(qz)){lsum++;}else{break;}if(lsum>=5){return true;}}int rsum=1;//右对角计数器for(int rnx=x+1,rny=y-1;rnx<qp.length-1&&rny>=0;rnx++,rny--){//右斜向上查找if(qp[rny][rnx].equals(qz)){rsum++;}else{break;}if(rsum>=5){return true;}}for(int rsx=x-1,rsy=y+1;rsy<qp.length-1&&rsx>=0;rsy++,rsx--){//右斜向下查找if(qp[rsy][rsx].equals(qz)){rsum++;}else{break;}if(rsum>=5){return true;}}return false;}

代码实现

在主函数里使用各个方法,最终代码如下:

import java.util.Scanner;
public class Demo7 {static String white = "☆";static String black = "★";static String[][] qp = new String[15][15];static String[] num = {"⒈", "⒉", "⒊", "⒋", "⒌", "⒍", "⒎", "⒏", "⒐", "⒑", "⒒", "⒓", "⒔", "⒕", "⒖"};static String line = "十";static Scanner sc = new Scanner(System.in);static boolean p = true;//[0,14] ...[13,14]...[14][0]......[14][14]//14*14public static void main(String[] args) {Demo7.initQP();Demo7.printQP();Demo7.star();}//初始棋盘public static void initQP() {for (int i = 0; i < qp.length; i++) {for (int j = 0; j < qp[i].length; j++) {//取出每一个元素if (i == qp.length - 1) {//判断是否为最后一行元素qp[i][j] = num[j];//令最后一行第一位为num数组里的第一位......} else if (j == qp.length - 1) {//判断是否为最后一列元素qp[i][j] = num[i];//令最后一列第一位为num数组里的第一位......} else {//如果不是最后一列qp[i][j] = line;//将null替换为line中的"十"}}}}//打印棋盘public static void printQP() {//二维数组不能用Arrays.toString()输出,不能输出里层数组的值,通过遍历进行输出;for (int i = 0; i < qp.length; i++) {for (int j = 0; j < qp[i].length; j++) {System.out.print(qp[i][j]);}System.out.println("");//一行输出完了,进行换行;}}//开始下棋public static void star() {while (true) {if (p) {System.out.println("请黑子下子:");int y = sc.nextInt() - 1;int x = sc.nextInt() - 1;Boolean t = Demo7.check(x, y);//检查x,y是否有效if (t) {//有效qp[y][x] = black;printQP();//判断输赢Boolean w=iswin(y, x, black);if(w){System.out.println("黑棋获胜!");break;}else{p = false;//进入白棋下子}} else {System.out.println("无效棋!请重新下子!");}}else {System.out.println("请白子下子:");int y = sc.nextInt() - 1;int x = sc.nextInt() - 1;Boolean t = Demo7.check(x, y);if (t) {qp[y][x] = white;printQP();//判断输赢Boolean w=iswin(y, x, white);if(w){System.out.println("白棋获胜!");break;}else{p = true;//有效则进入下一轮}}else {System.out.println("无效棋!请重新下子!");}}}}//判断是否为无效子public static boolean check(int x, int y) {if (x < 0 || x > qp.length - 1 || y < 0 || y > qp.length - 1) {//判断是否超出边界return false;}if (!qp[y][x].equals(line)) {//判断位置是否下过棋子return false;}return true;}//判断输赢public static boolean iswin(int y, int x, String qz) {int spsum=1;//水平计数器for(int lx=x-1;lx>=0;lx--){//水平向左查找if(qp[y][lx].equals(qz)){spsum++;}else{break;}if(spsum>=5){return true;}}for(int rx=x+1;rx<qp.length-1;rx++){//水平向右查找if(qp[y][rx].equals(qz)){spsum++;}else{break;}if(spsum>=5){return true;}}int szsum=1;//竖直计数器for(int ny=y-1;ny>=0;ny--){//竖直向上查找if(qp[ny][x].equals(qz)){szsum++;}else{break;}if(szsum>=5){return true;}}for(int sy=y+1;sy<qp.length-1;sy++){//数值向下查找if(qp[sy][x].equals(qz)){szsum++;}else{break;}if(szsum>=5){return true;}}int lsum=1;//左对角计数器for(int lnx=x-1,lny=y-1;lnx>=0&&lny>=0;lnx--,lny--){//左斜向上查找if(qp[lny][lnx].equals(qz)){lsum++;}else{break;}if(lsum>=5){return true;}}for(int lsx=x+1,lsy=y+1;lsx<qp.length-1&&lsy<qp.length-1;lsx++,lsy++){//左斜向下查找if(qp[lsy][lsx].equals(qz)){lsum++;}else{break;}if(lsum>=5){return true;}}int rsum=1;//右对角计数器for(int rnx=x+1,rny=y-1;rnx<qp.length-1&&rny>=0;rnx++,rny--){//右斜向上查找if(qp[rny][rnx].equals(qz)){rsum++;}else{break;}if(rsum>=5){return true;}}for(int rsx=x-1,rsy=y+1;rsy<qp.length-1&&rsx>=0;rsy++,rsx--){//右斜向下查找if(qp[rsy][rsx].equals(qz)){rsum++;}else{break;}if(rsum>=5){return true;}}return false;}
}

结果展示

(1)打印棋盘,黑子先落子

(2)落子有效,白棋落子,进行循环

(3)判断出是无效子,重新落子

(4)判断输赢,结束对弈

用Java实现五子棋对弈相关推荐

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

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

  2. java 网络五子棋_Java实现五子棋网络版

    本文实例为大家分享了Java实现五子棋网络版的具体代码,供大家参考,具体内容如下 需求分析: 对于网络五子棋而言,在普通五子棋的基础上需要添加以下功能: 1.拥有服务器端和客户端,用户通过客户端登录服 ...

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

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

  4. 用java编写五子棋制作流程_Java实现五子棋的基础方法

    本文实例为大家分享了Java实现五子棋的具体代码,供大家参考,具体内容如下 任务概述: 五子棋是全国智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏.通常双方分别使用黑白两色的棋子,下在棋盘直 ...

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

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

  6. Java实现五子棋(附详细源码)

    这篇文章主要为大家详细介绍了Java实现五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 五子棋是一种两人对弈的纯策略型棋类游戏,棋具与围棋通用,是起源于中国古 ...

  7. java制作五子棋的论文,基于java的五子棋的设计与实现.docx

    摘要:随着社会的不断发展,我们的科技也不断的进步,现在我们的计算机也与我们的生活息息相关,这个时候 Internet能够让我们快速的知道自己想了解的知识.根据计算机的发展过程我们发现如今计算机应用的现 ...

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

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

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

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

最新文章

  1. 07JavaScript中的数组
  2. 剑指 Offer 17. 打印从1到最大的n位数
  3. 半分钟内能看透问题本质的人是如何思考的?
  4. Y1ng‘s BabyCode
  5. android studio 写文件,在Android Studio中从我自己的类读取和写入文本文件
  6. 卸载全部appx应用(包括应用商店)
  7. s5pv210——SDRAM的初始化
  8. markdown html图片,Markdown语法对应的HTML标签实现
  9. matlab2015统计工具箱,matlab统计工具箱函数汇集
  10. Oracle EBS-SQL (PO-5):采购订单控制信息查询.sql
  11. Unity3D调用android方法(非插件方式)
  12. UE4之wgs84坐标系
  13. MyBatis之sql映射文件
  14. 页面编码和js文件不同导致的IE6下脚本错误
  15. java opencv 摄像头,OpenCV使用摄像头
  16. 条件覆盖(Condition coverage)
  17. 计算机普通用户禁止修改c盘,win10系统禁止Guest账户访问C盘的设置技巧
  18. C++基础学习之重载和重写的区别
  19. 中国K12在线教育用户消费行为报告
  20. 图解Pandas,数据结构介绍 | 图文第1篇

热门文章

  1. Retinanet原理介绍和基于pytorch的实现
  2. 有机合成试剂1,10-菲啰啉配体[66-71-7]
  3. 南大数据交易所“文化大数据交易中心”正式上线
  4. JAVA利用第三方平台发送短信验证码。
  5. vue2和vue3的混入
  6. 嗅探器模式和数据包记录模式
  7. 诈骗团伙冒充京东金融客服来注销账号,25岁职场小伙3次转账超过3万,累计被骗14万,警方立案在线等结果,急......
  8. android将内容分享到QQ和微信
  9. fastadmin 的自定义搜索select框联动
  10. 头歌实验 HDFS的基本操作和Java API 操作