Python 将程序拆分为多个文件

Python 将程序拆分为多个文件,python,pygame,Python,Pygame,我正在尝试制作一个游戏,我正在尝试将主程序漂亮地分割成更多的文件。我试图将所有图像放在另一个文件中,但当我运行主程序时,它显示一个错误,即我正在使用的列表不存在,但实际上它们在我导入的另一个文件中。我将把我的GitHub链接留在这里,这样你就可以更好地理解我的意思 将final_game.py中的导入语法更改为: from images123 import * 这将把所有变量、函数、类、对象等从images123.py导入final_game.py,前提是它位于同一目录中。将final_gam

我正在尝试制作一个游戏,我正在尝试将主程序漂亮地分割成更多的文件。我试图将所有图像放在另一个文件中,但当我运行主程序时,它显示一个错误,即我正在使用的列表不存在,但实际上它们在我导入的另一个文件中。我将把我的GitHub链接留在这里,这样你就可以更好地理解我的意思


将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)来解决这个问题
。这实际上是一个很好的例子,说明了您的代码以前是如何不正确的,但您没有意识到这一点,因为您只是将代码留在了
全局范围内。如果您在
最终游戏
中离开了
玩家
子弹
,而将主循环变为自己的功能,则会出现同样的错误