Java 简易五子棋的实现 V2.0 胜利判断

加入胜利判断后,五子棋算是较为完整了

-五子棋胜利逻辑

-五子棋只要五颗同色棋子相连即可胜利

-五子棋只需在每下了一颗棋子后判断一次即可

所以判断胜利的算法非常清晰,即在每次落子后判断四个大方向是否连了五颗棋子

-算法解析

以左右方向为例,创建一个int n = 1(因为落子那颗也要算进去)

记录最后落子的颜色和坐标,先向左遍历,当碰到同色棋子时加n+1;当碰到空或者异色时,直接结束遍历,防止出现跳棋也记录。再向右遍历,进行相同操作。结束后判断n的大小,如果大于等于5,那么就获胜。

    if (GoData.win(chessList, GoData.calC(x), GoData.calR(y))) {
        JOptionPane.showMessageDialog(null, chessFlag == 1 ? "白棋胜利~" : "黑棋胜利~");
        chessFlag = 0;
        isWin = true;
    }

 下面代码在DoData接口中

    public static boolean win(int[][] cl, int c, int d) {
        if (col(cl, c, d) >= 5 || row(cl, c, d) >= 5 || left(cl, c, d) >= 5 || right(cl, c, d) >= 5) {
            return true;
        }
        return false;
    }

    public static int col(int[][] cl, int c, int d) {
        int n = 1;
        for (int i = d + 1; i <= ROW; i++) {//左右
            if (cl[c][i] == cl[c][d]) {
                n++;
            } else {
                break;
            }
        }
        for (int i = d - 1; i >= 0; i--) {
            if (cl[c][i] == cl[c][d]) {
                n++;
            } else {
                break;
            }
        }
        return n;
    }

    public static int row(int[][] cl, int c, int d) {
        int n = 1;
        for (int i = c + 1; i <= COL; i++) {//上下
            if (cl[c][d] == cl[i][d]) {
                n++;
            } else {
                break;
            }
        }
        for (int i = c - 1; i >= 0; i--) {
            if (cl[c][d] == cl[i][d]) {
                n++;
            } else {
                break;
            }
        }
        return n;
    }

    public static int left(int[][] cl, int c, int d) {
        int n = 1, k = 1;
        for (int i = c + 1; i <= ROW; i++) {
            int j = d + k;
            if (j > COL)
                break;
            if (cl[c][d] == cl[i][j]) {
                n++;
            } else {
                break;
            }
            k++;
        }
        k = 1;
        for (int i = c - 1; i >= 0; i--) {
            int j = d - k;
            if (j < 0)
                break;
            if (cl[c][d] == cl[i][j]) {
                n++;
            } else {
                break;
            }
            k++;
        }
        return n;
    }

    public static int right(int[][] cl, int c, int d) {
        int n = 1, k = 1;
        for (int i = c + 1; i <= ROW; i++) {
            int j = d - k;
            if (j < 0)
                break;
            if (cl[c][d] == cl[i][j]) {
                n++;
            } else {
                break;
            }
            k++;
        }
        k = 1;
        for (int i = c - 1; i >= 0; i--) {
            int j = d + k;
            if (j > COL)
                break;
            if (cl[c][d] == cl[i][j]) {
                n++;
            } else {
                break;
            }
            k++;
        }
        return n;
    }

 -效果展示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值