Python井字棋choose_position()函数row、slot值始终为0问题排查
Python井字棋坐标赋值失效问题
问题表现
- 基于Python开发井字棋游戏时,编写
choose_position()函数,预期根据玩家输入的1~9数字,计算对应棋盘位置的行(row)、列(slot)二维坐标 - 实际运行时
row和slot始终保持初始值0,所有落子都会覆盖棋盘第一行第一个位置,无法更新到玩家选择的目标格子 - 典型复现场景:玩家选择位置5时,预期得到
row=1、slot=2,调试打印两个变量值始终为0
复现代码
from tabnanny import check board = [["-","-","-"],["-","-","-"],["-","-","-"]] def print_board(board): for row in board: for slot in row: print(f"{slot}",end=" ") print() def current_user(user): if user: return "x" else:return "o" def choose_position(choice,row,slot): print("this is choice:",choice,type(choice)) if choice in [1,2,3]: row = 0 slot = choice-1 elif choice in [4,5,6]: row = 1 slot = choice-4 elif choice in [7,8,9]: row = 2 slot = choice -7 def limit(choice): if int(choice)>9 or int(choice)<1: print("please enter a number between 1 and 9 if you would be so good") return True else: return False def isnum(choice): if not choice.isnumeric(): print("Please enter a valid number if you would be so good") return True else: return False def check_input(choice): if isnum(choice): return True if limit(choice): return True return False def quit(choice): if choice == "q": return True else: return False user = True turns = 0 row = 0 slot = 0 while turns < 9: print(turns) print_board(board) active_user = current_user(user) choice = input("enter a position between 1 and 9:\n") if quit(choice):break if check_input(choice): print("oups wrong") continue choose_position(int(choice),row,slot) print(row,slot) board[row][slot] = active_user turns+=1 user = not user
问题原因
Python中整数属于不可变类型,函数传参时传递的是值的引用,函数内部对row、slot形参的赋值操作,只会修改函数作用域内的局部变量,不会改动全局作用域中定义的row、slot初始值,因此函数执行完成后,外部的两个变量始终是初始的0。
另外代码开头的from tabnanny import check属于无用导入,不会参与任何逻辑执行,可以直接删除。
修复方法
调整choose_position()函数逻辑,不再通过传参接收外部的row、slot变量,计算完成后直接将坐标作为返回值返回,外部调用时用变量接收返回结果即可。
- 修改后的
choose_position()函数:
def choose_position(choice): print("this is choice:",choice,type(choice)) if choice in [1,2,3]: row = 0 slot = choice-1 elif choice in [4,5,6]: row = 1 slot = choice-4 elif choice in [7,8,9]: row = 2 slot = choice -7 return row, slot
- 修改函数调用处的代码,接收返回值:
row, slot = choose_position(int(choice))
内容的提问来源于stack exchange,提问作者gtam18
相关产品推荐
相关产品推荐

