如何在无Numpy的情况下用二维数组检测四子连珠(Connect4游戏)
四子棋(Connect4)四子连珠检测方案(无需Numpy)
假设你的c4board是6行7列的二维数组,用0表示空位置,1/2分别代表两位玩家的棋子,以下是纯Python实现的连珠检测方案,无需依赖Numpy。
核心逻辑
每次玩家落子后,只需要检查刚落子的位置的四个方向(垂直、水平、两条对角线)是否存在连续4枚相同棋子——比起遍历整个棋盘,这种方式更高效,也更贴合四子棋的落子规则。
1. 垂直方向检测(列上连珠)
垂直方向只需要向上统计连续相同的棋子(因为棋子是落在列的最底部空位,当前落子位置是该列最新的棋子):
def check_vertical(row, col, player, board): count = 1 # 从当前位置向上遍历(假设row=0是棋盘最底部,row=5是最顶部) current_row = row + 1 while current_row < 6 and board[current_row][col] == player: count += 1 current_row += 1 return count >= 4
2. 水平方向检测(行上连珠)
水平方向需要同时向左、向右统计连续相同的棋子:
def check_horizontal(row, col, player, board): count = 1 # 向左遍历 current_col = col - 1 while current_col >= 0 and board[row][current_col] == player: count += 1 current_col -= 1 # 向右遍历 current_col = col + 1 while current_col < 7 and board[row][current_col] == player: count += 1 current_col += 1 return count >= 4
3. 左上-右下对角线检测
沿着左上到右下的方向,分别向两个端点统计连续相同棋子:
def check_diagonal_top_left(row, col, player, board): count = 1 # 左上方向 current_row, current_col = row - 1, col - 1 while current_row >= 0 and current_col >= 0 and board[current_row][current_col] == player: count += 1 current_row -= 1 current_col -= 1 # 右下方向 current_row, current_col = row + 1, col + 1 while current_row < 6 and current_col < 7 and board[current_row][current_col] == player: count += 1 current_row += 1 current_col += 1 return count >= 4
4. 右上-左下对角线检测
沿着右上到左下的方向,分别向两个端点统计连续相同棋子:
def check_diagonal_top_right(row, col, player, board): count = 1 # 右上方向 current_row, current_col = row - 1, col + 1 while current_row >= 0 and current_col < 7 and board[current_row][current_col] == player: count += 1 current_row -= 1 current_col += 1 # 左下方向 current_row, current_col = row + 1, col - 1 while current_row < 6 and current_col >= 0 and board[current_row][current_col] == player: count += 1 current_row += 1 current_col -= 1 return count >= 4
整合检测函数
将四个方向的检测整合到一个函数,只要任意方向满足连珠条件,就判定当前玩家获胜:
def check_win(row, col, player, board): return (check_vertical(row, col, player, board) or check_horizontal(row, col, player, board) or check_diagonal_top_left(row, col, player, board) or check_diagonal_top_right(row, col, player, board))
适配说明
如果你的c4board行索引定义相反(比如row=0是棋盘顶部),只需要调整垂直方向和对角线方向的行遍历逻辑:
- 垂直方向改为向下遍历(
current_row = row - 1,判断current_row >= 0) - 对角线的上下方向也对应反转即可
内容的提问来源于stack exchange,提问作者Cooper Bayliff
相关产品推荐
相关产品推荐

