Я получаю эту ошибку -> TypeError: строковые индексы должны быть целыми числами - PullRequest
0 голосов
/ 03 мая 2018

Я пытаюсь научиться объектно-ориентированному программированию, создав текстовую RPG, которая показана ниже. Части этого, которые связаны с моим вопросом:

    def equipArmor(self):
        for armor in self.armorsOwned:
            select = 1
            if self.armor == armor:
                print(str(select) + ". " + str(armor["Name"]) + " (Equipped)")
            else:
                print(str(select) + ". " + str(armor["Name"]))
            select += 1
        armor_choice = input("Type the name of the armor you would like to equip\n")
        for i in self.armorsOwned:
            if armor_choice == i["Name"]:
                if self.armor == i:
                    print("You already have that equipped")
                else:
                    self.armor = i["Name"]
                    print("You equipped the {}".format(i["Name"]))
                    self.maxhp += i["Effect"]

и

class Shop:

    armors = {"BronzeArmor":{"Name": "Bronze armor",
                             "Cost": 30,
                             "Effect": 10},
              "SilverArmor":{"Name": "Silver armor",
                             "Cost": 75,
                             "Effect": 20}}

Вот остальные, чтобы вы могли понять контекст моего кода:

import time
import sys

class Player:

    def __init__(self):
        self.level = 1
        self.exp = 0
        self.gold = 0
        self.maxhp = 20
        self.hp = self.maxhp
        self.attack = 1
        self.weapon = ""
        self.armor = ""
        self.weaponsOwned = {}
        self.armorsOwned = {}

    def checkHp(self):
        self.hp = max(0, min(self.hp, self.maxhp))

    def deadCheck(self):
        if self.hp == 0:
            print("You died!")
            sys.exit()

    def equipArmor(self):
        for armor in self.armorsOwned:
            select = 1
            if self.armor == armor:
                print(str(select) + ". " + str(armor["Name"]) + " (Equipped)")
            else:
                print(str(select) + ". " + str(armor["Name"]))
            select += 1
        armor_choice = input("Type the name of the armor you would like to equip\n")
        for i in self.armorsOwned:
            if armor_choice == i["Name"]:
                if self.armor == i:
                    print("You already have that equipped")
                else:
                    self.armor = i["Name"]
                    print("You equipped the {}".format(i["Name"]))
                    self.maxhp += i["Effect"]

class Enemy:

    def __init__(self, attack, maxhp, exp, gold):
        self.exp = exp
        self.gold = gold
        self.maxhp = maxhp
        self.hp = maxhp
        self.attack = attack

    def checkHp(self):
        self.hp = max(0, min(self.hp, self.maxhp))

    def enemyDeadCheck(self):
        if self.hp == 0:
            return True

class Shop:

    armors = {"BronzeArmor":{"Name": "Bronze armor",
                             "Cost": 30,
                             "Effect": 10},
              "SilverArmor":{"Name": "Silver armor",
                             "Cost": 75,
                             "Effect": 20}}

character = Player()
character.armorsOwned.update(Shop.armors["BronzeArmor"])
character.equipArmor()

То, что я пытаюсь сделать, это распечатать все имеющиеся у меня доспехи, напечатать «экипированную» рядом с ними, если она экипирована, получить название доспеха для экипировки со входа, проверить, уже ли оно экипировано, и затем экипировать. это если он не оборудован. Однако ошибка, упомянутая в названии, мешает мне сделать это. Почему это так и что такое строковый индекс?

Ответы [ 3 ]

0 голосов
/ 03 мая 2018

Циклы по словарям (например, for i in self.armorsOwned) возвращают итерацию из ключей , а не записей. Таким образом, i устанавливается для ключевой строки, а не словаря брони.

Вы хотите превратить все свои циклы над словарями в что-то вроде:

for i in self.armorsOwned.values():

0 голосов
/ 03 мая 2018

Недостаточно очков, чтобы комментировать, поэтому публикуйте как ответ. Эта ошибка обычно выдается при обработке списка как словаря.

Было бы полезно, если бы вы могли включить #line, которая показывает ошибку, чтобы я мог точно определить, но для меня это выглядит подозрительно:

self.armorsOwned = {}

Если это просто словарь брони. В таком случае, вот как вы должны извлечь имя брони:

        if self.armor == armor:
            print(str(select) + ". " + str(self.armorsOwned[armor]["Name"]) + " (Equipped)")
        else:
            print(str(select) + ". " + str(self.armorsOwned[armor]["Name"]))

Вы также можете попробовать распечатать значения этих переменных, чтобы увидеть, что они содержат, прежде чем выполнять какие-либо манипуляции со строками:

def equipArmor(self):
        print(self.armorsOwned)
        for armor in self.armorsOwned:
            print(armor)
            select = 1
0 голосов
/ 03 мая 2018

TypeError: string indices must be integers - очень распространенная ошибка в Python, особенно во время разработки. Это означает, что ваша переменная является строкой, но вы пытаетесь использовать ее в качестве словаря.

пример:

x = {'Name': 'Bronze Armor'}
print(x['Name']) #    Bronze Armor

x = 'Bronze Armor'
print(x['Name']) #    raises TypeError: string indices must be integers

Посмотрите на трассировку стека ошибок, она покажет вам, в какой строке вы допустили ошибку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...