五子棋判斷勝利條件時,水平、垂直方向易處理,但對角線 (主對角線、副對角線) 連續同色子判斷較繁瑣。
定義四個方向向量:
int dx[4] = {1, 0, 1, 1}; (右、下、右下、右上)
int dy[4] = {0, 1, 1, -1};
落子後,以該點為中心,沿四個方向雙向擴展統計同色子數,總數 ≥ 5 即獲勝。
(x, y),顏色 color。d = 0..3:nx = x + dx[d], ny = y + dy[d],而邊界內且棋盤 [nx][ny] == color,計數++。nx = x - dx[d], ny = y - dy[d],同理計數++。bool check_win(int board[15][15], int x, int y, int color) {
int dx[4] = {1, 0, 1, 1};
int dy[4] = {0, 1, 1, -1};
for (int d = 0; d < 4; d++) {
int count = 1;
// 正向
for (int i = 1; ; i++) {
int nx = x + i * dx[d], ny = y + i * dy[d];
if (nx < 0 || nx >= 15 || ny < 0 || ny >= 15) break;
if (board[nx][ny] != color) break;
count++;
}
// 反向
for (int i = 1; ; i++) {
int nx = x - i * dx[d], ny = y - i * dy[d];
if (nx < 0 || nx >= 15 || ny < 0 || ny >= 15) break;
if (board[nx][ny] != color) break;
count++;
}
if (count >= 5) return true;
}
return false;
}
CSDN 博客《五子棋判斷輸贏算法》: https://blog.csdn.net/mzlogin/article/details/5546204