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

四子棋(Connect 4)游戏胜负判定最优实现方案咨询

实现四子棋游戏结束判定的最优方案

嘿,我来帮你搞定这个四子连线的判定逻辑!结合你现有的4x4棋盘结构,我们可以写几个简洁高效的函数来检查获胜和平局情况,直接整合到你的代码里就行。

核心思路

我们需要检查四种获胜情况:

  • 水平方向任意一行四个棋子相同
  • 垂直方向任意一列四个棋子相同
  • 两条对角线(左上→右下、右上→左下)四个棋子相同
    另外还要处理棋盘填满但无人获胜的平局场景。

具体代码实现

首先添加获胜检查函数,针对你的棋盘结构做针对性判断:

def check_win(board):
    # 检查水平方向:每行四个元素是否一致且非空
    for row in board.values():
        if row[0] == row[1] == row[2] == row[3] != " ":
            return row[0]
    
    # 检查垂直方向:每列四个元素是否一致且非空
    for col in range(4):
        if board['a'][col] == board['b'][col] == board['c'][col] == board['d'][col] != " ":
            return board['a'][col]
    
    # 检查主对角线(左上→右下)
    if board['a'][0] == board['b'][1] == board['c'][2] == board['d'][3] != " ":
        return board['a'][0]
    
    # 检查副对角线(右上→左下)
    if board['a'][3] == board['b'][2] == board['c'][1] == board['d'][0] != " ":
        return board['a'][3]
    
    # 无获胜者返回None
    return None

然后添加平局检查函数,判断棋盘是否已经填满:

def check_draw(board):
    # 遍历所有格子,只要还有空格就没平局
    for row in board.values():
        if " " in row:
            return False
    # 无空格且无人获胜,返回平局
    return True

整合到游戏主逻辑

接下来你可以写一个主循环,把落子、检查胜负的流程串起来,示例如下:

def main():
    global rezultat
    rezultat = restart()
    current_player = 'X'
    game_running = True
    
    while game_running:
        izpis()
        print(f"Igrač {current_player}, izberi vrstico (a-d) in stolpec (1-4):")
        move = input().strip().lower()
        
        # 简单的输入合法性校验
        if len(move) != 2 or move[0] not in ['a','b','c','d'] or not move[1].isdigit():
            print("Neveljaven vnos! Poskusi znova, na primer 'a1' ali 'd4'.")
            continue
        
        row = move[0]
        col = int(move[1]) - 1  # 转换为列表的0索引
        
        # 检查位置是否已被占据
        if rezultat[row][col] != " ":
            print("To mesto je že zasedeno! Izberi drugo.")
            continue
        
        # 落子
        rezultat[row][col] = current_player
        
        # 检查是否获胜
        winner = check_win(rezultat)
        if winner:
            izpis()
            print(f"Igra je končana! Igrač {winner} zmaga!")
            game_running = False
            continue
        
        # 检查是否平局
        if check_draw(rezultat):
            izpis()
            print("Igra je končana! Nekdo ni zmagal, je neodločeno.")
            game_running = False
            continue
        
        # 切换玩家
        current_player = 'O' if current_player == 'X' else 'X'

if __name__ == "__main__":
    main()

为什么这是最优方案?

  • 针对性强:完全适配你现有的4x4棋盘结构,没有冗余计算
  • 逻辑清晰:每个检查分支对应一种获胜情况,可读性高
  • 易于扩展:如果以后要改成标准7x6四子棋,只需要修改check_win里的检查逻辑(比如遍历所有可能的连续四子起点),核心框架不用动

内容的提问来源于stack exchange,提问作者Danijel Tomič

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.07 14:17:50