如何在tic-tac-toe(井字棋)游戏中正确实现胜利条件校验功能
问题根因
- 你当前代码中的
wins_x和wins_o是在棋盘初始化阶段就完成计算的布尔值列表,所有表达式的结果都只会基于初始全为'-'的棋盘,最终两个列表里的元素全是False - 后续你修改棋盘行的元素时,已经定义好的
wins_x、wins_o列表不会自动重新计算里面的判断条件,所以无论后续棋盘变成什么样,any(wins_x)和any(wins_o)的结果永远是False,自然无法正确判断胜负
正确实现方案
把胜利校验逻辑封装成独立函数,每次回合结束后调用函数实时计算当前棋盘的胜负状态即可,你可以直接复用原有的判断逻辑,改造后的代码示例如下:
row1 = ['-', '-', '-'] row2 = ['-', '-', '-'] row3 = ['-', '-', '-'] table = [row1, row2, row3] def check_win(player): # 入参player为要判断的棋子标识,传'x'或'o'即可 return ( # 两条对角线判断 (row1[0] == player and row2[1] == player and row3[2] == player) or (row3[0] == player and row2[1] == player and row1[2] == player) or # 三行判断 (row1 == [player, player, player]) or (row2 == [player, player, player]) or (row3 == [player, player, player]) or # 三列判断 (row1[0] == player and row2[0] == player and row3[0] == player) or (row1[1] == player and row2[1] == player and row3[1] == player) or (row1[2] == player and row2[2] == player and row3[2] == player) )
使用方式
每轮玩家落子结束后,直接调用函数判断即可,比如本轮是x玩家落子,就用if check_win('x')判断x是否获胜;本轮是o玩家落子,就用if check_win('o')判断o是否获胜,每次调用都会基于当前最新的棋盘状态计算结果,可正确完成胜负校验。
内容的提问来源于stack exchange,提问作者Friendly One
相关产品推荐
相关产品推荐

