Tic Tac Toe Python?

2 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

Der Code prüft einfach, ob bereits jedes Feld besetzt ist (mit O oder X). Sind alle 9 Felder befüllt, dann ist das Spiel zuende.

Vermutlich wird vor dieser Funktion überprüft, ob jemand gewonnen hat. Ist dies nicht der Fall, dann wird eben noch diese Funktion aufgerufen, und dann liegt natürlich ein Unentschieden vor, wenn das Spiel zuende ist.

Anstatt dieser unnötig komplizierten Abfrage könnte man auch einfach zählen, in welcher Runde man ist (bzw. wieviele Kreuze und Kreise schon gesetzt wurden), und wenn die Zahl 9 ist und keiner gewonnen hat, dann ist es unentschieden.

Woher ich das weiß:Hobby – Programmieren ist mein Hobby & Beruf

Saibotix07 
Beitragsersteller
 18.07.2021, 23:03

Danke

1
Saibotix07 
Beitragsersteller
 18.07.2021, 23:05
@MrAmazing2

Perfekt :D
Also ich weiß mein Code ist alles andere als perfekt und der Feinschliff kommt noch aber ich hab in meinem Code ein While True. Das wird jetzt endlos ausgeführt. Am besten du siehst es dir selbst einmal an :D https://pastebin.com/A5euyBrw

0
MrAmazing2  18.07.2021, 23:15
@Saibotix07

Mach es da raus, da brauchst du es nicht :D

In der Main wäre die Schleife besser aufgehoben:

def main():
  spielfeld_ausgeben()
  while True:
    spieler_eingabe()
    spielfeld_ausgeben()
    kontrolle_gewonnen()
    kontrolle_auf_unentschieden()
    spieler_change()

Aber auch dann läuft das Spiel unendlich weiter, auch wenn wer gewonnen hat.

Am besten änderst du, wenn jemand gewonnen hat, oder wenn es ein unentschieden gibt, deine Variable spiel_aktiv zu false. Und dann kannst du in der main einfach "while spiel_aktiv" machen:

def main():
  spielfeld_ausgeben()
  while spiel_aktiv:
    spieler_eingabe()
    spielfeld_ausgeben()
    kontrolle_gewonnen()
    kontrolle_auf_unentschieden()
    spieler_change()

Bei kontrolle_auf_unentschieden() musst du dann vielleicht noch ein "and spiel_aktiv" hinten ran packen, denn sonst gibt es, wenn jemand in der letzten runde gewinnt, "Gewonnen" und "Unentschieden" zugleich aus.

Gäb aber noch viel bessere Möglichkeiten das zu lösen, zum Beispiel indem du deine kontrolle-Funktionen True oder False zurückgeben lässt, jenachdem ob wer gewonnen hat oder nicht. Und dann könntest du falls wer gewonnen hat die Schleife abbrechen:

def main():
  spielfeld_ausgeben()
  while True:
    spieler_eingabe()
    spielfeld_ausgeben()
    if kontrolle_gewonnen():
      break
    if kontrolle_auf_unentschieden():
      break
    spieler_change()
1

Ich bin mir nicht ganz sicher ob ich das richtig verstanden habe, aber unentschieden ist der letzte von drei möglichen Spielausgängen, von denen du zwei sowieso abfragen musst. Warum prüfst du also nicht jede Runde ob einer der beiden Spieler gewonnen hat, und nach 9 Runden, oder sobald das Brett voll ist, ist das Spiel unentschieden.

Oder geht es darum wie du heraus bekommst ob einer der beiden Spieler gewonnen hat? Dafür machst du einfach eine If-Abfrage wo du alle acht Möglichkeiten abfragst. Ich kenne den Rest deines Codes nicht und weiß nicht wie du das ganze umgesetzt hast, aber ich würde eine Schleife machen und die Zählervariable immer Modulo 2 rechnen, um herauszufinden wer gerade dran ist. Auf diese weise musst du nur noch abfragen:

if (spielfeld[0] == spielfeld[1] == spielfeld[2]
  or spielfeld[0] == spielfeld[3] == spielfeld[6]
  or ...) # insgesammt gibt es 8 verschiedene Möglichkeiten. Die musst du alle abfragen

Und übrigens: Es wird immer bei 0 angefangen zu zählen, nicht bei 1...

Woher ich das weiß:Hobby – Programmiere seit eineinhalb Jahren