Hier ist der Code für das Spiel ist:schrieb ich ein Nullen und Kreuze Spiel in Python, aber der Gewinner nicht erklärt wird richtig
# oxo_main_shell.py
# code needed to test integrity of main shell
player = "X"
oxo = [' ',' ',' ',' ',' ',' ',' ',' ',' ']
win = ""
turns = 9
# main shell
def setup():
global win, player, turns, oxo, good, allwins
win = ""
player = "X"
turns = 9
oxo = [" "," "," "," "," "," "," "," "," "]
good = [1,2,3,4,5,6,7,8,9]
allwins = [[1,2,3],[4,5,6],[7,8,9],[1,4,7],[2,5,8],[3,6,9],[1,5,9],[3,5,7]]
def msgintro():
msg = "Press [Enter] to continue"
print(msg)
input()
def printrow(a,b,c,d,e,f):
print(a+' '+b+' |'+c+' '+d+' |'+e+' '+f+' ')
def printline():
print('-----+-----+-----')
def printboard(oxo):
printrow('1 ',' ','2 ',' ','3 ',' ')
printrow(' ',oxo[0],' ',oxo[1],' ',oxo[2])
printrow(' ',' ',' ',' ',' ',' ')
printline()
printrow('4 ',' ','5 ',' ','6 ',' ')
printrow(' ',oxo[3],' ',oxo[4],' ',oxo[5])
printrow(' ',' ',' ',' ',' ',' ')
printline()
printrow('7 ',' ','8 ',' ','9 ',' ')
printrow(' ',oxo[6],' ',oxo[7],' ',oxo[8])
printrow(' ',' ',' ',' ',' ',' ')
def play():
pos = 0
while pos not in good:
pos = input()
try:
pos = int(pos)
except ValueError:
pos = 0
oxo[pos-1] = player
good.remove(pos)
def getplaces(player,oxo):
places = []
for i in range(0,len(oxo)):
if player == oxo[i]: places.append(i+1)
return places
def issubset(win,places):
for i in range(0,len(places)-2):
if win == places[i:i+3]: return True
return False
def checkwin(player,oxo):
places = getplaces(player,oxo)
for win in allwins:
if issubset(win,places): return True
return False
def swap(player):
if player == 'X': return '0'
return 'X'
def declarewinner(win):
if win != "":
print(win,"wins")
else:
print("Stalemate")
# main program
setup()
msgintro()
printboard(oxo)
# turn
while turns > 0:
play()
printboard(oxo)
if checkwin(player,oxo): break
player = swap(player)
turns -= 1
declarewinner(player)
Es meistens funktioniert, ich in den Positionen setzen Stücke zu lassen, wenn ich Geben Sie die Positionsnummer ein und deklarieren Sie einen Gewinner richtig, wenn das Board bis zum Ende des Spiels nicht gefüllt ist. Wenn das Board am Ende des Spiels jedoch gefüllt ist, beginnt es den Gewinner falsch zu deklarieren und es wird niemals ein Patt erklärt. Zum Beispiel habe ich getestet, ein Spiel mit den Stücken in diesen Positionen:
1 |2 |3
X | 0 | X
| |
-----+-----+-----
4 |5 |6
X | 0 | 0
| |
-----+-----+-----
7 |8 |9
0 | X | X
| |
Dies ist eine Pattsituation sein sollte, aber 0 wurde zum Sieger erklärt.
Ein weiteres Beispiel ist in einem Spiel mit den Stücken in diesen Positionen:
1 |2 |3
X | 0 | X
| |
-----+-----+-----
4 |5 |6
0 | X | 0
| |
-----+-----+-----
7 |8 |9
0 | X | X
| |
0 wird zum Sieger erklärt, wenn X sollte zum Sieger erklärt.
Gibt es eine Möglichkeit für mich, damit der Gewinner korrekt erklärt wird?
Warum Sie für 'Teilmenge (win, Plätze) werden überprüft'? Ich denke, der Hauptfehler ist, dass allwins 1-indiziert ist, während es 0-indexiert werden sollte, die erste gewinnende Kombination ist durch Felder 0, 1 und 2. – Jasper
Ich machte ein Tic Tac Toe Spiel vor nicht allzu langer Zeit und diesem Teil von Debugging kann ein bisschen schwierig sein. Ich denke, dass dein Fehler wahrscheinlich davon kommt, dass deine "getplaces" -Methode nicht richtig funktioniert. Was wird in jeder Iteration gedruckt? Wird das gleiche wie auf dem Board ausgedruckt? –
In jeder Iteration werden die aktuellen Stücke, die platziert wurden, auf der Tafel angezeigt. Zum Beispiel wird die Tafel vor der dritten Runde 2 Stück haben – velociraptor