Seite 1 von 1

Werte der Liste werden um eins Verschoben

Verfasst: Donnerstag 18. März 2021, 21:04
von Zakon99
Programmiere zu Übungszwecken ein TicTacToe in Python. Problem nur ab dem 3 Zug werden meine Werte in der Liste ab stelle 4 immer um eins weiter geschoben. Beduetet wenn ich bei feld[4] = "0" habe und der dritte zug gemacht wird ist die 0 von Feld 4 auf einmal bei 5 und ich habe absolut keine Ahnung warum. Da Problem zieht sich dann so weiter über den restlichen Spielverlauf. Wäre cool wenn mir einer helfen könnte.:)

Danke im Vorraus :)

Code: Alles auswählen

def felderstellen():
    feld  = [' ',' ',' ',
            ' ',' ',' ',
            ' ',' ',' ']


    return feld

def feldausgabe(feld):
    felder = 0
    spalte = 3
    zeile = 3

    for y in range(zeile):
        print("\n")
        for x in range(spalte):
            print("|",feld[felder],"| ", end="")


            felder = felder+1
    print("\n")


def feldbefüllen(feld,zuege):
    while True:
        if zuege == 0 or zuege % 2 == 0:
            eingabe = input("Spieler X. Wälen Sie ein Feld: ")
            try:
                eingabe = int(eingabe)
                feld.insert(eingabe-1, "X")
                
                return feld
            except ValueError:
                print("Bitte eine Zahl von 1-9")
        elif zuege == 1 or zuege % 2 != 0:
            eingabe = input("Spieler O. Wälen Sie ein Feld: ")
            try:
                eingabe = int(eingabe)
                feld.insert(eingabe-1,"O")

                return feld
            except ValueError:
                print("Bitte eine zahl von 1-9")



def gewinner(feld,zuege):

    zZeilen=0
    zSpalten=0
    zDiagonal=0

    if zuege < 3:
        return
    else:
        for i in range(2):
            #Zeilen
            if feld[0+zZeilen]==feld[1+zZeilen]==feld[2+zZeilen]:
                print("Speieler", feld[0+zZeilen]," hat Gewonnen")

            #Spalten
            elif feld[0+zSpalten]==feld[3+zSpalten]==feld[6+zSpalten]:
                print("Spieler ",feld[0+zSpalten], " hat Gewonnen")

            #Diagonal
            elif feld[0+zDiagonal]==feld[4]==feld[8-zDiagonal]:
                print("Spieler ",feld[0+zDiagonal], " hat Gewonnen")

            zZeilen = zZeilen+3
            zSpalten = zSpalten+1
            zDiagonal=zDiagonal+2



if __name__ == '__main__':
    #Feld erstellen
    feld = felderstellen()
    feldausgabe(feld)

    for zuege in range(9):
        if zuege <=8:
            feldbefüllen(feld,zuege)

            
            feldausgabe(feld)

            #Überprüfung
            gewinner(feld,zuege)

            zuege = zuege+1


        else:
            print("Keiner hat gewonnen")

Re: Werte der Liste werden um eins Verschoben

Verfasst: Donnerstag 18. März 2021, 21:20
von Sirius3
Wie schon zum anderen Beitrag von Dir geschrieben, Du benutzt zu viele Variablen und Indizes.
In feldausgabe ist `felder` ein schlechter Variablenname, denn die Variable enthält einen Index und keine Felder. Wie kommst Du auf den Plural?
Eigentlich braucht man gar keinen Indexzugriff auf die Liste, wie ich im anderen Beitrag schon gezeigt habe, falls doch, würde man den Index als y * spalte + x berechnen.

In `gewinner`, was sollen die z-Präfixe bei den ganzen Zählern? Variablennamen schreibt man nach Konvention komplett klein. zZeilen ist i * 3, zSpalten ist i und zDiagonal ist i*2, als sind alle drei Variablen überflüssig. Du prüfst zwar alle von zwei Diagonalen, aber nur jeweils zwei der Spalten, bzw. Zeilen.
Das Argument zuege funktioniert so nicht, wie Du es implementiert hast, weil durch den Vergleich auch drei Leere Felder zum Sieg führen würden.
Alles was unter `if __name__` steht gehört auch in eine Funktion, die üblicherweise main genannt wird.
Die if-Abfrage in der for-zuege-Schleife ist immer erfüllt, kann also weg; der else-Block wird folglich auch nie betreten.

