Witam
Stworzyłam grę "Kółko i Krzyżyk", wszystko działa poprawnie do momentu gdy cofnę wszystkie ruchy i ponownie postawie gdzieś kółko lub krzyzyk - wtedy moja początkowa plansza zmienia się na plansze z postawionym ruchem i mimo kolejnych cofnięć pozostaje ona ze znakami "o" lub "x".
Przedstawiam swój kod:
#plik main.py
from game import *
from mementos import *
def main():
g = KolkoKrzyzyk()
g.printBoard()
m = Mementos(g.board)
while g.sign < 10:
if g.sign % 2 != 0: #sprawdzenie parzystosci znaku, jesli nie to stawiany jest "x", jesli tak - "o"
if g.sign >1: #sprawdzenie znaku, jesli > 1, uwzgledniam mozliwosc cofniecia ruchu
if g.movexAndUndo() == False: # wykonuje cofniecie ruchu
m.undo(g.sign -1)
g.board = m.getMementos(g.sign -2)
g.printBoard()
g.decrementSign()
print("usowam o z 3")
print(g.board)
print(m.mementos)
else:
m.addState(g.sign, g.board)
(g.win())
g.printBoard()
g.incrementSign()
print(g.board)
print(m.mementos)
else:
g.movex()
m.addState(g.sign, g.board)
(g.win())
g.printBoard()
print("Dodaje x dwojke")
g.incrementSign()
print(g.board)
print(m.mementos)
else: #stawiajac "o" g.sign zawsze bedzie >1 wiec nie sprawdzam tego warunku
if g.moveyAndUndo() == False: #wykonuje cofniecie ruchu
m.undo(g.sign -1)
g.board = m.getMementos(g.sign -2)
g.printBoard()
print("usuwam x z 2")
print(g.board)
print(m.mementos)
g.decrementSign()
else:
m.addState(g.sign, g.board)
(g.win())
g.printBoard()
print("dodaje o na 3")
g.incrementSign()
print(g.board)
print(m.mementos)
print("---------------------------------------")
print("Remis !")
main()
#plik game.py
import numpy
class KolkoKrzyzyk: #tworzy plansze gry bedaca tablica/macierza 3x3 z elementami 1-9
def __init__(self):
self.board = numpy.array([(1,2,3),(4,5,6),(7,8,9)], dtype = object) #dtype = object pozwala wprowadzic do tablicy element typu str
self.sign = 1 #znak ustala jaki ruch jest wykonywany, gdy jest parzysty dodawane jest "o", w przeciwnym wypadku "x"
def printBoard(self):
for item in self.board:
print(" ".join(map(str,item)))
def movex(self): #zamiana wybranego elementu tabeli na "x"
self.step = input("Wykonaj ruch podajac numer:")
self.board[(numpy.where(self.board == self.step))] = "x"
def movey(self): #zamiana wybranego elementu tabeli na "o"
self.step = input("Wykonaj ruch podajac numer: ")
self.board[(numpy.where(self.board == self.step))] = "o"
def movexAndUndo(self): #zamiana wybranego elementu tabeli na "x" w sytuacji gdy mozliwe jest cofniecie ruchu czyli gdy znak self.sign > 1
self.step = raw_input("Wykonaj ruch podajac numer lub wcisnij 'c' aby cofnac ruch ")
if self.step != "c":
self.step = int(self.step)
self.board[(numpy.where(self.board == self.step))] = "x"
return True
return False
def moveyAndUndo(self): #zamiana wybranego elementu tabeli na "o", w sytuacji gdy mozliwe jest cofniecie ruchu, czyli gdy znak self.sign > 1
self.step = raw_input("Wykonaj ruch podajac numer lub wcisnij 'c' aby cofnac ruch ")
if self.step != "c":
self.step = int(self.step)
self.board[(numpy.where(self.board == self.step))] = "o"
return True
return False
def incrementSign(self): #inkrementacja znaku self.sign
self.sign += 1
def decrementSign(self): #dekrementacja znaku self.sign
self.sign -= 1
def win(self): #sprawdzenie czy ktorys gracz zwyciezyl
if (self.board[0][0]=="x" and self.board[0][1]=="x" and self.board[0][2] == "x") or (self.board[1][0]=="x" and self.board[1][1]=="x" and self.board[1][2] == "x" ) or (self.board[2][0]=="x" and self.board[2][1]=="x" and self.board[2][2]== "x") or (self.board[0][0]=="x" and self.board[1][0] =="x" and self.board[2][0]== "x") or (self.board[0][1]=="x" and self.board[1][1]=="x" and self.board[2][1]=="x") or (self.board[0][2]=="x" and self.board[1][2]=="x" and self.board[2][2]=="x") or (self.board[0][0]=="x" and self.board[1][1]=="x" and self.board[2][2]=="x") or (self.board[0][2]=="x" and self.board[1][1]=="x" and self.board[2][0]=="x"):
print(self.board)
print("Zwycieza x")
exit()
if (self.board[0][0]=="y" and self.board[0][1]=="y" and self.board[0][2] == "y") or (self.board[1][0]=="y" and self.board[1][1]=="y" and self.board[1][2] == "y" ) or (self.board[2][0]=="y" and self.board[2][1]=="y" and self.board[2][2]== "y") or (self.board[0][0]=="y" and self.board[1][0] =="y" and self.board[2][0]== "y") or (self.board[0][1]=="y" and self.board[1][1]=="y" and self.board[2][1]=="y") or (self.board[0][2]=="y" and self.board[1][2]=="y" and self.board[2][2]=="y") or (self.board[0][0]=="y" and self.board[1][1]=="y" and self.board[2][2]=="y") or (self.board[0][2]=="y" and self.board[1][1]=="y" and self.board[2][0]=="y"):
print(self.board)
print("Zwycieza y")
exit()
#plik mementos.py
import numpy
class Mementos: #tworzenie slownika gdzie klucze to numery ruchow a wartosci to stany planszy gry po kazdym wykonanym ruchy
def __init__(self, mainboard):
self.mementos = dict()
self.mementos[0] = numpy.copy(mainboard) #dodanie poczatkowego stanu gry, jako ruch zerowy
'''def printMemento(self, r): #wypisanie planszy gry
for item in self.mementos[r]:
print(" ".join(map(str, item)))'''
def addState(self, r, state ): #dodanie do slownika kopi stanu gry
self.mementos[r] = numpy.copy(state)
def undo(self, r): #usuniecie elementu slownika (pary klucz:wartosc)
del self.mementos[r]
def getMementos(self, r): #wydobycie ze slownika wartosc(stan gry) danego klucza r(numer ruchu)
return(self.mementos[r])
Bardzo mi zależy na dokończeniu gry, lecz zupełnie nie wiem gdzie leży błąd.
Proszę o pomoc.