Python井字棋选中已占用格子时如何保持当前玩家回合
井字棋已占格子选中后丢回合问题修复
问题根源
你当前代码的核心问题出在输入处理逻辑:
- 读取用户输入的代码写在了循环外面,无效输入后不会重新获取新的输入值
- 不管输入有效还是无效,所有分支都加了
break,会直接跳出输入函数回到主循环 - 主循环每次执行完
player_input不管落子有没有成功,都会直接执行切换玩家的逻辑,自然就会跳过当前玩家的回合 - 额外问题:没有处理非数字输入的场景,用户输入字母时程序会直接崩溃;
switch_player里的global answer是多余声明,完全没用。
修改方案
直接重写player_input函数,把输入读取放到循环内部,只有落子成功才跳出循环,同时补充输入合法性校验和异常捕获:
def player_input(board): while True: # 每次循环都重新读取输入 try: answer = int(input("Enter a value 1-9 to place your marker. It's currently {} turn: ".format(current_player))) # 先校验输入范围 if 1 <= answer <= 9: # 再校验格子是否为空 if board[answer-1] == "-": board[answer-1] = current_player # 只有落子成功才跳出输入循环 break else: print("Sorry, that spot seems to be taken. Please pick another") else: print("Invalid input! Please enter a number between 1 and 9") except ValueError: # 捕获输入非数字的异常,避免程序崩溃 print("Invalid input! Please enter a valid number")
同时删掉switch_player函数里没用的global answer行,修改后的切换玩家函数如下:
def switch_player(): global current_player if current_player == "X": current_player = 'O' else: current_player = "X"
逻辑说明
修改后player_input会一直停在循环里要求当前玩家输入,直到输入合法、成功落子才会返回主游戏循环,后续的胜负判断、平局判断、切换玩家逻辑才会执行。如果输入是已占用格子、超出1-9范围、非数字内容,只会打印对应提示后重新要求当前玩家输入,不会走到切换玩家的步骤,也就不会出现丢回合的问题。
内容的提问来源于stack exchange,提问作者Alex Power
相关产品推荐
相关产品推荐

