Python编写井字棋游戏修改网格列表时非数字输入崩溃问题求解
井字棋代码问题修复方案
现有代码核心问题
- 输入转换异常未处理:直接使用
int(input())时,若用户输入非数字内容会抛出ValueError异常,导致程序直接崩溃 - 输入校验逻辑完全错误:
isinstance(choose, int) not in grid语义不成立,isinstance返回的是布尔值,无法通过该判断校验输入是否为合法数字 - 索引类型错误:
input()默认返回字符串类型,直接使用grid[choose]会因为索引必须为整数类型抛出报错 - 无格子占用校验:未判断用户选择的位置是否已经落子,会导致已占用的格子被重复覆盖
- 落子逻辑冗余:不需要调用
replace方法,直接给列表对应索引赋值即可
修复后可运行代码
grid = [" ", "1", "2", "3", "4", "5", "6", "7", "8", "9"] def grids(): print(grid[1] + " | " + grid[2] + " | " + grid[3]) print("---------") print(grid[4] + " | " + grid[5] + " | " + grid[6]) print("---------") print(grid[7] + " | " + grid[8] + " | " + grid[9]) # 默认先手为X picked = "X" while True: grids() choose = input(f"choose a number and place your {picked}:") # 输入合法性校验 try: choose_num = int(choose) except ValueError: print("wrong input, please input a number between 1-9, try again") continue # 判断数字是否在1-9范围内 if choose_num < 1 or choose_num >9: print("number must be between 1-9, try again") continue # 判断格子是否已被占用 if grid[choose_num] in ("X", "O"): print("this position is already taken, try again") continue # 落子 grid[choose_num] = picked # 切换玩家 picked = "O" if picked == "X" else "X" # 可自行补充胜负判断、平局判断逻辑结束循环
关键修改说明
- 用
try...except ValueError捕获非数字输入的异常,输入非法时仅提示重试,不会导致程序崩溃 - 分三层校验输入合法性:先校验是否为数字、再校验是否在1-9区间、最后校验对应位置是否未被占用,完全覆盖异常输入场景
- 简化落子逻辑,直接给列表对应索引赋值为当前棋子,去除冗余的replace调用
- 新增玩家切换逻辑,符合井字棋轮流落子的规则
- 新增网格分隔线,优化界面显示效果
内容的提问来源于stack exchange,提问作者tim_hendrix
相关产品推荐
相关产品推荐

