2016-04-08 2 views
3

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?

+1

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

+0

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? –

+0

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

Antwort

1

Das Problem liegt in der Hauptspielschleife, am Ende des geposteten Codes.

Wenn Sie die Karte vollständig ausfüllen, aber niemand gewinnt, verlässt das Spiel die while-Schleife, aber checkwin wird ausgeführt, nachdem die Schleife beendet wurde und wer der Spieler war, als die Schleife automatisch endete, gewinnt aufgrund von declarewinner(player). In einem Patt gewinnt also immer 0.

Das gleiche gilt, wenn Sie im letzten Zug gewinnen, bevor Sie das Spielfeld füllen. Nein checkwin, 0 gewinnt immer.

Also, fügen Sie einfach einige checkwin am Ende. Ersetzen Sie die letzte Zeile mit:

if checkwin("0", oxo): 
    declarewinner("0") 
elif checkwin("X", oxo): 
    declarewinner("X") 
else: # stalemate 
    declarewinner("") 
1

Das Problem ist von Ihnen declarewinner(player) am Ende aufrufen. declarewinner Funktion wird nur dann eine Pattsituation erklären, wenn die übergebene Variable eine leere Zeichenfolge ist. Aber da Ihre player Variable für jede Runde gesetzt ist, wird sie niemals eine leere Zeichenfolge sein.

Sie möchten stattdessen die globale Variable win in checkwin setzen, wenn ein Gewinn aufgetreten ist. Ändern Sie dann Ihre declarewinner-Funktion, um von der globalen win-Variable zu lesen, im Gegensatz zu dem Einbeziehen eines Arguments.

Beispiel:

def checkwin(player,oxo): 
    global win # since you are modifying a global variable 
    places = getplaces(player,oxo) 
    for w in allwins: # use `w` instead of `win` to avoid namespace collision with your global variable 
     if issubset(w,places): 
      win = player # set the `win` variable as to your winning player 
      return True 
    return False 

... 

def declarewinner(): 
    if win != "": 
     print(win,"wins") 
    else: 
     print("Stalemate") 

... 

while turns > 0: 
    play() 
    printboard(oxo) 
    if checkwin(player,oxo): break 
    player = swap(player) 
    turns -= 1 
declarewinner() 
Verwandte Themen