Problem mit Anzeige?

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
bsan
User
Beiträge: 2
Registriert: Mittwoch 18. Juni 2025, 07:29

Moin zusammen,

ich habe über ein YT Video dieses Script nachgemacht. Ich sehe den Fehler leider nicht.
Das Problem ist, dass bei mir unten nur 2 Zeilen angezeigt werden.
Kann mir jemand helfen?

Code: Alles auswählen

# 1. Spielbrett erstellen
def erstelle_brett():
    brett = []
    for i in range(3):
        zeile = [" ", " ", " "]
        brett.append(zeile)
        return brett

# 2. Spielbrett ausgeben
def drucke_brett(brett):
    for zeile in brett:
        print("|".join(zeile))
        print("------")

# 3. Zug machen
def mache_zug(brett, spieler, zeile, spalte):
    if brett[zeile][spalte] == " ":
        brett[zeile][spalte] = spieler
        return True
    else:
        return False

# 4. Gewinn überprüfen
def pruefe_gewonnen(brett, spieler):
    for zeile in range(2):
        if brett[zeile][0] == brett[zeile][1] == brett[zeile][2] == spieler:
            return True

    for spalte in range(3):
        if brett[0][spalte] == brett[1][spalte] == brett[2][spalte] == spieler:
            return True

    if brett[0][0] == brett[1][1] == brett[2][2] == spieler or \
       brett[0][2] == brett[1][1] == brett[2][0] == spieler:
        return True

# 5. Prüfe ob unentschieden
def pruefe_unentschieden(brett):
    for zeile in brett:
        if " " in zeile:
            return False
        return True
# 6. Unsere Main
def spiele_tic_tac_toe():
    brett = erstelle_brett()
    aktueller_spieler = "X"

    while True:
        drucke_brett(brett)
        zeile = int(input(f"Spieler {aktueller_spieler}, wähle deine Zeile (0-2)"))
        spalte = int(input(f"Spieler {aktueller_spieler}, wähle deine Spalte (0-2)"))

        if not mache_zug(brett, aktueller_spieler, zeile, spalte):
            print("Ungültig, versuche es erneut!")
            continue
            if pruefe_gewonnen(brett, aktueller_spieler):
                drucke_brett(brett)
                print(f"Hey, du hast gewonnen Spieler {aktueller_spieler}")
                break
            elif pruefe_unentschieden(brett):
                drucke_brett(brett)
                print("Unentschieden!")
        aktueller_spieler = "O" if aktueller_spieler == "X" else "X"

drucke_brett(erstelle_brett())
spiele_tic_tac_toe()
Bild

LG bsan
Benutzeravatar
darktrym
User
Beiträge: 785
Registriert: Freitag 24. April 2009, 09:26

wieso hast du eine schleife wenn du sowieso immer gleich wieder rausspringst?
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
bsan
User
Beiträge: 2
Registriert: Mittwoch 18. Juni 2025, 07:29

danke, in der Schleife waren Leerzeichen zu viel.

Bild
Benutzeravatar
__blackjack__
User
Beiträge: 14005
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@bsan: Ein paar weitere Anmerkungen: `pruefe_unentschieden()` funktioniert aus dem gleichen Grund nicht und auch in der Hauptfunktion sind logische Einrückfehler. ``continue`` würde ich meiden. Das geht eigentlich immer anders, und man hat dann keinen unbedingten Sprung an den Schleifenanfang, den man nicht an der Einrückung ablesen kann. Bei einem ``continue`` kann man ausserdem später nichts mehr hinzufügen was am Ende von *jedem* Schleifendurchlauf passieren soll, und das macht es auch kompliziert bis unmöglich Teile aus einer Schleife in eine eigene Funktion (oder Methode) heraus zu ziehen wenn da ein ``continue`` drin ist.

Die nummerierten Kommentare machen keinen Sinn. Die wiederholen ja im Grunde nur den jeweiligen Funktionsnamen, bringen dem Leser also keinen Mehrwert. Und auch die Reihenfolge noch mal als Zahl zu haben, bringt einen nicht weiter.

Bei `pruefe_gewonnen()` fehlt der Fall das der Spieler nicht gewonnen hat. So eine Prüffunktion sollte `True` und `False` zurückgeben, nicht `True` und `None`, auch wenn das zufällig funktioniert.

Mit `any()` und Generatorausdrücken könnte man die Tests in einem einzigen Ausdruck schreiben. Auch `pruefe_unentschieden()` liesse sich damit deutlich einfacher ausdrücken, beziehungsweise hier wäre `all()` ”natürlicher”.

\ zur Fortsetzung einer logischen Zeile würde ich vermeiden. Da darf kein Leerzeichen nach kommen und man kann so etwas eigentlich immer durch Klammern umgehen — solange öffnende Klammern noch nicht wieder geschlossen wurden, weiss der Compiler auch, dass der Ausdruck noch nicht zuende sein kann, und damit Zeilenenden nicht das Ende kennzeichnen können.

`erstelle_brett()` ist recht „gesprächig“ geschrieben — das liesse sich mit einer „list comprehension“ in einer Zeile ausdrücken.

Die Eingabe sollte gegen Fehler abgesichert werden. Der Frust wenn nach mehreren Zügen, vielleicht sogar beim Siegeszug, der Spieler auf der Tastatur aus versehen einen Buchstaben eingibt, und das Spiel dann einfach abbricht, ist vermeidbar.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
Antworten