Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在对象中获取字典变量?_Python_Python 3.x_List_Dictionary - Fatal编程技术网

Python 如何在对象中获取字典变量?

Python 如何在对象中获取字典变量?,python,python-3.x,list,dictionary,Python,Python 3.x,List,Dictionary,我正在写一个类似口袋妖怪的回合基地战斗模拟器。我已经做得很好了,但我有个问题。我试图把这些动作写成字典,这样我就可以为它的对象中的每个怪物指定动作集。这样我就有了一本字典,里面有他们所有的动作和伤害。然后我把这些动作传给怪物,它们就是目标。这让我可以给每个怪物提供唯一的移动集,而不必指定每次移动造成的伤害。我遇到的问题是在while循环中,当用户选择攻击时,我得到了错误 AttributeError: 'set' object has no attribute 'get' 我试图从用户输入的攻

我正在写一个类似口袋妖怪的回合基地战斗模拟器。我已经做得很好了,但我有个问题。我试图把这些动作写成字典,这样我就可以为它的对象中的每个怪物指定动作集。这样我就有了一本字典,里面有他们所有的动作和伤害。然后我把这些动作传给怪物,它们就是目标。这让我可以给每个怪物提供唯一的移动集,而不必指定每次移动造成的伤害。我遇到的问题是在while循环中,当用户选择攻击时,我得到了错误

AttributeError: 'set' object has no attribute 'get'
我试图从用户输入的攻击中获得伤害,从而从怪物1HP中减去伤害

如果我把字典放在对象中,它可以正常工作,但是每个对象都必须有自己的字典,我只想为所有移动设置一个字典,然后为其移动集中的每个对象指定移动,如果有意义的话

import random

class Monster:
  def __init__(self, name, types, hp, region, disc, strength, weakness, moveset):
    self.name = name
    self.type = types
    self.hp = hp
    self.region = region
    self.disc = disc
    self.strength = strength
    self.weakness = weakness
    self.moveset = moveset

moves_dict = {
    "hyperbeam": 14, 
    "flames": 34,
    "water": 27,
    "cent": 33,
    }


Ariol = Monster("Ariol", "shadow", 1000, "Xevor", "A monster from hell", "psychic", "electricity", {"hyperbeam", "flames", "water", "cent"})
Xenos = Monster("Xenos", "shadow", 300, "Xevor", "A monster from hell", "psychic", "electricity", {"hyperbeam", "flames", "water", "cent"})
Siance = Monster("Siance", "shadow", 500, "Xevor", "A monster from hell", "psychic", "electricity", {"hyperbeam", "flames", "water", "cent"})
Mammy = Monster("Mammy", "shadow", 3000, "Xevor", "A monster from hell", "psychic", "electricity", {"hyperbeam", "flames", "water", "cent"})

def choose_monster():

    monster_menu = {
    "Ariol" : Ariol,
    "Xenos" : Xenos,
    "Siance" : Siance,
    "Mammy" : Mammy,

    }

    #choosemonster
    trainer_monster = input("What monster do you want to use?\n")
    #variable is holding monster chosen
    monster_chosen1 = monster_menu.get(trainer_monster)
    #get monster 1 hp
    computer_choose = random.choice(list(monster_menu))
    computer_chosen1 = monster_menu[computer_choose]
    print("You chose", monster_chosen1.name,"!")
    print("Your opponenet chose", computer_chosen1.name, "!")

    #this dict not used
    moveset_dict = {
    "1": 14, 
    "2": 34,
    "3": 27,
    "4": 33,
    }

    #how to get monster hp from above
    #monster1hp = Ariol.hp
    monster1hp = monster_chosen1.hp
    monster2hp = computer_chosen1.hp

    while monster1hp or monster2hp <= 0:
            #monster1 moveset
            for x in monster_chosen1.moveset:
                print(x)
            choose_attack = input("What move would you like to use?\n")
            attack_chosen = monster_chosen1.moveset.get(choose_attack)
            monster2hp = monster2hp - attack_chosen
            print(monster_chosen1.name, "used ", attack_chosen, computer_chosen1.name, "has", monster2hp, "hp")
            if monster2hp <= 0:
                print(computer_chosen1.name, "was knocked out", monster_chosen1.name, "wins!")
                break
            attack_chosen = random.choice(list(computer_chosen1.moveset))
            monster1hp -= computer_chosen1.moveset[attack_chosen]
            print(computer_chosen1.name, "used", attack_chosen, monster_chosen1.name, "has", monster1hp, "hp")
            if monster1hp <= 0:
                print(monster_chosen1.name, "was knocked out", computer_chosen1.name, "wins!")
                break

    else:
        print("Battle over")


