Python Ich check den Fehler im Code nicht ^^

HardtbeatShow

Cadet 4th Year
Registriert
Aug. 2020
Beiträge
96
PYTHON


Guten Tag.
Habe mit viel Hilfe mal TicTacToe programmiert, in der Konsole.
Leider habe ich einen Fehler drinne und ich bekomme auch eine Fehlermeldung. Allerdings bin ich immer noch ratlos. Es handelt sich wohl um 1-2 Zeilen die keinen Sinn ergeben...
Ich wäre sehr dankbar wenn mir jemand den Fehler erklären könnte ^^
Problem: bei "q" wird ne Fehlermeldung ausgegeben. "q" soll das Spiel beenden.
Siehe Zeile 45

Grüße :D

Python:
field = ["",
         "1", "2", "3",
         "4", "5", "6",
         "7", "8", "9"]

def print_field():
    print(field[1] + "|" + field[2] + "|" + field[3])
    print(field[4] + "|" + field[5] + "|" + field[6])
    print(field[7] + "|" + field[8] + "|" + field[9])

active_player ="X"
run = True

def check_win():#Zeilen prüfen
    if field[1] == field[2] == field[3]:
        return field[1]
    if field[4] == field[5] == field[6]:
        return field[4]
    if field[7] == field[8] == field[9]:
        return field[7]
    #Spalten prüfen
    if field[1] == field[4] == field[7]:
        return field[1]
    if field[2] == field[5] == field[8]:
        return field[2]
    if field[3] == field[6] == field[9]:
        return field[3]
    #Diagonalen
    if field[1] == field[5] == field[9]:
        return field[1]
    if field[3] == field[5] == field[7]:
        return field[3]

def check_draw():
    if field[1] != "1" and field[2] != "2" and field[3] != "3" \
            and field[4] != "4" and field[5] != "5" \
            and field[6] != "6" and field[7] != "7" \
            and field[8] != "8" and field[9] != "9":
        return True

def next_move():
    global run
    while True:
        player_move = int(input("Bitte das gewünschte Feld eingeben: "))
        if player_move == "q":
            run = False
            return
        if player_move >= 1 and player_move <= 9:
            if field[player_move] == "X" or field[player_move] == "O":
                print("Spielfeld belegt, neue Eingabe")
            else:
                return player_move
        else:
            print("Die eingegebene Zahl muss zwischen 1 und 9 liegen. Bitte Eingabe wiederholen...")

def change_player():
    global active_player
    if active_player == "X":
        active_player = "O"
    else:
        active_player = "X"

while run:
    print_field()
    player_move = next_move()
    if player_move != None:
        field[player_move] = active_player
        winner = check_win()
        if winner:
            print(winner + " hat Gewonnen")
            run = False
        if check_draw():
            print("Unentschieden")
            run = False
        change_player()
 
Hmm, ohne das Programm jetzt in der Tiefe zu verstehen.
Du castest den Taststurinput in Zeile 44 auf einen INT Wert und vergleichst den danach mit einem String bzw. Char "q". Das kann nicht funktionieren. Hast du mal geprüft, was "player_move" für einen Wert hat, wenn du "q" eingibst?
 
Du parst in Zeile 44 den eingegeben Input als Integer und speicherst das Ergebnis in der Variable player_move. Wenn man nun "q" eintippt, wird das sicher nicht von Erfolg gekrönt sein und das if-statement in Zeile 45 wird vermutlich den Fehler werfen
 
LOL ich glaube ich hab den Fehler gefunden. kann es sein das ich "q" als Ganz abspeichern wollte? (int)

habe das mal so gemacht, bekomme jtz keine Fehlermeldung mehr:

Python:
def next_move():
    global run
    while True:
        player_move = input("Bitte das gewünschte Feld eingeben: ")
        if player_move == "q":
            run = False
            return
        player_move = int(player_move)
        if player_move >= 1 and player_move <= 9:
            if field[player_move] == "X" or field[player_move] == "O":
                print("Spielfeld belegt, neue Eingabe")
            else:
                return player_move
        else:
            print("Die eingegebene Zahl muss zwischen 1 und 9 liegen. Bitte Eingabe wiederholen...")
