五子棋的获胜方式为:一列或一行或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;
}