加入胜利判断后,五子棋算是较为完整了
-五子棋胜利逻辑
-五子棋只要五颗同色棋子相连即可胜利
-五子棋只需在每下了一颗棋子后判断一次即可
所以判断胜利的算法非常清晰,即在每次落子后判断四个大方向是否连了五颗棋子
-算法解析
以左右方向为例,创建一个int n = 1(因为落子那颗也要算进去)
记录最后落子的颜色和坐标,先向左遍历,当碰到同色棋子时加n+1;当碰到空或者异色时,直接结束遍历,防止出现跳棋也记录。再向右遍历,进行相同操作。结束后判断n的大小,如果大于等于5,那么就获胜。
if (GoData.win(chessList, GoData.calC(x), GoData.calR(y))) {
JOptionPane.showMessageDialog(null, chessFlag == 1 ? "白棋胜利~" : "黑棋胜利~");
chessFlag = 0;
isWin = true;
}
下面代码在DoData接口中
public static boolean win(int[][] cl, int c, int d) {
if (col(cl, c, d) >= 5 || row(cl, c, d) >= 5 || left(cl, c, d) >= 5 || right(cl, c, d) >= 5) {
return true;
}
return false;
}
public static int col(int[][] cl, int c, int d) {
int n = 1;
for (int i = d + 1; i <= ROW; i++) {//左右
if (cl[c][i] == cl[c][d]) {
n++;
} else {
break;
}
}
for (int i = d - 1; i >= 0; i--) {
if (cl[c][i] == cl[c][d]) {
n++;
} else {
break;
}
}
return n;
}
public static int row(int[][] cl, int c, int d) {
int n = 1;
for (int i = c + 1; i <= COL; i++) {//上下
if (cl[c][d] == cl[i][d]) {
n++;
} else {
break;
}
}
for (int i = c - 1; i >= 0; i--) {
if (cl[c][d] == cl[i][d]) {
n++;
} else {
break;
}
}
return n;
}
public static int left(int[][] cl, int c, int d) {
int n = 1, k = 1;
for (int i = c + 1; i <= ROW; i++) {
int j = d + k;
if (j > COL)
break;
if (cl[c][d] == cl[i][j]) {
n++;
} else {
break;
}
k++;
}
k = 1;
for (int i = c - 1; i >= 0; i--) {
int j = d - k;
if (j < 0)
break;
if (cl[c][d] == cl[i][j]) {
n++;
} else {
break;
}
k++;
}
return n;
}
public static int right(int[][] cl, int c, int d) {
int n = 1, k = 1;
for (int i = c + 1; i <= ROW; i++) {
int j = d - k;
if (j < 0)
break;
if (cl[c][d] == cl[i][j]) {
n++;
} else {
break;
}
k++;
}
k = 1;
for (int i = c - 1; i >= 0; i--) {
int j = d + k;
if (j > COL)
break;
if (cl[c][d] == cl[i][j]) {
n++;
} else {
break;
}
k++;
}
return n;
}