Danke blalaber!
Das wirds gewesen sein. wuhu
 
wie fix ichs aber das man keine anderen Buchstaben eingeben kann? Bei "k" bekomme ich z.B. eine Fehlermeldung^^
Der Code wird mir langsam zu groß xD
Ergänzung ()

hier nochmal der momentane Code:
Python:
field = ["",
         "1", "2", "3",
         "4", "5", "6",
         "7", "8", "9"]

def print_field():
    print(field[1] + "|" + field[2] + "|" + field[3])
    print(field[4] + "|" + field[5] + "|" + field[6])
    print(field[7] + "|" + field[8] + "|" + field[9])

active_player ="X"
run = True

def check_win():#Zeilen prüfen
    if field[1] == field[2] == field[3]:
        return field[1]
    if field[4] == field[5] == field[6]:
        return field[4]
    if field[7] == field[8] == field[9]:
        return field[7]
    #Spalten prüfen
    if field[1] == field[4] == field[7]:
        return field[1]
    if field[2] == field[5] == field[8]:
        return field[2]
    if field[3] == field[6] == field[9]:
        return field[3]
    #Diagonalen
    if field[1] == field[5] == field[9]:
        return field[1]
    if field[3] == field[5] == field[7]:
        return field[3]

def check_draw():
    if field[1] != "1" and field[2] != "2" and field[3] != "3" \
            and field[4] != "4" and field[5] != "5" \
            and field[6] != "6" and field[7] != "7" \
            and field[8] != "8" and field[9] != "9":
        return True

def next_move():
    global run
    while True:
        player_move = input("Bitte das gewünschte Feld eingeben: ")
        if player_move == "q":
            run = False
            return
        player_move = int(player_move)
        if player_move >= 1 and player_move <= 9:
            if field[player_move] == "X" or field[player_move] == "O":
                print("Spielfeld belegt, neue Eingabe")
            else:
                return player_move
        else:
            print("Die eingegebene Zahl muss zwischen 1 und 9 liegen. Bitte Eingabe wiederholen...")

def change_player():
    global active_player
    if active_player == "X":
        active_player = "O"
    else:
        active_player = "X"

while run:
    print_field()
    player_move = next_move()
    if player_move != None:
        field[player_move] = active_player
        winner = check_win()
        if winner:
            print(winner + " hat Gewonnen")
            run = False
        if check_draw():
            print("Unentschieden")
            run = False
        change_player()
 
Weil Du erneut den Cast mit einem CHAR auf INT machst, nämlich dann wenn Player_Move eben nicht q ist, dann wird übersprungen und "Player_Move = Int(Player_Move)" ausgeführt.

Du solltest vorher eine Prüfung des Inputs durchführen um zu entscheiden, wie damit umgegangen werden soll. Bspw. erst casten wenn "isnumeric()" entsprechend zurückmeldet.
 
  • Gefällt mir
Reaktionen: M4ttX
Wurzelsepp29 schrieb:
Du solltest vorher eine Prüfung des Inputs durchführen um zu entscheiden, wie damit umgegangen werden soll.
Genau. Python bietet ja die Methode isdigit() dafür.
Man kann alternativ auch eine Umwandlung nach int machen und dann halt den Error/Exception abfangen.
So a-la
Python:
try:
    player_move = int(player_move)
    ...

except ValueError:
    print("Bitte eine Zahl eingeben.")
 
  • Gefällt mir
Reaktionen: M4ttX
ohje. und ohne isdigit() und isnumeric() ? ich kenne die Befehle noch nicht^^
 
ohne die ganzen if/else in verschiedenen tiefen:

Python:
    while True:

        player_move = input("Bitte das gewünschte Feld eingeben: ")

        try:
            player_move = int(player_move)

            if player_move not in range(1, 10):
                print("Die eingegebene Zahl muss zwischen 1 und 9 liegen. Bitte Eingabe wiederholen...")
                continue

            if field[player_move] in ["X", "O"]:
                print("Spielfeld belegt, neue Eingabe")
                continue

            return player_move

        except ValueError:
            if player_move == "q":
                run = False
                return
 
