将程序拆分成多个文件

时间:2018-11-14 14:09:19

标签: python pygame

我正在尝试制作游戏,并且试图将主程序精美地拆分为更多文件。我试图将所有图像放在另一个文件中,但是当我运行主程序时,它显示一个错误,提示我正在使用的列表不存在,但实际上它们在我导入的另一个文件中。我将在此处保留我的GitHub链接,以便您可以更好地理解我的意思。

https://github.com/20nicolas/game.git

2 个答案:

答案 0 :(得分:2)

请注意您如何导入images123,然后从final_game导入。这不是一个很好的模式,因为它会导致循环导入。尽管循环导入 可以起作用,但它们可能会在各个方面导致问题。

就目前而言,您的问题与导入无关,而与编写代码的方式更多有关。您希望图像大小基于您的 player 对象(这就是为什么您需要final_game.man才能运行images123的原因),因此具有作为 player 对象初始化的一部分。最终,您可能想使用子类进一步将其删除,但是现在,我只是建议添加一种方法来处理它。这还将使大多数图像变量脱离全局空间,从长远来看将为您提供帮助。

例如:

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,并从import final_game中删除images123和其他相关行。您可能还决定(由于Player现在有更多内容),您想要像将图像移到另一个文件一样,将playerbullets移到另一个文件中。

您还可以进行其他一些结构上的更改以加强代码,但这只是学习过程的一部分,其余部分由您自己决定。恭喜您完成了许多工作,并祝其他人好运:)

答案 1 :(得分:0)

将final_game.py中的导入语法更改为:

module FACINGS
  NORTH = [0, 1]
  SOURTH = [0, -1]
  EAST =  [1, 0]
  WEST =  [-1,0]
end

class Robot
  attr_reader :position

  def initialize(attr = {})
    @position = attr[:position] || [1, 1]
  end

  def move(facings)
    @position[0] += facings[0]
    @position[1] += facings[1]
  end
end

r = Robot.new
r.move(FACINGS::NORTH)
r.move(FACINGS::SOURTH)
r.move(FACINGS::WEST)
r.move(FACINGS::EAST)

这会将所有的变量,函数,类,对象等从images123.py导入到final_game.py,前提是该文件位于同一目录中。