五子棋判输赢方法一 :

可以很容易的看出五子棋连城5子即为获胜,其中一共有八个方向需要去计算,如下图所示:

 

分别为:东西南北,东北,东南,西南,西北八个方向;

 

(1)定义一个 int count用来定义是否有5个相同颜色的棋子相邻的连成一条直线。

(2):东方向,可以很容易看出往右的时候,只有X的坐标改变,而Y坐标没有发生改变这可以很容易的得等式关系int i=x+1;数组arr1[i][y]=arr[x][y];(i++);

同理往左()向西,Y值不变,i=x-1;arr[i][y]==arr[x][y];(i--);

public int chess_left_r(int ChessX,int ChessY){
    int count=0;//定义一个棋子的判断器
    for(int i=0;i<arr1.length;i++){//往右
        if(arr1[i][ChessY]==arr1[x][y]){//可以这么理解为下棋的坐标(x,y)和(x+1,y)相比是否相同
           count++;
        }else break;
    }
    for(int i=x-1;i>=0;i--){
        if(int i=0;i>=0;i++){
            count++;
        }else break;
    }
    if(count>=5){chessWIN=true;}//>=5时定义赢
    return count;
}

(3)南北方向:可以容易看出来,X的坐标不变,Y 的坐标在变幻,可参考东西方向;南方向(int i=y+1;i<arr1.length;i++)其中范围只要符合不超过棋盘的边界即可,正好也是小于数组arr1的长度.

同理北方向,X的值不变二Y 的值递减:(int i=Y-1;i>=0;i--)范围是大于等于0即可;

public int chesswin_up_down(int ChessX,int ChessY){
    int count=0;
    //向下
    for(int i=ChessY+1;i<arr1.length;i++){
        if(arr1[ChessX][i]==arr1[ChessX][ChessY]){
            count++
        }else break;
    }
    //向上
    for(int i=ChessY-1;i>=0;i--){
        if(arr1[ChessX][i]==arr1[ChessX][ChessY]){
            count++
        }else break;
    }
     if(count>=5){chessWIN=true;}//>=5时定义赢
    return count;
}

(3)西北——东南方向:西北方向可以很容易的得知往西北方向下棋的时候,第二颗棋子比第一个棋子的X,Y坐标要小1个单位,因此 i,j做递加的时候才能和第一个棋子相等,这和东西南北不一样, (int i=x+1,j=y+1;i<arr1.length;i++,j++);

东南方向:东南的下一个棋子的比前一个棋子都要的X,Y坐标都要大一个单位,因此要和前一个棋子作比较的时候要(int i=x-1,j=y-1;i>=0&&j>=0;i--,j--)边界问题是因为下棋的时候必须要有X=0和Y=0的情况,因此这个就需要同时大于零;

public int chessWin_LeftOblique(int ChessX, int ChessY) {
        int count=1;//是否和自己比 等于1 就是没有和自己比
        //西北方向
        for(int i=ChessX+1,j=ChessY+1;i<arr1.length;i++,j++){
​
                if(arr1[i][j]==arr1[ChessX][ChessY]){//没有和自己比
                    count++;
                }else break;
            }
        //东南方向
​
        for(int i=ChessX-1,j=ChessY-1;(j>=0)&&(i>=0);i--,j--){
            if (arr1[i][j]==arr1[ChessX][ChessY]){//没有和自己比
                count++;
            }else break;
        }
        if(count>=5){chessWin= true;}
        return count;
        }

同理西南和东北方向也是按照这种方式推理可得:

西南:(int i=ChessX+1,j=ChessY-1;j>=0;i++,j--)

东北:(int i=ChessX-1,j=ChessY+1;i>=0;i--,j++)

public int chessWin_rightAngle(int ChessX,int ChessY){
        //西南方向
        int count=1;
            for(int i=ChessX+1,j=ChessY-1;j>=0;i++,j--){
                if(arr1[i][j]==arr1[ChessX][ChessY]){//没有和自己比
                    count++;
                }else break;
            }
            //东北方向
            for(int i=ChessX-1,j=ChessY+1;i>=0;i--,j++){
​
                if(arr1[i][j]==arr1[ChessX][ChessY]){//没有和自己比
                    count++;
                }else break;
            }
            if(count>=5){chessWin= true;}
            return count;
        }
 

最后把上面的方法封装起来,到chessWin的方法里去运用;

//在class chessListener里定义一个全局布尔型变量 boolean chessWin;//用来判断输赢
//在把上面的分方法封装到chessWin方法里
public boolean chessWin(int ChessX,int ChessY){
    if(chessWin_left_r(ChessX,ChessY)>=5||chessWin_uo_down(ChessX,ChessY)>=5){
        reture ture;
    }
    if(chessWin_LeftOblique(ChessX,ChessY)>=5||chessWin_rightAngle(ChessX,ChessY)>=5){return true;}
        return false;
}

最后在下棋后调用方法:

//判断棋子是否相连5子,判断输赢;
chessWin(ChessX,ChessY);
if(chessWin==ture){
    JOptionpane.showMessageDiaog(chessPanel,"游戏结束,"+(arr1[ChessX][ChessY]==1 ?"黑方":"白方")+"获胜");//三则运算符
}
 

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值