Python 将程序拆分为多个文件
我正在尝试制作一个游戏,我正在尝试将主程序漂亮地分割成更多的文件。我试图将所有图像放在另一个文件中,但当我运行主程序时,它显示一个错误,即我正在使用的列表不存在,但实际上它们在我导入的另一个文件中。我将把我的GitHub链接留在这里,这样你就可以更好地理解我的意思Python 将程序拆分为多个文件,python,pygame,Python,Pygame,我正在尝试制作一个游戏,我正在尝试将主程序漂亮地分割成更多的文件。我试图将所有图像放在另一个文件中,但当我运行主程序时,它显示一个错误,即我正在使用的列表不存在,但实际上它们在我导入的另一个文件中。我将把我的GitHub链接留在这里,这样你就可以更好地理解我的意思 将final_game.py中的导入语法更改为: from images123 import * 这将把所有变量、函数、类、对象等从images123.py导入final_game.py,前提是它位于同一目录中。将final_gam
将final_game.py中的导入语法更改为:
from images123 import *
这将把所有变量、函数、类、对象等从images123.py导入final_game.py,前提是它位于同一目录中。将final_game.py中的导入语法更改为:
from images123 import *
这将把所有变量、函数、类、对象等从images123.py导入final_game.py,前提是它位于同一目录中。注意如何导入
images123
,然后从final_game
导入。这不是一个很好的模式,因为它会导致循环导入。虽然循环进口可以发挥作用,但它们可能会在不同方面引发问题
目前,您的问题和导入关系不大,更多的是和您如何编写代码有关。您希望您的图像大小基于玩家对象(这就是为什么您需要最终游戏.man
才能运行图像123
),因此将其作为玩家对象初始化的一部分更有意义。最终,您可能希望使用子类进一步删除它,但现在我只建议添加一个方法来处理它。这也将使大多数图像变量脱离全局空间,从长远来看这将对您有所帮助
例如:
class Player():
def __init__(self, [etc]):
[...]
self.formatsprites()
def formatsprites(self):
self.idle = [py.transform.scale(img,(self.width,self.length)) for img in image123.idle]
self.run_right = [py.transform.scale(img,(man.width,man.length)) for img in image123.run_right]
[...]
从那里,您可以调整代码以引用self.idle
(或任何可能的代码),而不是简单地idle
,并从images123
中删除import final_game
和其他相关行。您还可以决定(因为Player
中现在有更多内容)将Player
和bullets
移动到另一个文件中,就像您对图像所做的那样
您还可以进行一些其他结构更改来收紧代码,但这是学习曲线的一部分,其余部分由您决定。祝贺你完成了这么多,祝你好运:)注意你是如何导入
图像123
,然后从最终游戏导入的。这不是一个很好的模式,因为它会导致循环导入。虽然循环进口可以发挥作用,但它们可能会在不同方面引发问题
目前,您的问题和导入关系不大,更多的是和您如何编写代码有关。您希望您的图像大小基于玩家对象(这就是为什么您需要最终游戏.man
才能运行图像123
),因此将其作为玩家对象初始化的一部分更有意义。最终,您可能希望使用子类进一步删除它,但现在我只建议添加一个方法来处理它。这也将使大多数图像变量脱离全局空间,从长远来看这将对您有所帮助
例如:
class Player():
def __init__(self, [etc]):
[...]
self.formatsprites()
def formatsprites(self):
self.idle = [py.transform.scale(img,(self.width,self.length)) for img in image123.idle]
self.run_right = [py.transform.scale(img,(man.width,man.length)) for img in image123.run_right]
[...]
从那里,您可以调整代码以引用self.idle
(或任何可能的代码),而不是简单地idle
,并从images123
中删除import final_game
和其他相关行。您还可以决定(因为Player
中现在有更多内容)将Player
和bullets
移动到另一个文件中,就像您对图像所做的那样
您还可以进行一些其他结构更改来收紧代码,但这是学习曲线的一部分,其余部分由您决定。祝贺你完成了这么多工作,祝你好运:)通常应该避免。通常应该避免。我建议阅读一些导入教程(如下所示)。我建议阅读一些导入教程(如下所示)。啊,我错过了两个模块相互导入的机会。我完全同意你的观点,重新构造代码会更好。因此,基本上,如果两个模块中都有相互影响的变量,我就不能创建新的模块。例如,如果我想为类播放器制作一个模块,为主循环制作一个模块,我不能,因为主循环需要播放器x,y等,但播放器也需要上传x,y等的主循环。冒着学究的风险:你可以,只是你通常不应该这样做,如果你需要在一个模块中使用所有的代码,这通常表明你的代码没有足够的隔离。不过,在你的具体例子中,将player
移出将不会导致任何问题man=player(100430100100)
使用x和y值初始化player类:这些值完全独立于该点的主循环。当man
在draw
中检查这些值时,它们不会返回到程序的任何其他部分<代码>屏幕
(来自主循环)被传递到函数中,这意味着玩家
没有伸手进入最终游戏
来检索它。您可以将子弹.draw
定义为def draw(self,**win**)
这意味着draw
引用传递给它的变量win
(而不是像您期望的那样screen
)。我认为应该通过将定义更改为def draw(self,screen)来解决这个问题
。这实际上是一个很好的例子,说明了您的代码以前是如何不正确的,但您没有意识到这一点,因为您只是将代码留在了全局范围内。如果您在最终游戏
中离开了玩家
和子弹
,而将主循环变为自己的功能,则会出现同样的错误