用Java实现五子棋对弈

news/2024/10/17 22:26:59/

目录

题目展示

题目分析

代码实现

结果展示

题目展示

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)判断输赢,结束对弈


http://www.ppmy.cn/news/563041.html

相关文章

C++实现基于博弈树的5x5一子棋人机对战

基于博弈树的5x5一子棋人机对战 919106840637实验2 这是智能计算三个课程实验的第二个实验&#xff0c;即博弈树搜索 。我之前对博弈树的了解不多&#xff0c;所以实现起来比较的简略&#xff0c;仅仅是基本达到了要求 实验语言 C 实验内容 实践博弈树搜索——“5x5格子的一…

Java五子棋(人机版),昨天买的棋子今天就用不上了

Java五子棋&#xff0c;老程序员也花了3天 作者简介 作者名&#xff1a;编程界明世隐 简介&#xff1a;CSDN博客专家&#xff0c;从事软件开发多年&#xff0c;精通Java、JavaScript&#xff0c;博主也是从零开始一步步把学习成长、深知学习和积累的重要性&#xff0c;喜欢跟广…

文科生从0学Python转数据分析学习建议避坑指南

我本科是财务管理&#xff0c;文科专业&#xff0c;零基础学习Python转行数分后&#xff0c;现在我的日常工作都离不开它。 接下来&#xff0c;给各位跟我一样无编程经验的朋友一些学习的建议 目标导向&#xff1a;先搞清楚为啥要学 Python几乎可以做任何事&#xff0c;但我…

数据库是如何工作的

数据库是如何工作的 注&#xff1a; 本文翻译自db_tutorial. 数据库计算机世界的一个基础软件&#xff0c;要想深入了解数据库&#xff0c;就不得不思考如下几个问题&#xff1a; 数据以什么格式保存&#xff1f;&#xff08;在内存和磁盘上&#xff09;它何时从内存移动到磁…

日立医疗影像诊断业务正式加入富士胶片集团

富士胶片株式会社宣布&#xff0c;于2021年3月31日完成对株式会社日立制作所&#xff08;以下简称“日立”&#xff09;旗下影像诊断相关业务的收购程序&#xff0c;标志着日立为继承相关业务而成立的新公司“富士胶片医疗健康”正式成为富士胶片集团全资子公司&#xff0c;全新…

云胶片(云影像)功能简介

1 首先&#xff0c;云胶片不能是这样的&#xff0c;这个只是换瓶不换药。这种图只是影像科老师在全序列图像中&#xff0c;选取的部分影像&#xff0c;患者没有拿到自己全部数据&#xff1b;另外&#xff0c;通过N-Print&#xff08;胶片打印标准&#xff09;打印的图像都是通过…

美通企业日报 | 全球金融科技50强榜中企居首;施乐退出与富士胶片合资企业...

今日看点 11月4日&#xff0c;KPMG&#xff08;毕马威&#xff09;和金融科技投资公司H2 Ventures联合发布了2019年全球金融科技100强榜单 (Fintech100)。入选 Fintech100的公司&#xff0c;既有全球首屈一指的50家金融科技公司&#xff0c;也包括引人注目的50家“明日之星”&a…

那些年,我了解过的医疗器械(偏影像方向)公司 (2017.03.24 Updating...)

本文由Markdown语法编辑器编辑完成。 背景&#xff1a; 不知不觉&#xff0c;在医疗软件行业工作已经三年&#xff08;2013.07至今&#xff09;有余了。如果算上研究生期间攻读生物医学工程硕士的那三年&#xff08;2010.092013.07&#xff09;&#xff0c;我在医疗器械行业工…