choose_monster()
随机导入
类怪物:
定义初始(自我、名称、类型、hp、地区、光盘、优势、劣势、移动集):
self.name=名称
self.type=类型
self.hp=hp
self.region=区域
self.disc=disc
自我力量=力量
自我软弱=软弱
self.moveset=moveset
移动\u dict={
“超团队”:14,
“火焰”:34,
“水”:27,
“分”:33,
}
Ariol=怪物(“Ariol”、“shadow”、1000、“Xevor”、“来自地狱的怪物”、“通灵者”、“电”、“超光速”、“火焰”、“水”、“分”)
Xenos=怪物(“Xenos”、“影子”、“300”、“Xevor”、“地狱中的怪物”、“通灵者”、“电”、“超光速”、“火焰”、“水”、“分”)
Siance=怪物(“Siance”、“阴影”、“500”、“Xevor”、“地狱怪物”、“通灵者”、“电”、“超光速”、“火焰”、“水”、“分”)
奶妈=怪物(“奶妈”,“影子”,3000,“西弗”,“地狱怪物”,“通灵者”,“电”,“超光速”,“火焰”,“水”,“分”)
def choose_monster():
怪物菜单={
“Ariol”:Ariol,
“氙气”:氙气,
“Siance”:Siance,
“嬷嬷”:嬷嬷,
}
#选择者
trainer\u monster=输入(“您想使用什么怪物?\n”)
#变量被选中
怪物_chosen1=怪物_菜单。获取(驯兽师_怪物)
#获得怪物1点生命
计算机选择=随机选择(列表(怪物菜单))
计算机选择1=怪物菜单[计算机选择]
打印(“您选择的”,monster_chosen1.name,“!”)
打印(“您的对手选择的”,computer_chosen1.name,”!)
#这句话没有用
moveset_dict={
"1": 14, 
"2": 34,
"3": 27,
"4": 33,
}
#如何从上面获得怪物生命
#怪物1hp=Ariol.hp
怪物1hp=monster_chosen1.hp
monster2hp=计算机_chosen1.hp

而monster1hp或monster2hp则是问题最后一段的一种解决方案:

您可以在类中设置字典而不使用self,当您为其中一个对象更新字典时,它也会为所有其他对象更新字典。这称为类变量

下面是我编写的一个示例,向您展示我的意思:

class testGlobal:
    def __init__(self):
        here_for_no_real_reason = True

    testDict = {'hello': 'hello', 'goodbye': 'goodbye'}


def driver():
    obj1 = testGlobal()
    obj2 = testGlobal()

    print(obj1.testDict)
    print(obj2.testDict)

    obj1.testDict["I'm new"] = "I'm new"
    obj2.testDict['hello'] = "goodbye"

    print(obj1.testDict)
    print(obj2.testDict)


driver()
输出:

{'hello': 'hello', 'goodbye': 'goodbye'}
{'hello': 'hello', 'goodbye': 'goodbye'}
{'hello': 'goodbye', 'goodbye': 'goodbye', "I'm new": "I'm new"}
{'hello': 'goodbye', 'goodbye': 'goodbye', "I'm new": "I'm new"}
从这个输出可以看出,当您使用obj1更改字典中的某些内容时,它也会更改obj2的内容,反之亦然。希望这有帮助

如果您还有任何问题,请告诉我,我很乐意尝试帮助您

您的问题是这一行(我只举一个怪物为例)

在这里,您将他的攻击定义为一组选项。而且集合没有get方法

因此,您必须从moves_dict中获取您的dmg值:

choose_attack = input("What move would you like to use?\n")
while not choose_attack in monster_chosen1.moveset: #check if the move is in the moveset
    choose_attack = input("Invalid Move\n") # if not in the moveset try again
attack_chosen = moves_dict.get(choose_attack) # take the dmg value from the moves_dict which has a get method.
当然,如果你想让每个怪物都有不同的dmg值,你可以用一个dict来替换这个集合,这样你就可以用dmg值来玩游戏,这会使移动变得过时

类似的变化与计算机选择的攻击有关。但因为他总是选择有效的动作,他当然不需要一个while循环。但dmg值必须取自移动指令

monster1hp -= moves_dict[attack_chosen]

好主意,但是计算机自动攻击可能会遇到一些问题,因为如果计算机选择一个无效的攻击,那么选择一个有效的攻击可能需要很长时间。计算机将永远不会选择无效的攻击,因为他使用您为怪物定义的移动集。。人类如果输入错误或其他东西,就容易出错。我在我的答案中加了一句,计算机不需要一个while循环。明白了!那么我应该为计算机代码更改什么呢?我现在正在看,非常感谢你,这对我帮助很大,我贴的这条线不需要返工。可能会更改一些变量名并修改打印输出,因为它们有时有点错误,例如:attack_selected=>dmg_value(因为它是一个数字),并且使用两个变量交换名称并不是一种好的编码方式。这有点令人困惑。选择攻击是你要做的事情,所以我首先认为它是一个函数,但它是一个状态,所以“选择攻击”更适合。首先,用户输入攻击的名称,所以你实际上不需要从集合中检索它,你可以直接使用
选择攻击
第二,这与你最初的问题无关,但是你让用户输入一个字符串,所以他们的输入可能会被输入错误。如果你把
moveset
做成字典,比如
{1:“hyperbeam”,2:“flames”,3:“water”,4:“cent”}
,用户只需输入一个数字,这是一个非常有限的选择。那么你的代码就会work@Arseny这根本行不通。当然,他不会得到get错误,但他会得到另一个错误,因为他试图从整数中减去字符串。当然,选择整数作为键可以减少输入错误的几率,但是玩一个必须输入数字的游戏真的很有趣吗?即使你改变了它,你仍然需要检查输入是否正确。当用户输入-1时,您会做什么?所以变化不大。这是他的风格,选择字符串,这是罚款在我的眼睛。他想要
monster1hp -= moves_dict[attack_chosen]