You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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变量,计算完成后直接将坐标作为返回值返回,外部调用时用变量接收返回结果即可。

  1. 修改后的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
  1. 修改函数调用处的代码,接收返回值:
row, slot = choose_position(int(choice))

内容的提问来源于stack exchange,提问作者gtam18

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 04:48:03