五子棋游戏代码(完整版)

news/2024/12/15 9:05:05/

编程实现控制台版并支持两人对战的五子棋游戏。

(1)绘制棋盘 - 写一个成员方法实现

(2)提示黑方和白方分别下棋并重新绘制棋盘 - 写一个成员方法实现。

(3)每当一方下棋后判断是否获胜 - 写一个成员方法实现。

(4)提示: 采用二维数组来模拟并描述棋盘,棋盘如下:
在这里插入图片描述

Created with Raphaël 2.2.0 开始 棋手准备 每轮更换 1.绘制棋盘 2.输入下棋坐标 3.判断是否合法 是否超出棋盘 该坐标是否有棋子 4.修改棋盘(下棋) 5.判断是否获胜 结束 yes no yes no

1. 绘制棋盘 - 写一个成员方法实现

    private int[][] gobang = new int[16][16];public void draw(){for (int i = 0; i < gobang.length+1; i++) {if (0 == i ) {System.out.print("   ");} else if (i <= 10 ) {System.out.print((char)(i - 1 + '0')+"  ");} else {System.out.print((char)(i - 11 + 'a')+"  ");}}System.out.println();for (int i = 0; i < gobang.length; i++) {if (i < 10 ) {System.out.print((char)(i  + '0')+"  ");} else {System.out.print((char)(i - 9 + 'a')+"  ");}for (int j = 0; j < gobang[i].length; j++) {if(0 == gobang[i][j]){System.out.print("+  ");} else if(1 == gobang[i][j]){System.out.print("@  ");} else {System.out.print("O  ");}}System.out.println();}}