In `feldbefüllen` ist der Fall zuege == 0 schon von zuege % 2 == 0 abgedeckt, und wenn man dann das exakte Gegenteil der Bedingung bei elif hat, dann benutzt man statt dessen else.
Nun sind aber die beiden if-Blöcke bis auf das X oder O identisch, können also zu einem zusammengefasst werden. Mit dem return-Wert machst Du nichts, warum gibst Du feld also zurück?
Du hast bereits ein Feld mit 9 vordefinierten Feldern, insert ist also falsch, weil Du dadurch ja ein 10- und dann 11-elementiges Feld erzeugst.
Der try-Block enthält zu viel.

Re: Werte der Liste werden um eins Verschoben

Verfasst: Donnerstag 18. März 2021, 21:50
von Zakon99
Edit: Meine Zeichen verschieben sich immer um eins wenn ich ein Feld vor einem Zeichen befülle. Heißt Feld[3]=" " Feld[4]=O ----> feld.insert(3,X) dann verschiebt sich das O au Feld 4 auf Feld 5. Und das passiert jedes mal wenn ich ein leeres Feld vor einem Zeichen befüllen möchte.

Re: Werte der Liste werden um eins Verschoben

Verfasst: Donnerstag 18. März 2021, 21:58
von Zakon99
In gewonnen() das funktioniert doch weil ich im ersten durchgang 0,1,2 dann 3,4,5 dann 6,7,8 überprüfe. wollte halt nicht alles doppel und dreifach für jede Spalte und zeile schreiben. und den rest gucke ich mir mal eben an aber danke für deine hilfe schonmal. :)

Re: Werte der Liste werden um eins Verschoben

Verfasst: Donnerstag 18. März 2021, 22:03
von Zakon99
Die Ausgabe über die For schleifen mache ich falls ich ein größeres Feld erstellen möchte. so muss ich nur die Indizes abändern aber der code funktioniert genau so gut. So der gedankengang.

Re: Werte der Liste werden um eins Verschoben

Verfasst: Donnerstag 18. März 2021, 22:09
von Zakon99
Und der return wert gibt das feld immer zurück , da ich dieses dann weitergebe an feldausgabe und gewinner. Kann sein das ich das so Schriebe weil ich zu viel an Java denke :D

Re: Werte der Liste werden um eins Verschoben

Verfasst: Donnerstag 18. März 2021, 22:15
von Zakon99
Habe es jetzt gelöst habe das inert durch ein feld[eingabe]="X" bzw 0 geändert. jetzt funktioniert es.

Code: Alles auswählen

def felderstellen():
    feld  = [' ',' ',' ',
             ' ',' ',' ',
             ' ',' ',' ']


    return feld

def feldausgabe(feld):
    felder = 0
    spalte = 3
    zeile = 3

    for y in range(zeile):
        print("\n")
        for x in range(spalte):
            print("|",feld[felder],"| ", end="")


            felder = felder+1
    print("\n")


def feldbefüllen(feld,zuege):
    while True:
        if zuege % 2 == 0:
            eingabe = input("Spieler X. Wälen Sie ein Feld: ")
            try:
                eingabe = int(eingabe)
                feld[eingabe-1] = "X"

                return feld
            except ValueError:
                print("Bitte eine Zahl von 1-9")
        else:
            eingabe = input("Spieler O. Wälen Sie ein Feld: ")
            try:
                eingabe = int(eingabe)
                feld[eingabe-1] = "O"

                return feld
            except ValueError:
                print("Bitte eine zahl von 1-9")



def gewinner(feld,zuege):

    zZeilen=0
    zSpalten=0
    zDiagonal=0

    if zuege < 3:
        return
    else:
        for i in range(2):
            #Zeilen
            if feld[0+zZeilen]==feld[1+zZeilen]==feld[2+zZeilen]:
                print("Speieler", feld[0+zZeilen]," hat Gewonnen")

            #Spalten
            elif feld[0+zSpalten]==feld[3+zSpalten]==feld[6+zSpalten]:
                print("Spieler ",feld[0+zSpalten], " hat Gewonnen")

            #Diagonal
            elif feld[0+zDiagonal]==feld[4]==feld[8-zDiagonal]:
                print("Spieler ",feld[0+zDiagonal], " hat Gewonnen")

            zZeilen = zZeilen+3
            zSpalten = zSpalten+1
            zDiagonal=zDiagonal+2



