Über eine variable Liste iterieren

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Welpe
User
Beiträge: 28
Registriert: Mittwoch 30. Dezember 2020, 10:39

Hallo,

ich möchte ein Inventarsystem für ein Spiel erstellen. Der Händler im Spiel hat eine unbestimmt Anzahl von Gegenständen, die sich der Spieler anzeigen lassen kann. Dies machen ich über Listen mit statischem Code. Dies möchte ich gerne automatisieren, da ich nicht vorhersagen kann, wie viele Objekte in der Liste sind.

Den kompletten Code vom Spiel schreibe ich jetzt hier nicht rein da es den Rahmen sprengen würde. Ich denke man sieht auch so was ich meine, nämlich die Funktion "bye" am Ende...

Code: Alles auswählen

class Store():
    def __init__(self,player,items,weapons,armors):
        self.name = "Händler"
        self.items = items
        self.weapons = weapons
        self.armors = armors
 
    def status(self, player):
            print(self.name + " wird angesprochen")
            self.menu(player)

    def menu(self,player):
        print("Händler Menü")
        print("(K)aufen | (V)erkaufen | (Z)urück")

        user_input = player.user_input()

        if user_input == "K":
            print("Kaufen")
            print("Kaufe (G)egenstand | (W)affe | (R)üstung | (ENTER) für Zurück")
            user_input = player.user_input()

            if user_input == "G":
                print("Kaufe Gegenstand")
                self.buy(player,self.items,player.items)
            elif user_input == "W":
                print("Kaufe waffe")
                self.buy(player,self.weapons,player.weapons)
            elif user_input == "R":
                print("Kaufe Rüstung")
                self.buy(player,self.armors,player.armors)


        elif user_input == "V":
            print("Verkaufen")
            print("Verkaufe (G)egenstand | (W)affe | (R)üstung | (ENTER) für Zurück")
            user_input = player.user_input()

            if user_input == "G":
                print("Veraufe Gegenstand")
                self.sell(player,self.items,player.items)
            elif user_input == "W":
                print("Verkaufe Waffe")
                self.sell(player,self.weapons,player.weapons)
            elif user_input == "R":
                print("Verkaufe Rüstung")
                self.sell(player,self.armors,player.armors)

        elif user_input == "Z":
            print(player.name + " geht fort...")
        
        else:
            self.menu(player)

    def buy(self,player,store_obj_list,player_obj_list):
        print(player.name + " kauft")
        i = 0
        for obj in store_obj_list:    
            i += 1
            print(f'{str(i)} - {obj.name} (Schaden: {obj.dmg_value}, Rüstung: {obj.ar_value}, Gold: {str(obj.gp_value)})')

        print(f'Welche Nummer möchtest Du kaufen 1-{str(len(store_obj_list))}')

        user_input = player.user_input()

        try:
            if user_input == "1":
                if player.gold >= store_obj_list[0].gp_value:
                    print("Kaufe " + store_obj_list[0].name)
                    player.gold -= store_obj_list[0].gp_value
                    player_obj_list.append(store_obj_list[0])
                    store_obj_list.remove(store_obj_list[0])
                else:
                    print("Nicht genug Gold")
     
            if user_input == "2":
                if player.gold >= store_obj_list[1].gp_value:
                    print("Kaufe " + store_obj_list[1].name)
                    player.gold -= store_obj_list[1].gp_value
                    player_obj_list.append(store_obj_list[1])
                    store_obj_list.remove(store_obj_list[1])
                else:
                    print("Nicht genug Gold")
     
            if user_input == "3":
                if player.gold >= store_obj_list[2].gp_value:
                    print("Kaufe " + store_obj_list[2].name)
                    player.gold -= store_obj_list[2].gp_value
                    player_obj_list.append(store_obj_list[2])
                    store_obj_list.remove(store_obj_list[2])
                else:
                    print("Nicht genug Gold")
     
        except:
            print("Nichts da...")
            
        self.menu(player)    
Ich übergebe eine store_obj_list und möchte mir zu jedem Objekt in dieser Liste die Eigenschaften anzeigen lassen.
Also quasi so:
if user_input == "1" --> store_obj_list[0]
if user_input == "2" --> store_obj_list[1]
if user_input == "3" --> store_obj_list[2]

Es ändert sich ja nur der Listenindex entsprechend dem User input. der Rest ist ja immer das selbe. Kann man so etwas nicht auch mit einer Schleife oder dergleichen machen? Ich steh grad auf dem Schlauch und komm leider nicht drauf.
Sirius3
User
Beiträge: 17844
Registriert: Sonntag 21. Oktober 2012, 17:20

Rekursion ist kein Ersatz für eine Schleife, also statt menu oder buy am Schluß wieder menu aufruft, brauchst Du eine Schleife in menu, die bei user_input == "Z" verlassen wird.
`items`, `weapons` und `armor` müssen in einer entsprechenden Datenstruktur gespeichert werden, so dass die if-Abfragen überflüssig werden. Und genauso hast Du bei store_obj_list schon eine entsprechende Datenstruktur, nämlich eine Liste, auf die man einfach per Index zugreifen kann. Der Index ist `int(user_input) - 1`.
Benutze keine nackten Excepts, weil damit auch viele Programmierfehler verschluckt werden, und so die Fehlersuche unmöglich wird. Du benutzt f-Strings sehr inkonsequent. ´str` ist bei f-Strings unnötig:

Code: Alles auswählen

        print(f"{player.name} kauft")
        for index, obj in enumerate(store_obj_list, 1):
            print(f'{index} - {obj.name} (Schaden: {obj.dmg_value}, Rüstung: {obj.ar_value}, Gold: {obj.gp_value})')
Welpe
User
Beiträge: 28
Registriert: Mittwoch 30. Dezember 2020, 10:39

Vielen Dank für deine konstruktive Kritik und die Hilfe. Ich werde das überarbeiten.
Antworten