Seite 1 von 1

Objekte automatisch erstellen

Verfasst: Dienstag 8. März 2022, 13:29
von Smarrel
Liebe Python-Forum-Community,

vorweg: ich habe leider die Regeln nicht lesen können, da die Seite derzeit scheinbar nicht erreichbar ist und möchte daher im Vorfeld um Nachsicht bitten.
Ich habe bereits einige Threads durchgesehen, bin jedoch zu meinem Problem nicht fündig geworden. Falls ich einfach etwas übersehen habe, bin ich dankbar für einen Link zum entsprechenden Thread.

Ich habe vor ein Konsolenspiel zu schreiben, in dem man zu Beginn eine Abfrage hat wie viele Mitspieler an dem Spiel teilnehmen wollen. Die Spieler werden Reihum würfeln und dem Würfelergebnis (per randint erzeugt) erhalten sie einen Effekt bzw. Item etc. .
Ich habe mir überlegt ein Modul "Spiel.py" als Hauptprogramm zu erstellen und ein Modul "spieler.py" in dem die Funktion Spieler zu findne ist sowie ein Modul "wergerbnis" für die Funktionen der einzelnen Würfelergebnisse.
Im Hauptprogramm möchte ich mit dem folgenden Code beginnen:

Code: Alles auswählen

 print("Hallo! Wie viele Spieler wollen mitspielen?")
mitspielerzahl =  int(Eingabe_Spielerzahl())
print ("Mitspielerzahl: ",  mitspielerzahl)
for i in range (1, mitspielerzahl+1):
    spieler.Spieler() 
Unter spieler.Spieler befindet sich die Klasse Spieler, in der ich den Bauplan für die Spieler definiert habe:

Code: Alles auswählen

class Spieler:
    def __init__(self):
        self.nummer = int
        self.inventar = []
        self.status = 3 # Status des Spielers: 1 = tod , 2 = bewusstlos , 3 = lebendig
        self.score = 0

    def statuscheck(self):
        if self.status == 1:
            return ("tot")
        elif self.status == 2:
            return ("bewusstlos")
        elif self.status == 3:
            return ("lebendig")

    def score(self):
        return self.score

    def print_inventory(self):
        print("Inventory: ")
        for item in self.inventar:
            print('* ' + str(item))
Leider habe ich einen kleinen Knoten im Kopf. Wie kann ich die Spieler unterscheiden? Ich sehe momentan keine Möglichkeit den 1., 2. oder 3. Spieler im Programm anzusprechen um z.B. eine Änderung des entsprechenden Spielerstatus vorzunehmen oder einem bestimmten Spieler etwas ins Inventar hinzuzufügen.
In meinen Gedanken habe ich irgendetwas übersehen. Bislang möchte ich, dass folgendes passiert, damit ich den "i_" Spieler als Objekt aufrufen kann:

Code: Alles auswählen

for i in range (1, mitspielerzahl+1):
    [i][b]i_[/b][/i]spieler.Spieler() 
[/code]

Vielleicht hat jemand von euch eine Idee, wo mein Fehler liegt und wie ich das möglicherweise beheben könnte.

Viele Grüße
Smarrel

Re: Objekte automatisch erstellen

