让模块文件使用全局变量吗?

时间:2016-12-02 21:37:22

标签: python module global

请原谅我,如果这只是一个非常简单的解决方案,因为我对Python很陌生。现在我正在尝试制作一个基本的视频游戏,为了节省空间,我决定为战斗遇到一个模块 - 所以我在为每次遭遇编写代码时所要做的就是在该模块中运行该功能,只需要写出敌人的独特变量。但是,代码需要知道玩家的HP,或者玩家拥有什么样的武器。我尝试将global放在函数模块中的变量之前,但当然它不起作用,因为它引用模块中的全局变量,而不是主游戏文件。或者还有另一种方法可以解决这个问题吗?如果您需要我附上我的代码,我很乐意这样做。

编辑:继承模块中的代码(称为combat)。我想要它做的是主文件的代码只会说:

combat.combat(3, "mysterious creature", 12, 2, 4, 3, "claws", 5, 0)

根据我的浅薄理解,我是如何编辑每个oppoent的变量,它来自模块文件中的这一行。

def combat(enemylevel, enemyname, enemyhp, enemydefense, enemystrength,
           enemyattack, enemyweaponattack, enemygp, run):

根据你们的困惑,我猜我正在做一些非常基本的错误。原谅我(最有可能)令人畏惧和无效的代码编写:

import random
import math
def combat(enemylevel, enemyname, enemyhp, enemydefense, enemystrength, 
           enemyattack, enemyweaponattack, enemygp, run):
    global xp
    global hp
    global maxhp
    global gp
    global weapon_attack
    global weapon
    levelandname = "level" , enemylevel, enemyname
    print("You draw your weapon and prepare for battle. You are fighting a",
          levelandname, ".")
    while enemyhp > 0:
        if enemyhp > 0:
            print()
            attackorrun = input("Do you wish to attack or run? ")
            if attackorrun == "attack" or "a":
                print("You" , weapon_attack , "your" , weapon, "at the",
                      enemyname) # this is where the first error happens,
                                 # says weapon_attack isn't defined.
                attackroll = random.randint(1, 20)
                attackroll = (attackroll+(math.floor(attack/2)))

我可能仍然留下一些不清楚的东西,随时告诉我做别的事情或者问我一些事情。

1 个答案:

答案 0 :(得分:0)

使用大量全局变量可能会变得混乱。它没有为您提供很大的灵活性,而且正如您发现的那样,很难从其他模块中访问这些变量。

许多程序员会避免在函数中使用全局语句,函数需要的任何数据都应该通过其他方式提供。

使用容器对象可能是一个良好的开端,将相关变量保持在一起,可能在dictionary中。你可以将一个敌人的词典(有hp,防御,力量等)和一个玩家dict(xp,hp,武器等)传递给你的函数。这将使您可以访问函数中的这些值,并且该函数甚至可以修改这些值(因为您将传递object reference)。

enemy = {'hp': 100, 'weapon': 'axe', 'strength': 50}
player = {'xp': 22, 'hp': 150, 'weapon': 'sword'}
def combat(player, enemy):
    #calculate results of combat
    player['hp'] = player['hp'] - damage

另一种策略可能是使用classes。类是可以包含函数和变量的对象定义。您可以实例化您的类的多个实例。例如,Enemy对象(Enemy类的实例)将包含敌人hp变量,以及在战斗期间修改它的函数。