java实现五子棋获胜判断

五子棋的获胜方式为:一列或一行或135° 连着五个同种颜色的棋子则为获胜
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RBhAQBVU-1577180943245)(winImg.jpg)]

定义一个二维数组用来存放棋盘上的棋子:

int[][] Checkerboard = new int [15][15];  //棋盘的长和宽均为15
//约定 黑子为1 白子为2
int turn = 1;
Checkerboard[3][4] = 2; //表示在棋盘上的第三行第四列的棋子为白子

判断获胜的思路:

  • 判断时机:是在玩家每次落子后去进行判断
  • 判断情况:之前有四字连线,此次落第五子;或之前左右各两子,此次落中间得胜;所以我们要判断落子坐标为中心在当前行或列或135°的九个子中是否存在五子连线
  • 意外情况:例:当要去判断此次落子在当前行是否获胜时,若落子在边界或邻近边界时,需要注意数组下标越界问题

落子之后首先先判断在当前行中是否可以获胜:

 /***
     *
     * @param ro  落子的列数
     * @param colu 落子的行数
     * @return
     */
    public boolean isWinColu(int ro,int colu){
        int minColu = colu - 4;
        int maxColu = colu + 4;
		//当落子的左边或右边到达边界时,置为0或14
        if(minColu < 0)
            minColu = 0;
        if (maxColu >= 15)
            maxColu = 14;

		//遍历九个格子若有五个相同颜色的棋子连线则为胜
        int sum = 0;
        for(int i = minColu ; i <= maxColu ; i++){
            int piece = gf.isAvail[ro][i];
            if(piece == turn){
                sum ++;
                if(sum ==5)  //五子连线判断 获胜
                    return true;
            }else{
                sum = 0;   //若不为同颜色 将sum置为0
            }
        }
        return false;
    }

判断在当前列中是否可以获胜:

//和判断当前行获胜的思路一样,具体注释可以看上边的
/***
     *
     * @param ro  落子的列数
     * @param colu 落子的行数
     * @return
     */
public boolean isWinRow(int ro,int colu){
        int minRow = ro - 4;
        int maxRow = ro + 4;
        if(minRow < 0)
            minRow = 0;
        if(maxRow >= 15)
            maxRow = 14;

        int sum = 0;
        for (int i = minRow ; i <= maxRow ; i++){
            int piece = gf.isAvail[i][colu];
            if(piece == turn){
                sum ++;
                if (sum == 5)
                    return true;
            }else{
                sum = 0;
            }
        }
        return false;
    }

判断左斜(/)是否获胜:

/***
     *
     * @param ro  落子的列数
     * @param colu 落子的行数
     * @return
     */
 public boolean isWinLeftObl(int ro,int colu){
        int sum = 0;
        for(int i = -4 ; i < 4 ; i++){
            if(ro+i>0 && ro+i<14 && colu+i>0 && colu+i<14) //越界判断
                if(gf.isAvail[ro+i][colu+i] == turn){
                    sum ++;
                }else{
                    sum = 0;
                }
            if(sum == 5)
                return true;
        }
        return false;
    }

判断右斜(\)是否获胜:

/***
     *
     * @param ro  落子的列数
     * @param colu 落子的行数
     * @return
     */
public boolean isWinRightObl(int ro,int colu){
        int sum = 0;
        for(int i = 4 ; i > -4 ; i--){
            if(ro+i>0 && ro+i<14 && colu+i>0 && colu+i<14)  //越界判断
                if(gf.isAvail[ro+i][colu+i] == turn){
                    sum ++;
                }else{
                    sum = 0;
                }
            if(sum == 5)
                return true;
        }
        return false;
    }

最后只要这四种获胜方式其中一种为True则获胜

  //判断是否获胜
    public boolean isWin(int ro,int colu){
        if(isWinColu(ro,colu) || isWinRow(ro,colu) || isWinLeftObl(ro,colu) || isWinRightObl(ro,colu))
            return true;
        return false;
    }
  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值