四子棋(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č
相关产品推荐
相关产品推荐