Verfasst: Dienstag 8. März 2022, 13:59
von Sirius3
Das Aufteilen im mehrere Module ist noch viel zu früh. Alle Deine Funktionen und Klassen sind so kurz, dass sie gut in einer einzigen Datei stehen können.
Was ist der Sinn, dass spieler.nummer als Wert die Klasse `int` hat? Die Methode ´score` wird durch das Attribut `score` überdeckt, die Methode kann ersatzlos gestrichen werden.

Du kennst schon Listen (inventar), und das selbe Prinzip mußt Du für die Spieler anwenden: eine Liste `alle_spieler` die alle Spieler-Instanzen enthält, dann kannst Du per for-Schleife auf die Spieler-Instanzen zugreifen.

Re: Objekte automatisch erstellen

Verfasst: Dienstag 8. März 2022, 15:21
von Smarrel
Danke für die schnelle Antwort und die Tipps.

Ich habe durch das zuweisen der spieler.nummer zum Ausdruck bringen wollen, dass es sich um einen Integer-Wert handeln muss. Ohne definition der spieler.nummer habe ich bei der Erstellung einen Fehler erhalten, wenn ich ihr nachträglich einen Wert zuweisen wollte. Die Methode score hat derzeit noch keine Funktion und kann tatsächlich so gestrichen werden, danke.

Ich habe dich so verstanden, dass ich für jeden Spieler einen Eintrag in der Liste alle_spieler vornehme und daraus dann die einzelnen Spieler entsprechend meiner Funktion Spieler erzeuge.

Code: Alles auswählen

 for i in range (mitspielerzahl):
    alle_Spieler.append(i) 

for i in range(len(alle_Spieler)):
    alle_Spieler[i] = Spieler()
Um auf die einzelnen Objekte dann zuzugreifen komme ich dann mit alle_Spieler[x].attribut weiter. Perfekt, genau das habe ich gesucht. Vielen Dank!

Re: Objekte automatisch erstellen

Verfasst: Dienstag 8. März 2022, 15:48
von Sirius3
Warum füllst Du erst die Liste mit Zahlen, um sie dann mit Spieler-Instanzen wieder zu überschreiben?

Code: Alles auswählen

from enum import Enum

class Status(Enum):
    tot = "tot"
    bewusstlos = "bewusstlos"
    lebendig = "lebendig"

class Spieler:
    def __init__(self, nummer):
        self.nummer = nummer
        self.inventar = []
        self.status = Status.lebendig
        self.score = 0

    def statuscheck(self):
        return status.value

    def print_inventory(self):
        print("Inventory:")
        for item in self.inventar:
            print(f"* {item}")

def main():
    print("Hallo! Wie viele Spieler wollen mitspielen?")
    mitspielerzahl =  int(eingabe_spielerzahl())
    print ("Mitspielerzahl: ",  mitspielerzahl)
    alle_spieler = [
        Spieler(i)
        for i in range(1, mitspielerzahl + 1)
    ]
    ...

if __name__ == "__main__":
    main()

Re: Objekte automatisch erstellen

Verfasst: Dienstag 8. März 2022, 18:44
von Smarrel
Danke, das sieht wesentlich eleganter aus.

Um eine Abfrage der Spielerzahl nicht zum Absturz führen zu lassen, sollte man sich mal vertippen habe ich folgende Funktion formuliert:

Code: Alles auswählen

def Eingabe_Spielerzahl():
    check = False
    while check is not True:
        spielerzahl = input("Spielerzahl: ")
        try:
            int(spielerzahl)
            check = True
            return spielerzahl
        except ValueError:
            print("Eingabe nicht zulässig. Bitte erneut versuchen") 

Re: Objekte automatisch erstellen

Verfasst: Dienstag 8. März 2022, 18:55
von __deets__
Wahrheitswerte mir is zu vergleichen ist ein Fehler. Die werden wenn mit == verglichen. Oder in diesem Fall einfach gar nicht:

while not check:

Das wars.

Re: Objekte automatisch erstellen

Verfasst: Dienstag 8. März 2022, 19:02
von ThomasL
Das geht simpler:

Code: Alles auswählen

def eingabe_spielerzahl():
    while True:
        try:
            spielerzahl = int(input("Spielerzahl: "))
            return spielerzahl
        except ValueError:
            print("Eingabe nicht zulässig. Bitte erneut versuchen") 

Re: Objekte automatisch erstellen

Verfasst: Dienstag 8. März 2022, 19:11
von Sirius3
`is` prüft, ob es sich um das selbe Objekt handelt. Das ist selten nötig und findet man meist nur bei Prüfung auf None. Auf True muß man gar nicht explizit prüfen, hier also einfach nur ´while not check`.
Diese Abfrage wird aber niemals unwahr sein, weil falls check auf True gesetzt wird, die Funktion sofort per `return` verlassen wird.
Du wandelst die Zahl in ein int um, verwirfst aber das Ergebnis. Warum?
Funktionen werden wie Variablennamen komplett klein geschrieben, wir kommen also ugefähr zu:

Code: Alles auswählen

def eingabe_spielerzahl():
    while True:
        try:
            return int(input("Spielerzahl: "))
        except ValueError:
            print("Eingabe nicht zulässig. Bitte erneut versuchen")

Re: Objekte automatisch erstellen

Verfasst: Dienstag 8. März 2022, 19:39
von Smarrel
Perfekt. Vielen Dank.

Ich habe mir bereits zwei Bücher zum Thema Python-Programmierung durchgelesen, aber leider wurde nicht so genau auf diese "Regeln" (Wahrheitswerte nicht mit is vergleichen, Funktionen und Variablennamen immer komplett klein schreiben) nicht näher eingegangen. Habt ihr eine Empfehlung bzw. ein Stichwort für mich, wo ich mich da reinlesen kann?

Re: Objekte automatisch erstellen

Verfasst: Dienstag 8. März 2022, 21:09
von __blackjack__
Die meisten Konventionen stehen im offiziellen Style Guide for Python Code.