五子棋案例

本文介绍了一个五子棋游戏的实现,包括棋盘的初始化、棋子落子判断、胜利条件检查等功能。使用了二维数组来表示棋盘,并通过遍历棋盘每个位置来判断是否有五子连珠的情况,分别实现了黑棋和白棋胜利的检测算法。此外,还提供了用户交互的简单流程,允许玩家输入坐标进行落子。
摘要由CSDN通过智能技术生成

五子棋案例

1.完成棋盘的基本布局

需要利用到二维数组的知识,二维数组的命名,初始化,赋值输出等;

2.对五子棋的各个功能进行设计

需要利用for,while循环等循环控制语句的知识,还有方法的设计,组合

3.设计过程(主要为判断某一方胜利的方法设计)

五子棋规则:黑子或白字中同色的五枚棋子连成一条线(可以为行列或斜线)
两种思路:
1.遍历棋盘的每个位置,判断每个位置上是否有满足一方胜利的条件(黑子或白字中同色的五枚棋子连成一条线(可以为行列或斜线),并利用计数器累计某位置上行列斜线连线棋子的个数;
2.通过对落子位置棋子的左右,上下,斜上方斜下方的同色棋子个数是否满足胜利条件来判断(该方法可有效的降低代码时间复杂度,但过于繁杂,不利于算法设计);
下列为方法一的具体实现:

方法如下

public class QiDemo {
    static char[] num = {'⒈', '⒉', '⒊', '⒋', '⒌', '⒍', '⒎', '⒏', '⒐', '⒑', '⒒', '⒓', '⒔', '⒕', '⒖'};
    static char black = '★';
    static char white = '☆';
    static char line = '十';
    char[][] a = new char[15][15];//设计15*15的棋盘;
    boolean flag = true;

    public void Init() {//棋盘初始化;
        for (int i = 0; i < 14; i++) {
            for (int j = 0; j < 14; j++) {
                a[i][j] = line;
            }
        }
        for (int i = 0; i < 15; i++) {
            a[i][14] = num[i];
            a[14][i] = num[i];
        }
    }

    public void Myprint() {//棋盘打印
        for (int i = 0; i < 15; i++) {
            for (int j = 0; j < 15; j++) {
                System.out.print(a[i][j] + " ");
            }
            System.out.println();
        }
    }

    public boolean Out(char a[][], int x, int y) {//是否能落子的基本判断(是否已经有棋子在该位置,或超出棋盘限制)
        if (x >= 0 && x < 15 && y >= 0 && y <= 15 && a[x][y] == '十')
            return true;
        else {
            return false;
        }
    }
/*判断某一方胜利的基本算法思路
  五子棋规则:黑子或白字中同色的五枚棋子连成一条线(可以为行列或斜线)
  两种思路:
  1.遍历棋盘的每个位置,判断每个位置上是否有满足一方胜利的条件(黑子或白字中同色的五枚棋子连成一条线(可以为行列或斜线),并利用计数器累计某位置上行列斜线连线棋子的个数;
  2.通过对落子位置棋子的左右,上下,斜上方斜下方的同色棋子个数是否满足胜利条件来判断(该方法可有效的降低代码时间复杂度,但过于繁杂,不利于算法设计);
 下列为方法一的具体实现:
*/
    public void BWin(char [][]a) {//判断黑棋胜利的基本算法
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                int hang = 0, lie = 0, xie = 0;
                for (int k = 0; k < 5; k++) {//五子棋的基本规则(五子成线)
                    if (a[i][j + k] == black) hang++;
                    if (a[i + k][j] == black) lie++;
                    if (a[i + k][j + k] == black) xie++;
                }
                if (hang == 5 || lie == 5 || xie == 5) {//利用计数器来简化代码
                    flag = false;
                    System.out.println("黑棋赢了");
                }
            }
        }
    }
    public void WWin(char [][]a) {//判断白棋胜利的基本算法
        for (int i = 0; i < 10; i++) {
            for (int j = 0; j < 10; j++) {
                int hang = 0, lie = 0, xie = 0;
                for (int k = 0; k < 5; k++) {
                    if (a[i][j + k] == white) hang++;
                    if (a[i + k][j] == white) lie++;
                    if (a[i + k][j + k] == white) xie++;
                }
                if (hang == 5 || lie == 5 || xie == 5) {
                    flag = false;
                    System.out.println("白棋赢了");
                }
            }
        }
    }


    public void W(char [][]a,int x,int y) {//在指定位置落子黑棋
        a[x][y]=white;
    }
    public void B(char [][]a,int x,int y) {//在指定位置落子白棋
        a[x][y]=black;
    }
    }

主函数如下

import java.util.Scanner;

public class Qi {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        QiDemo q = new QiDemo();//创建对象;
        q.Init();//初始化棋盘;
        q.Myprint();//打印初始化的棋盘;
        while (q.flag) {//(以某一方胜利)控制是否继续进行;
            int x, y;
            System.out.println("黑子下");
            if (q.flag) {
                while (true) {
                    x = sc.nextInt();
                    y = sc.nextInt();
                    if (q.Out(q.a, x, y)) {//判断该位置(x,y)是否可以落子(是否已经有棋子在该位置,或超出棋盘限制)
                        q.B(q.a, x, y);
                        q.Myprint();
                        q.BWin(q.a);
                        break;
                    } else {
                        System.out.println("输入错误重新输入");
                        continue;
                    }
                }
            }
            if (q.flag) {//重复
                while (true) {
                    System.out.println("白子下");
                    x = sc.nextInt();
                    y = sc.nextInt();
                    if (q.Out(q.a, x, y)) {
                        q.W(q.a, x, y);
                        q.Myprint();
                        q.WWin(q.a);
                        break;
                    } else {
                        System.out.println("输入错误重新输入");
                        continue;
                    }
                }
            }

        }
    }
}

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Mr. Rabbit.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值