可以很容易的看出五子棋连城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 ?"黑方":"白方")+"获胜");//三则运算符
}