如何修复自定义模块中的“变量未定义”

2024-07-04 17:01:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我目前仍在学习python,但到目前为止做得很好,所以我决定承担一个更大的项目,在这个项目中,我构建了一个简短的基于文本的游戏,并使用自定义模块来分离代码。不幸的是,我遇到了许多复杂的问题,并用一些谷歌和耐心修复了这些问题,但这一个是难倒我。你知道吗

问题本身是我有两个正在处理的文件:主.py以及房间Class.py. 在主.py有对输入的请求和将输入转换为lower的命令,但是我尝试将该输入转换为中的函数游戏室.py它就是不起作用。你知道吗

任何帮助是非常感谢,如果我在这个职位上做了什么错误,请让我知道。我是stackoverflow的新手,我可以接受任何我能得到的建议。你知道吗

我试图在单个模块中全局地分配它,但是我必须再次定义输入变量,这会导致我的代码弹出一个无用的输入点。你知道吗

也尝试将main导入文件,但这会在gameRooms和main之间创建太多依赖项。你知道吗

你知道吗主.py你知道吗

userInput = input('\nWhat shall you do? :> ')
gameInput = userInput.lower()

你知道吗游戏室.py你知道吗

class Rooms():

    def __init__(self, pos, name, desc, exits, status, nLock, sLock, eLock, wLock):
        self.pos = pos
        self.name = name
        self.desc = desc
        self.exits = exits
        self.status = status
        self.nLock = nLock
        self.sLock = sLock
        self.eLock = eLock
        self.wLock = wLock

    def lookRoom(self):
        global userInput
        global gameInput

        if gameInput in cfg.lookList and self.pos == cfg.xyMap:
            print(f"\n{self.name}")
            print(f"\n\t{self.desc}")

这只是模块的一小部分,但正是我试图解决的问题。主要是lookRoom中的gameInput(self):。你知道吗

我希望它能让我使用主.py但是输出只是说gameInput没有定义。你知道吗


Tags: 模块namepyposself游戏statusdesc
1条回答
网友
1楼 · 发布于 2024-07-04 17:01:51

首先,您应该对代码进行一些更改,这些更改将使您的代码听起来更像Pythonic。你知道吗

更改main.py,将代码放入一个带有return的函数中:

def game_input():
    userInput = input('\nWhat shall you do? :> ')
    gameInput = userInput.lower()

    return gameInput

变化gameRooms.py

  • 应该在构造函数类中添加一个新变量gameInput。你知道吗
  • 对你的功能做些改变lookRoom()。你知道吗
  • 导入模块main.py。你知道吗
import main

class Rooms():

    def __init__(self, pos, name, desc, exits, status, nLock, sLock, eLock, wLock, gameInput):
        self.pos = pos
        self.name = name
        self.desc = desc
        self.exits = exits
        self.status = status
        self.nLock = nLock
        self.sLock = sLock
        self.eLock = eLock
        self.wLock = wLock

        self.gameInput = gameInput

    def lookRoom(self):

        if self.gameInput in cfg.lookList and self.pos == cfg.xyMap:
            print(f"\n{self.name}")
            print(f"\n\t{self.desc}")

现在,当您创建一个新对象Rooms()时,您必须通知所有参数,甚至参数gameInput

看一看:

if __name__ == '__main__':

    gameInput = main.game_input()

    r1 = Rooms("a", "b", "c", "d", "e", "f", "g", "h", "i", gameInput)
    #r1.lookRoom()

您甚至可以使用while语句强制用户通知gameInput,下面是一个示例:

if __name__ == '__main__':

    while True:
        gameInput = main.game_input()

        if gameInput == "":
            print("Type your name correctly!")
        else:
            break

    r1 = Rooms("a", "b", "c", "d", "e", "f", "g", "h", "i", gameInput)    
    #r1.lookRoom()


编辑1:

gameRooms.py

class Rooms():

    def __init__(self, pos, name, desc, exits, status, nLock, sLock, eLock, wLock, gameInput):
        self.pos = pos
        self.name = name
        self.desc = desc
        self.exits = exits
        self.status = status
        self.nLock = nLock
        self.sLock = sLock
        self.eLock = eLock
        self.wLock = wLock

        self.gameInput = gameInput

    def lookRoom(self):
        if self.gameInput in cfg.lookList and self.pos == cfg.xyMap:
            print(f"\n{self.name}")
            print(f"\n\t{self.desc}")

main.py

from gameRooms import *

def game_input():
    userInput = input('\nWhat shall you do? :> ')
    gameInput = userInput.lower()

    return gameInput


if __name__ == '__main__':

    gameInput = game_input()

    r1 = Rooms("a", "b", "c", "d", "e", "f", "g", "h", "i", gameInput)
    #r1.lookRoom()

相关问题 更多 >

    热门问题