2.输入下棋坐标

    public void play(){Scanner sc = new Scanner(System.in);while(true){draw();if (flag) {System.out.println("------------------------黑子------------------------");} else {System.out.println("------------------------白子------------------------");}System.out.println("请输入您要落子的行位置和列位置(如: 0 4):");int x = sc.nextInt();int y = sc.nextInt();if (islegitimate(x,y)){//判断是否合法,合法继续操作,不合法结束playChess(x, y);//修改棋盘数据,达到下棋效果if(isWin(x,y)){//判断是否输赢break;}flag = !flag;}}}
3.判断是否合法
    /*** 判断是否合法,合法继续操作,不合法结束* @param x 横坐标* @param y 纵坐标* @return*/public boolean islegitimate(int x,int y){if(x < 0 || x > 16 || y < 0 || y > 16){System.err.println("您落子落到棋盘外面去了,请重新落子!!");return false;}else {if(gobang[x][y] != 0){System.err.println("您落子的位置已有棋子,请重新落子!!");return false;} else {return true;}}}
4.修改棋盘(下棋)
    /*** 修改棋盘数据,达到下棋效果* @param x 横坐标* @param y 纵坐标*/public void playChess(int x,int y){if (flag) {gobang[x][y] = 1;} else {gobang[x][y] = 2;}}

5.判断是否获胜

    /*** 判断是否获胜* @param x 横坐标* @param y 纵坐标* @return true表示获胜,false继续下棋*/public boolean  isWin(int x, int y){int highBound = gobang.length;int lowBound = 0;int[] line = new int[9];int[] column = new int[9];int[] leftDiagonal = new int[9];int[] rightDiagonal  = new int[9];column[4] = line[4] = leftDiagonal[4] = rightDiagonal[4] = gobang[x][y];for (int i = 1; i <= 4; i++) {// 生成横方向的成线情况if (y - i >= lowBound) {line[4 - i] = gobang[x][y - i];}if (y + i <= highBound) {line[4 + i] = gobang[x][y + i];}// 生成纵方向的成线情况if (x - i >= lowBound) {column[4 - i] = gobang[x - i][y];}if (x + i <= highBound) {column[4 + i] = gobang[x + i][y];}// 生成左斜方向上的成线情况if (x - i >= lowBound && y - i >= lowBound) {leftDiagonal[4 + i] = gobang[x - i][y - i];}if (x + i <= highBound && y + i <= highBound) {leftDiagonal[4 - i] = gobang[x + i][y + i];}// 生成右斜方向上的成线情况if (x - i >= lowBound && y + i <= highBound) {rightDiagonal[4 + i] = gobang[x - i][y + i];}if (y - i >= lowBound && x + i <= highBound) {rightDiagonal[4 - i] = gobang[x + i][y - i];}}// 判断4个方向是否存在五子连珠的情况boolean resline = fiveSons(line, x, y);boolean rescolumn = fiveSons(column, x, y);boolean resLeftDiagonal = fiveSons(leftDiagonal, x, y);boolean resRightDiagonal = fiveSons(rightDiagonal, x, y);// 若有一个方向上的存在五子连珠的情况,则胜利if(resline || rescolumn || resLeftDiagonal || resRightDiagonal) {if(flag){System.out.println("黑子获胜");}else {System.out.println("白子获胜");}draw();return true;}else {return false;}}

下面是完整代码

Gobang类

package cn.cyh.test;import java.util.Scanner;/*** @author cyh* @create 2020/12/21 10:20*/
public class Gobang {//private int[][] gobang = new int[16][16];private boolean flag = true;private static Gobang gob = new Gobang();//单例private Gobang() { }public static Gobang getGobang(){return gob;}/*** 绘画棋盘*/public void draw(){for (int i = 0; i < gobang.length+1; i++) {if (0 == i ) {System.out.print("   ");} else if (i <= 10 ) {System.out.print((char)(i - 1 + '0')+"  ");} else {System.out.print((char)(i - 11 + 'a')+"  ");}}System.out.println();for (int i = 0; i < gobang.length; i++) {if (i < 10 ) {System.out.print((char)(i  + '0')+"  ");} else {System.out.print((char)(i - 9 + 'a')+"  ");}for (int j = 0; j < gobang[i].length; j++) {if(0 == gobang[i][j]){System.out.print("+  ");} else if(1 == gobang[i][j]){System.out.print("@  ");} else {System.out.print("O  ");}}System.out.println();}}/*** 下棋* @param x 横坐标* @param y 纵坐标*/public void playChess(int x,int y){if (flag) {gobang[x][y] = 1;} else {gobang[x][y] = 2;}}/*** 判断是否获胜* @param x 横坐标* @param y 纵坐标* @return true表示获胜,false继续下棋*/public boolean  isWin(int x, int y){int highBound = gobang.length;int lowBound = 0;int[] line = new int[9];int[] column = new int[9];int[] leftDiagonal = new int[9];int[] rightDiagonal  = new int[9];column[4] = line[4] = leftDiagonal[4] = rightDiagonal[4] = gobang[x][y];for (int i = 1; i <= 4; i++) {// 生成横方向的成线情况if (y - i >= lowBound) {line[4 - i] = gobang[x][y - i];}if (y + i <= highBound) {line[4 + i] = gobang[x][y + i];}// 生成纵方向的成线情况if (x - i >= lowBound) {column[4 - i] = gobang[x - i][y];}if (x + i <= highBound) {column[4 + i] = gobang[x + i][y];}// 生成左斜方向上的成线情况if (x - i >= lowBound && y - i >= lowBound) {leftDiagonal[4 + i] = gobang[x - i][y - i];}if (x + i <= highBound && y + i <= highBound) {leftDiagonal[4 - i] = gobang[x + i][y + i];}// 生成右斜方向上的成线情况if (x - i >= lowBound && y + i <= highBound) {rightDiagonal[4 + i] = gobang[x - i][y + i];}if (y - i >= lowBound && x + i <= highBound) {rightDiagonal[4 - i] = gobang[x + i][y - i];}}// 判断4个方向是否存在五子连珠的情况boolean resline = fiveSons(line, x, y);boolean rescolumn = fiveSons(column, x, y);boolean resLeftDiagonal = fiveSons(leftDiagonal, x, y);boolean resRightDiagonal = fiveSons(rightDiagonal, x, y);// 若有一个方向上的存在五子连珠的情况,则胜利if(resline || rescolumn || resLeftDiagonal || resRightDiagonal) {if(flag){System.out.println("黑子获胜");}else {System.out.println("白子获胜");}draw();return true;}else {return false;}}/*** 以x和y为中心,判断多少个相同的棋子* @param arr 获取到长度为9,中心是xy的数组* @param x 横坐标* @param y 纵坐标* @return true表示以x为中心的数组有5个,游戏结束*/private boolean fiveSons(int[] arr, int x, int y) {int count = 1; // 统计连续子的个数for(int i = 0; i < 5;) {if (arr[i] == gobang[x][y]) {for (int j = i + 1; j < 9; j++) {if(arr[j] == arr[j - 1]) {count += 1;if(5 == count) {return true; // 若找到五子连珠的情况,则返回胜利标示符true}}else {count = 1;i = j;break;}}}i++;}return false;}public boolean islegitimate(int x,int y){if(x < 0 || x > 16 || y < 0 || y > 16){System.err.println("您落子落到棋盘外面去了,请重新落子!!");return false;}else {if(gobang[x][y] != 0){System.err.println("您落子的位置已有棋子,请重新落子!!");return false;} else {return true;}}}public void play(){Scanner sc = new Scanner(System.in);while(true){draw();if (flag) {System.out.println("------------------------黑子------------------------");} else {System.out.println("------------------------白子------------------------");}System.out.println("请输入您要落子的行位置和列位置(如: 0 4):");int x = sc.nextInt();int y = sc.nextInt();if (islegitimate(x,y)){playChess(x, y);if(isWin(x,y)){break;}flag = !flag;}}}
}

GobangTest 测试类

package cn.cyh.test;
/*** 五子棋测试类* @author cyh* @create 2020/12/21 14:42*/
public class GobangTest {public static void main(String[] args) {Gobang gobang = new Gobang();gobang.play();}
}

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

相关文章

c语言小游戏----2048

1、2048游戏规则 控制所有方块向同一个方向运动&#xff0c;两个相同数字方块撞在一起之后合并成为他们的和&#xff0c;每次操作之后会随机生成一个2或者4&#xff0c;最终得到一个“2048”的方块即胜利。 2、简介 此游戏是笔者大一初学c语言时某次周三上午的上机实验&…

html5+JavaScript实现贪吃蛇游戏(可查看排行榜和个人历史记录)

先看结果截图&#xff08;界面很丑&#xff0c;但是主要是为了贪吃蛇游戏算法设计和历史记录、排行榜功能的实现&#xff0c;希望以后不被产品经理打&#xff0c;哈哈&#xff09; 功能描述&#xff1a; 1.开始游戏页面之前输入玩家姓名 2.历史记录&#xff1a;可以查看之…

游戏异常测试思路和常见测试点

1.游戏异常测试背景和目的 1.1背景 游戏本身具有一种玩具的属性&#xff0c;游戏测试除了基础功能和业务逻辑要求的玩法以外&#xff0c;更偏注重的是可玩性和用户体验&#xff0c;对局公平性和平衡性 而且游戏上下文关联性比较强&#xff0c;往往其中某一个环节出现异常问题&a…

三星S7 Edge怎么打开usb调试呢

分享一下我老师大神的人工智能教程&#xff01;零基础&#xff0c;通俗易懂&#xff01;http://blog.csdn.net/jiangjunshow 也欢迎大家转载本篇文章。分享知识&#xff0c;造福人民&#xff0c;实现我们中华民族伟大复兴&#xff01; 1、打开设定→→更多→→关于设备→→内部…

三星s7android版本,三星Galaxy S7 edge的系统是什么?能升级安卓7.0吗?

三星Galaxy S7 edge的手机系统是什么 三星Galaxy S7 edge的手机系统是Android 6.0。 三星Galaxy S7 edge在外观基本上继承了S6系列机型的外观设计风格&#xff0c;仅在机身细节部分做出了一些优化改进&#xff0c;比如机身倒角以及圆弧玻璃更加圆润&#xff0c;指纹识别按钮更加…

最新的三星android版本是多少,三星Galaxy S7的手机系统是什么?能升级安卓5.0吗?...

三星Galaxy S7的手机系统是什么 三星Galaxy S7的手机系统是android 6.0。 三星Galaxy S7的外观变动不大&#xff0c;尺寸上固定在5.1英寸&#xff0c;配备Super AMOLED的2K屏幕&#xff0c;并没有试探着与Note系列争夺地盘。正面的2.5D曲面&#xff0c;Galaxy S7要比S6收起的弧…

三星S7总是报app已停止 点击关闭应用还能继续运行

首先看下效果图&#xff1a; 点击关闭应用&#xff0c;应用好像并没有关闭&#xff0c;不说中间曲折的探索之路的&#xff0c;最后的解决方案就是我的app中只修改了一行&#xff1a; 在module的gradle文件中把原来的25改成了22就好了&#xff0c;再也不弹出这个该死的框了。 t…

三星s7android7,三星S7/S7 Edge国行成功吃上牛轧糖 今日升级安卓7.0

【TechWeb报道】国行三星Galaxy S7系列用户对Android 7.0等待可以说是望眼欲穿&#xff0c;之前由于种种原因&#xff0c;本应在2月份推送的固件被三星往后延期&#xff0c;不少用户只能继续耐心等待&#xff0c;经过进一步内测后&#xff0c;在今天三星终于对Galaxy S7国行版系…