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

Python while循环无法终止问题求助

问题分析与修复方案

核心问题:checkHorz函数逻辑错误

你的循环无法终止的根本原因是checkHorz函数没有正确检测获胜条件,导致gameOn永远不会被设为False,具体问题如下:

1. 循环提前终止,未完成所有检测

checkHorz函数中,else: return True是和最后一个if语句绑定的,这意味着第一次循环(i=1)时,只要最后一个行检测不满足条件,函数就直接返回True,不会继续检查i=2到i=7的情况,也不会完成所有行的完整检测。

2. 代码笔误导致检测逻辑错误

函数中有两处明显的笔误:

  • row1[i] == row5[i + 1] == ... 应该改为 row5[i] == row5[i + 1] == ...
  • row1[i] == row6[i + 1] == ... 应该改为 row6[i] == row6[i + 1] == ...
    这些笔误导致row5和row6的横向获胜条件完全无法被检测到。

3. 主循环的小优化(非致命,但更规范)

主循环中while (gameOn == True)可以简化为while gameOn,Python中布尔值可以直接作为循环条件;另外P1回合结束后如果gameOn已为False,P2的回合会自动跳过,逻辑没问题,但可以更简洁。


修正后的代码

修正后的checkHorz函数

def checkHorz():
    # 遍历所有可能的横向四连起始位置
    for i in range(1, 8):  # i+3最大为10,假设行列表索引到10
        # 检查row1的横向四连
        if row1[i] == row1[i+1] == row1[i+2] == row1[i+3] and row1[i] != "e":
            return False
        # 检查row2
        if row2[i] == row2[i+1] == row2[i+2] == row2[i+3] and row2[i] != "e":
            return False
        # 检查row3
        if row3[i] == row3[i+1] == row3[i+2] == row3[i+3] and row3[i] != "e":
            return False
        # 检查row4
        if row4[i] == row4[i+1] == row4[i+2] == row4[i+3] and row4[i] != "e":
            return False
        # 检查row5(修正笔误)
        if row5[i] == row5[i+1] == row5[i+2] == row5[i+3] and row5[i] != "e":
            return False
        # 检查row6(修正笔误)
        if row6[i] == row6[i+1] == row6[i+2] == row6[i+3] and row6[i] != "e":
            return False
    # 所有情况都检查完,没有获胜则返回True
    return True

优化后的main函数(可选)

def main():
    gameOn = True
    while gameOn:
        # P1's turn
        if gameOn:
            p1Choice = int(input("P1 move: "))
            write(1, p1Choice)
            if not checkHorz():
                gameOn = False
                print("Player 1 wins!!")
        
        # P2's turn
        if gameOn:
            p2Choice = int(input("P2 move: "))
            write(2, p2Choice)
            if not checkHorz():
                gameOn = False
                print("Player 2 wins!!")
        
main()

额外提示

  • 确保row1到row6这些列表的索引范围足够(至少到10,因为i最大为7,i+3=10),避免索引越界错误。
  • 可以考虑将获胜检测的逻辑封装得更通用,比如用一个列表存储所有行,循环遍历行列表,减少重复代码。

内容的提问来源于stack exchange,提问作者RubberToe06

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 18:25:36