Python:
def next_move():
    global run
    while True:
        player_move = input("Bitte das gewünschte Feld eingeben: ")
        if player_move == "q":
            run = False
            return
        else:
            print("ungültig")
            continue
        player_move = int(player_move)
        if player_move >= 1 and player_move <= 9:
            if field[player_move] == "X" or field[player_move] == "O":
                print("Spielfeld belegt, neue Eingabe")
            else:
                return player_move
        else:
            print("Die eingegebene Zahl muss zwischen 1 und 9 liegen. Bitte Eingabe wiederholen...")



Also iwie sowas.. wenn ihr meinen gedanken nachvollziehen könnt. problem ist nur das der code unten drunter nun unerreichbar ist xD (Z10)
 
HardtbeatShow schrieb:
ohje. und ohne isdigit() und isnumeric() ?
Wie gesagt. Fehler abfangen.
Man kann auch mit regulären Ausdrücken hantieren.

HardtbeatShow schrieb:
ich kenne die Befehle noch nicht^^
Na und? Man trifft regelmäßig beim programmieren auf Funktionen die man noch nicht kennt. Da guckt man halt nach wie die funktionieren und hat dann was dazu gelernt. Ich versteh das Problem grad nicht.
 
ja hast ja recht mit den neuen befehlen ^^
Ich hatte einfach die hoffnung alles bisher erlernte nur vertiefen zu können in dem projekt ohne das was dazu kommt :D
(Bin erst vor 3-4 Tagen überhaupt in berührung mit programmieren gekommen)

Aber um doch noch nen Weg zu finden es ohne neue Funktion zu können:

Wenn playermove == q ist wird das game abgebrochen
Wenn playermove != q ist and != if player_move >= 1 and player_move <= 9
dann wird ausgegeben print("ungültig")

Ergibt das iwie sinn?
 
Code:
        if player_move == "q":
            run = False
            return
        else:
            print("ungültig")
            continue
        player_move = int(player_move)

int(player_move) wird nie erreicht. entweder ist es "q" und du machst ein return oder es ist was anderes und du machst ein continue. eigentlich sollte das eine ordentlich ide auch gleich anzeigen:

1664972150025.png
 
Wie wäre es, wenn du zum Beenden des Programms keinen Buchstaben verwendest sondern halt eine andere Ziffer. 0 wäre noch übrig.

(Der Spieler darf dann halt immer nur Ziffern eingeben. Wenn du verhindern willst, dass sich das Programm aufhängt, musst du mit einer Funktion unterbinden, dass er Buchstaben oder Sonderzeichen eingeben kann.)
 
frazzlerunning schrieb:
(Der Spieler darf dann halt immer nur Ziffern eingeben. Wenn du verhindern willst, dass sich das Programm aufhängt, musst du mit einer Funktion unterbinden, dass er Buchstaben oder Sonderzeichen eingeben kann.)

Womit wir wieder bei isnumeric() o.ä. landen :D
 
HardtbeatShow schrieb:
(Bin erst vor 3-4 Tagen überhaupt in berührung mit programmieren gekommen)
Dafür ist das schon ziemlich gut, weiter so! Sehr gut ist auch, dass du sprechende Variablennamen gewählt hast.
 
Python:
def next_move():
    global run
    while True:
        player_move = input("Bitte das gewünschte Feld eingeben: ")
        if player_move == "q":
            run = False
            return
        elif player_move.isnumeric():
            player_move = int(player_move)
            if player_move >= 1 and player_move <= 9:
                if field[player_move] == "X" or field[player_move] == "O":
                    print("Spielfeld belegt, neue Eingabe")
                else:
                    return player_move

            else:
                print("Die eingegebene Zahl muss zwischen 1 und 9 liegen. Bitte Eingabe wiederholen...")
        else:
            print("Die Eingabe muss eine Zahl oder 'q' sein. Bitte Eingabe wiederholen...")


habs mit numeric hinbekommen^^ danke nochmal
Ergänzung ()

BeBur schrieb:
Dafür ist das schon ziemlich gut, weiter so! Sehr gut ist auch, dass du sprechende Variablennamen gewählt hast.
Ja sprechende variablen wurde in einem yt video erwähnt :D
 
Zuletzt bearbeitet:
Zurück
Oben