You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python实现Connect 4游戏无需手动枚举的获胜检测方法咨询

Python实现Connect 4游戏无需手动枚举的获胜检测方法咨询

嘿,看起来你已经把Connect 4的基础放置逻辑搭得有模有样了!手动枚举所有可能的4连组合确实既繁琐又容易遗漏,我来给你分享几个更聪明的获胜检测思路,完全不用硬写所有组合~

核心思路:基于方向向量的定向检测

Connect 4的获胜条件无非四种:水平、垂直、左上-右下对角线、右上-左下对角线。我们可以用方向向量来代表这四种方向,然后针对每一颗刚落下的棋子,沿着这四个方向去统计连续同色棋子的数量——只要某个方向上的连续同色数达到4,就判定获胜。

为什么只检测刚落下的棋子?因为只有新落的棋子才有可能形成新的4连,这样比遍历整个棋盘效率高多了。

第一步:优化你的棋盘数据结构

你现在用col1到col7单独变量存储棋盘状态,其实改成二维列表会方便太多,比如:

# 初始化7列6行的棋盘,1代表空位,"r"红棋,"b"蓝棋
board = [
    [1, 1, 1, 1, 1, 1],  # 第0列(对应原来的col1)
    [1, 1, 1, 1, 1, 1],  # 第1列(对应原来的col2)
    [1, 1, 1, 1, 1, 1],
    [1, 1, 1, 1, 1, 1],
    [1, 1, 1, 1, 1, 1],
    [1, 1, 1, 1, 1, 1],
    [1, 1, 1, 1, 1, 1]   # 第6列(对应原来的col7)
]
# 把count1-count7也改成一个列表,更简洁
column_counts = [0] * 7

这样你可以通过board[列索引][行索引]直接访问任意位置的状态,后续遍历会轻松很多。

第二步:实现获胜检测函数

我们定义四个方向的向量:右(1,0)、右下(1,1)、下(0,1)、左下(-1,1),然后对每个方向,分别往正、反两个方向统计同色棋子的数量:

def check_win(col, row, color):
    # 四个可能的获胜方向向量
    directions = [(1, 0), (1, 1), (0, 1), (-1, 1)]
    
    for dx, dy in directions:
        consecutive = 1  # 当前落下的棋子本身算1个
        # 先往方向的正方向遍历
        curr_col, curr_row = col + dx, row + dy
        while 0 <= curr_col < 7 and 0 <= curr_row < 6 and board[curr_col][curr_row] == color:
            consecutive += 1
            curr_col += dx
            curr_row += dy
        
        # 再往方向的反方向遍历
        curr_col, curr_row = col - dx, row - dy
        while 0 <= curr_col < 7 and 0 <= curr_row < 6 and board[curr_col][curr_row] == color:
            consecutive += 1
            curr_col -= dx
            curr_row -= dy
        
        # 如果连续同色数>=4,说明获胜
        if consecutive >= 4:
            return True
    return False

第三步:整合到你的现有代码里

修改putinbackgroundcheck函数,更新棋盘状态后直接调用检测函数,比如:

def putinbackgroundcheck(person, columnnum, count):
    # 把columnnum(比如"y1")转换成列索引
    col_idx = {"y1":0, "y2":1, "y3":2, "y4":3, "y5":4, "y6":5, "y7":6}[columnnum]
    color = "r" if person == 0 else "b"
    # 更新棋盘状态
    board[col_idx][count] = color
    
    # 检测是否获胜
    if check_win(col_idx, count, color):
        winner = "Red" if color == "r" else "Blue"
        print(f"{winner} wins!")
        # 这里可以添加游戏结束的逻辑,比如禁用点击、弹出提示等

同时,把你原来的count1到count7替换成column_counts,比如在main函数里用column_counts[col_idx]来获取当前列的计数器。

为什么这个方法好用?

  • 完全不用手动枚举任何获胜组合,不管棋盘多大(只要是Connect4的7x6)都能适配
  • 只检测最新落子的位置,计算量很小,效率高
  • 代码逻辑清晰,容易维护和扩展

这样修改后,你的游戏就能自动检测所有可能的4连获胜情况啦!

备注:内容来源于stack exchange,提问作者14sirs

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 07:53:17