if __name__ == '__main__':
    #Feld erstellen
    feld = felderstellen()
    feldausgabe(feld)

    for zuege in range(9):
        if zuege <=8:
            feldbefüllen(feld,zuege)

            
            feldausgabe(feld)

            #Überprüfung
            gewinner(feld,zuege)

            zuege = zuege+1


        else:
            print("Keiner hat gewonnen")

Re: Werte der Liste werden um eins Verschoben

Verfasst: Donnerstag 18. März 2021, 22:19
von Zakon99
Edit: Das PRoblem mit dem Gewonnen bleibt. Danke aber für den Hinweis habe das so vorher nicht gesehen ich überlege mir mal was. :)

Re: Werte der Liste werden um eins Verschoben

Verfasst: Donnerstag 18. März 2021, 22:22
von Zakon99
So kurz und schmerzlos. Sorry für spamen beim nächsten mal mache ich das nicht so. Aber folgender Code Funktioniert jetzt: Danke dir nochmal für deine Hilf :)

Code: Alles auswählen

def felderstellen():
    feld  = [' ',' ',' ',
             ' ',' ',' ',
             ' ',' ',' ']


    return feld

def feldausgabe(feld):
    felder = 0
    spalte = 3
    zeile = 3

    for y in range(zeile):
        print("\n")
        for x in range(spalte):
            print("|",feld[felder],"| ", end="")


            felder = felder+1
    print("\n")


def feldbefüllen(feld,zuege):
    while True:
        if zuege % 2 == 0:
            eingabe = input("Spieler X. Wälen Sie ein Feld: ")
            try:
                eingabe = int(eingabe)
                feld[eingabe-1] = "X"

                return feld
            except ValueError:
                print("Bitte eine Zahl von 1-9")
        else:
            eingabe = input("Spieler O. Wälen Sie ein Feld: ")
            try:
                eingabe = int(eingabe)
                feld[eingabe-1] = "O"

                return feld
            except ValueError:
                print("Bitte eine zahl von 1-9")



def gewinner(feld,zuege):

    zZeilen=0
    zSpalten=0
    zDiagonal=0

    if zuege < 3:
        return
    else:
        for i in range(2):
            #Zeilen
            if feld[0+zZeilen]==feld[1+zZeilen]==feld[2+zZeilen]!=' ':
                print("Speieler", feld[0+zZeilen]," hat Gewonnen")

            #Spalten
            elif feld[0+zSpalten]==feld[3+zSpalten]==feld[6+zSpalten]!=' ':
                print("Spieler ",feld[0+zSpalten], " hat Gewonnen")

            #Diagonal
            elif feld[0+zDiagonal]==feld[4]==feld[8-zDiagonal]!=' ':
                print("Spieler ",feld[0+zDiagonal], " hat Gewonnen")

            zZeilen = zZeilen+3
            zSpalten = zSpalten+1
            zDiagonal=zDiagonal+2



if __name__ == '__main__':
    #Feld erstellen
    feld = felderstellen()
    feldausgabe(feld)

    for zuege in range(9):
        if zuege <=8:
            feldbefüllen(feld,zuege)

            
            feldausgabe(feld)

            #Überprüfung
            gewinner(feld,zuege)

            zuege = zuege+1


        else:
            print("Keiner hat gewonnen")

Re: Werte der Liste werden um eins Verschoben

Verfasst: Donnerstag 18. März 2021, 22:30
von Sirius3
Funktionieren ist etwas anderes. Ein paar Probleme habe ich ja schon beschrieben: die gewonnen-Prüfung ist falsch. Wenn doch jemand gewonnen hat, geht das Spiel einfach weiter. Die Prüfung auf zuege ist dagegen überflüssig.
Dazu kann jeder die Felder des anderen überschreiben. Nur den ValueError abzufangen reicht nicht als Fehlerprüfung. Und das "Keiner hat gewonnen" wird niemals ausgegeben.