Python nested while loop实现战舰游戏舰船放置重复坐标死循环问题求解
问题根因
- 你的
flag3、flag4两个标志位仅在代码最开始初始化了一次,第一次输入完合法的x/y坐标后,两个flag都会被设置为False。当坐标重复触发外层循环继续执行时,内层两个while循环的判断条件永远不成立,不会再让用户输入新坐标,程序会直接复用上次输入的重复坐标,再次触发重复提示,陷入无限打印错误信息的死循环。 - 你目前的代码没有给
var1设置False的逻辑,就算坐标合法不重复,也不会退出外层循环,属于隐藏bug。 - 最后也没有给棋盘对应位置赋值为1的逻辑,放置舰船的操作没完成。
修复方案
调整标志位的初始化位置,补充退出逻辑和棋盘赋值逻辑即可,修改后代码如下:
p1Board = [[0, 0, 0, 0, 0, 0, 0, 0],[0, 0, 0, 0, 0, 0, 0, 0],[0, 0, 0, 0, 0, 0, 0, 0],[0, 0, 0, 0, 0, 0, 0, 0],[0, 0, 0, 0, 0, 0, 0, 0],[0, 0, 0, 0, 0, 0, 0, 0],[0, 0, 0, 0, 0, 0, 0, 0],[0, 0, 0, 0, 0, 0, 0, 0]] var1 = True # Player 1 Tank 2 while var1 == True: # 每次重新输入坐标前重置两个校验标志位 flag3 = True flag4 = True while flag3 == True: p1XCoordTank2 = int(input("\nOn which x-coordinate would you like to place your second tank? ")) flag3 = False if p1XCoordTank2 < 0 or p1XCoordTank2 > 7: print("Please choose an x-coordinate that is in the range 0-7. ") flag3 = True while flag4 == True: p1YCoordTank2 = int(input("On which y-coordinate would you like to place your second tank? ")) flag4 = False if p1YCoordTank2 < 0 or p1YCoordTank2 > 7: print("Please choose an y-coordinate that is in the range 0-7. ") flag4 = True if p1Board[p1XCoordTank2][p1YCoordTank2] == 1: print("You already have a tank placed here. Please input another set of coordinates. ") else: # 坐标合法且无重复,赋值+退出循环 p1Board[p1XCoordTank2][p1YCoordTank2] = 1 var1 = False
额外优化建议
你需要为10艘舰船分别写放置逻辑的话,重复代码会非常多,可以把坐标输入、范围校验、重复校验的逻辑抽成公共函数,只需要传入当前玩家的棋盘,就能返回合法可用的坐标,大幅简化代码。
内容的提问来源于stack exchange,提问作者yrntakeoff
相关产品推荐
相关产品推荐

