用Java实现五子棋对弈

2023-11-19

目录

题目展示

题目分析

代码实现

结果展示

题目展示

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用Java实现五子棋对弈 的相关文章

随机推荐

  • 【系统移植】开发板的启动过程(认识uboot)

    在系统移植之前 需要先了解开发板启动的大致流程 了解了大致流程后 才知道开发板启动需要哪些东西 了解开发板启动的时候 一定会遇到闻所未闻的东西 所以我们了解的顺序是 了解开发板启动时涉及到的部件 了解启动过程中涉及到的文件 uboot 内核
  • msfvenom生成各种Payload命令

    msfvenom生成各种Payload命令 msfvenom l 列出所有模块 攻击载荷 Binaries linux msfvenom p linux x86 meterpreter reverse tcp LHOST
  • Ubuntu 安装配置NFS网络文件系统服务器(详细)

    现在我的电脑连接情况 Ubuntu 安装配置NFS服务器 一 安装NFS服务器1 1 安装Ubuntu nfs服务器端 sudo apt get install nfs kernel server 很显然 我已经安装过了 继续往下走 1 2
  • 从零开始刷题1

    又一道简单等级的题 小白打小怪 最大时间 给定一个由 4 位数字组成的数组 返回可以设置的符合 24 小时制的最大时间 最小的 24 小时制时间是 00 00 而最大的是 23 59 从 00 00 午夜 开始算起 过得越久 时间越大 以长
  • 网络编程是什么

    转载 http peixun eol cn company company article detail php articleid 15033 对于初学者 或者没有接触过网络编程的程序员 会觉得网络编程涉及的知识很高深 很难 其实这是一种
  • 【数据结构】堆、栈的区别

    heap 是堆 stack 是栈 在编程语言中 内存分配方式主要包括 栈 堆 静态存储分配 栈的内存是由操作系统自动分配 释放的 存放函数的参数值 局部变量等 堆的内存是由程序员手动申请和释放的 对应C语言中的malloc函数和C 中的ne
  • 服务器意外重启后redis启动失败或无法连接的问题解决办法

    今天开发服务器因机房断电重启了 然后发现所有的PHP接口都报错 session write close Failed to write session data using user defined save handler session
  • 【C++自我精讲】基础系列四 static

    C 自我精讲 基础系列四 static 0 前言 变量的存储类型 存储类型按变量的生存期划分 分动态存储方式和静态存储方式 1 动态存储方式的变量 生存期为变量所在的作用域 即程序运行到此变量时才为其分配存储空间 作用域结束时 会自动收回为
  • 企业支付宝白名单和数字娱乐线上接口解析。

    企业支付宝白名单 企业支付宝白名单是指企业在支付宝平台上享受更多支付和服务权限的一种认证机制 通过加入支付宝白名单 企业可以获得更高的交易额度 更灵活的支付功能和更便捷的服务 具体来说 企业支付宝白名单的好处包括 提升支付额度 白名单企业可
  • unzip命令常用参数

    1 l 显示压缩文件内所包含的文件 2 t 检查压缩文件是否正确 3 o 不必先询问用户 unzip执行后覆盖原有的文件 4 n 解压缩时不要覆盖原有的文件 5 q 执行时不显示任何信息 6 d lt 目录 gt 指定文件解压缩后所要存储的
  • redis进行set操作时异常总结

    事情经过 项目中使用redis 环境进行过一次网络迁移 之后就无法拿到redis连接 1 先通过ping命令排除网络原因 其实这里建议使用 telnet 命令 格式 telnet ip port 不仅能排查网络是否连通并且知道改端口号是否能
  • PTA-ASCII码实战

    给出一系列字符 有大小写英文字母和其他一些字符 仅涉及ASCII打印字符 即ASCII码值 gt 32 现在想让你鉴别以下这些字符 如果是英文字母则输出其ASCII码值 否则输出 illegal 不包含引号 输入格式 第一行一个整数N 0
  • 详解Singleton、Factory、Strategy在项目中的应用

    一 前言 前几天阅读一框架文档 里面有一段这样的描述 从对象工厂中 促使写下本文 尽管一些模式简单和简单 但是常用 有用 结合最近一个项目场景回顾一下里面应用到的一些模式 Singleton Factory Strategy Singlet
  • pm2的的使用(基础)

    技术背景 相信大家都有这样一个烦恼 自己写了一个服务 并且通过cmd面板开启了这个服务 可是 当你关掉cmd命令行面板的时候 你会发现你的服务也跟着停止了 这种现象是我们不想要的 所以 诞生了一种技术 pm2服务持久化管理 技术的简单使用
  • SQL主键与外键的创建与解析

    一个表中 会存很多条记录 需要一个列来位置标识一条数据 1 主键 唯一标识一条数据 值不能为空 不能重复 标识列 一旦将一个列设置成标识列 它就不能再手动输入值 是插入数据时自动生成的 这个列的类型必须的不带小数的数值型 整型 标识列的标识
  • 利用搜索关键字爬取今日头条新闻评论信息案例

    利用搜索关键字爬取今日头条新闻评论信息案例 爬虫4步骤 1 分析网页 2 对网页发送请求 获取响应 3 提取解析数据 4 保存数据 本案例所用到的模块 import requests import time import csv 案例网址
  • centos 添加路由命令_centos路由添加route命令

    方法一 添加路由 route add net 192 168 0 0 24 gw 192 168 0 1 route add host 192 168 1 1 dev 192 168 0 1 删除路由 route del net 192 1
  • C++连接sqlserver

    项目结构 ConsoleApplication cpp include
  • KeyError: Spider not found (Scrapy)

    在初次使用Scrapy框架时 突然蹦出了一个bug 看了一下午还没解决 吃过晚饭后灵光一现嘿嘿 终于解决了 出现的具体bug如下 自己觉得是路径问题 就一步一步的cd到myspider 自己定义的文件名 文件下 再次运行 结果又出现了下面的
  • 用Java实现五子棋对弈

    目录 题目展示 题目分析 代码实现 结果展示 题目展示 1 使用二维数组存储五子棋棋盘 如下图 2 在控制台通过Scanner输入黑白棋坐标 表示二维数组坐标 使用实心五角星和空心五角星表示黑白棋子 如下图 输入后重新输出棋盘如下图 白棋输