Python编写井字棋时while循环设置条件为False后仍不停止是什么原因?
问题核心原因
- 内层for循环不会因为修改while循环条件就立刻终止:
run_loop = False只会让while循环在下一次判断条件时退出,当前次while迭代里的for循环会把所有tiles遍历完才会结束,这是一次放置多个标记的核心原因。 - 重复调用
enemy_rng()导致随机数逻辑混乱:每次判断、打印、重试时都重新调用随机数生成函数,前后使用的不是同一个随机值,匹配逻辑完全失效。 - 不匹配就直接终止循环:只要当前遍历到的tile和随机数不相等,就直接把
run_loop设为False,大概率遍历第一个tile没匹配上就直接退出,自然会出现无任何操作的问题。 - 缺少我方落子的占用判断:只判断了tile有没有被敌方占用,没判断有没有被我方标记占据,匹配到被我方占的格子也会直接落子,就会出现覆盖我方标记的问题。
修复后的逻辑示例
你可以先把单次循环生成的随机数存下来统一使用,找到合法格子再落子,没找到就重新生成随机数,需要终止内层循环直接用break即可:
# 合法落子判断:格子没有被任何一方占据才可以落子,player字段替换成你自己代码里的我方占用字段名 def is_tile_available(tile): return not tile["enemy"] and not tile["player"] while run_loop: # 一次外层循环只生成一个随机数,全流程用这个值匹配 target_tile_num = enemy_rng() print(target_tile_num) for tile in tiles: if target_tile_num == tile["num"]: if is_tile_available(tile): # 执行敌方落子逻辑 tile["enemy"] = True print("Successful") run_loop = False # 匹配到目标格子直接跳出内层for循环,不需要再遍历其他tile break else: # 格子被占,跳出for循环,外层while会重新生成随机数重试 print("Tile occupied, re-roll") break
内容的提问来源于stack exchange,提问作者Kenji Chin
相关产品推荐
相关产品推荐

