JAVA实现网络对战带技能五子棋(二)——后台判断输赢算法
上文已经实现了图形界面制作,那么如何判断胜负呢?
一个自然的想法是通过矩阵储存棋盘上棋子的信息,无棋子则为0,白棋为1,黑棋为0。用户每次在棋盘上下棋子的同时会更新棋盘矩阵,然后通过矩阵判断输赢,若胜负未分则进入下一回合,反之则结束游戏。
创建棋盘矩阵
观察之前制作的棋盘,大小为600×510,横线33条、纵线39条(棋子只能画在纵、横线的交点,且棋盘边界不能下棋子),线条之间的距离为15。
因此,初步的想法是建一个33×39大小的矩阵,矩阵(0,0)对应棋盘左上角位置、(33,39)对应棋盘右下角位置。但是,这样有一个弊端,我们先讨论赢棋的情况:
当最后一步棋子周围的同属性棋子”—“、”|“、”\“、”/“连续排列时,即判断最后一步的棋子方赢了(画实心圈只是为了突出它是最后一步)。此时,若创建33×39大小的矩阵,当最后一步下在离边界1-3个点的位置时,若往左、右、上、下索引时会超出矩阵的索引,需要分情况处理(离边界近、离边界远)。为了减少编程复杂度、加快判断速度,因此选择牺牲一些储存量,创建41×47大小的矩阵(其中只有第5-37行、第5-43行有效)
public static int[][] xy=new int[41][47]; //扩充后的矩阵(需转换坐标)
根据矩阵判断输赢
每下一步棋都需要判断是否构成”—“、”|“、”\“、”/“,若赢了则将结果result置为最后一步棋子的属性。具体代码如下:
public int result=0; //判断结果-1为黑棋赢,1为白棋赢
public void count_module() {
//判断是否赢了
if(xindex>=4&&yindex>=4&&xindex<=42&&yindex<=36)
{
for(int i=-4;i<=0;i++)
{
int temp1=0; //构成——
int temp2=0; //构成|
int temp3=0; //构成\
int temp4=0; //构成/
for(int j=i;j<=i+4;j++)
{
temp1+=xy[yindex][xindex+j];
temp2+=xy[yindex+j][xindex];
temp3+=xy[yindex+j][xindex+j];
temp4+=xy[yindex-j][xindex+j];
}
if(temp1==5||temp1==-5)
{
result=temp1/5;
}else if(temp2==5||temp2==-5)
{
result=temp2/5;
}
else if(temp3==5||temp3==-5)
{
result=temp3/5;
}
else if(temp4==5||temp4==-5)
{
result=temp4/5;
}
}
}
}