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

文本RPG房间移动程序if语句失效问题排查求助

问题:文本RPG房间移动逻辑失效,location变量无法更新?

我多次重写一款支持房间间移动的文本RPG程序,但始终遇到相同问题:程序似乎忽略了所有if语句,逻辑不生效。通过print验证,location变量初始设置正确,但移动操作后location不会变化。以下是最新代码:

topLeft='topLeft'
top='top'
topRight='topRight'
midLeft='midLeft'
mid='mid'
midRight='midRight'
botLeft='botLeft'
bot='bot'
botRight='botRight'

location=mid

def printError():
    print("You can't go that way!")

def topLeft():
    userInput=input('You can go south or east.')
    if userInput=='s':
        location=midLeft
    elif userInput=='e':
        location=top
    else:
        printError()
        

def top():
    userInput=input('You can go south, east, or west.')
    if userInput=='s':
        location=mid
    elif userInput=='e':
        location=topRight
    elif userInput=='w':
        location=topLeft
    else:
        printError()

def topRight():
    userInput=input('You can go south or west.')
    if userInput=='s':
        location=midRight
    elif userInput=='w':
        location=top
    else:
        printError()

def midLeft():
    userInput=input('You can go north, south or east.')
    if userInput=='n':
        location=topLeft
    elif userInput=='s':
        location=botLeft
    elif userInput=='e':
        location=mid
    else:
        printError()

def mid():
    userInput=input('You can go north, south, east, and west.')
    if userInput=='n':
        location=top
    elif userInput=='s':
        location=bot
    elif userInput=='e':
        location=midRight
    elif userInput=='w':
        location=midLeft
    else:
        printError()

def midRight():
    userInput=input('You can go north, south, west.')
    if userInput=='n':
        location=topRight
    elif userInput=='s':
        location=botRight
    elif userInput=='w':
        location=mid
    else:
        printError()

def botLeft():
    userInput=input('You can go north or east.')
    if userInput=='n':
        location=midLeft
    elif userInput=='e':
        location=bot
    else:
        printError()

def bot():
    userInput=input('You can go north, east, or west.')
    if userInput=='n':
        location=mid
    elif userInput=='e':
        location=botLeft
    elif userInput=='w':
        location=botRight
    else:
        printError()

def botRight():
    userInput=input('You can go north or west.')
    if userInput=='n':
        location=midRight
    elif userInput=='w':
        location=bot
    else:
        printError()

while True:
    print(location)
    if location==topLeft:
        topLeft()
    elif location==top:
        top()
    elif location==topRight:
        topRight()
    elif location==midLeft:
        midLeft()
    elif location==mid:
        mid()
    elif location==midRight:
        midRight()
    elif location==botLeft:
        botLeft()
    elif location==bot:
        bot()
    elif location==botRight:
        botRight()

问题根源:变量作用域误解

这不是while循环或多分支if的问题,核心是Python的变量作用域规则:当你在函数内部对一个变量赋值时,Python会默认将其视为局部变量,而不是修改全局作用域中的同名变量。

你的代码里,全局的location变量在每个房间函数(比如topLeft()、mid())里被赋值时,函数会创建一个新的局部location变量,这个变量只在函数内部有效,完全不会影响到全局的location。所以while循环每次判断的都是最初的全局location值,导致永远进入同一个房间函数,看起来逻辑没执行。

解决方法

方法1:使用global声明全局变量

在每个需要修改location的函数开头,添加global location语句,告诉Python你要操作的是全局作用域的location变量,而不是创建局部变量。

比如修改后的topLeft()函数:

def topLeft():
    global location  # 声明使用全局变量
    userInput=input('You can go south or east.')
    if userInput=='s':
        location=midLeft
    elif userInput=='e':
        location=top
    else:
        printError()

需要给所有修改location的函数都加上这行声明。

方法2:用类封装状态(更推荐)

对于RPG这种有状态的程序,用面向对象的方式封装房间和玩家状态会更清晰,也能避免全局变量的问题。示例:

class Player:
    def __init__(self):
        self.location = 'mid'
        # 定义房间映射
        self.rooms = {
            'topLeft': {'desc': 'You can go south or east.', 'directions': {'s': 'midLeft', 'e': 'top'}},
            'top': {'desc': 'You can go south, east, or west.', 'directions': {'s': 'mid', 'e': 'topRight', 'w': 'topLeft'}},
            'topRight': {'desc': 'You can go south or west.', 'directions': {'s': 'midRight', 'w': 'top'}},
            'midLeft': {'desc': 'You can go north, south or east.', 'directions': {'n': 'topLeft', 's': 'botLeft', 'e': 'mid'}},
            'mid': {'desc': 'You can go north, south, east, and west.', 'directions': {'n': 'top', 's': 'bot', 'e': 'midRight', 'w': 'midLeft'}},
            'midRight': {'desc': 'You can go north, south, west.', 'directions': {'n': 'topRight', 's': 'botRight', 'w': 'mid'}},
            'botLeft': {'desc': 'You can go north or east.', 'directions': {'n': 'midLeft', 'e': 'bot'}},
            'bot': {'desc': 'You can go north, east, or west.', 'directions': {'n': 'mid', 'e': 'botLeft', 'w': 'botRight'}},
            'botRight': {'desc': 'You can go north or west.', 'directions': {'n': 'midRight', 'w': 'bot'}}
        }

    def move(self):
        room = self.rooms[self.location]
        user_input = input(room['desc'] + ' ')
        if user_input in room['directions']:
            self.location = room['directions'][user_input]
        else:
            print("You can't go that way!")

player = Player()
while True:
    print(player.location)
    player.move()

这种方式把玩家状态和房间逻辑封装在一起,代码更简洁,也更容易扩展(比如添加物品、敌人等)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 10:36:00