From d0bbc4a14ad8f143bd2525cd71a67e1b8f27abfe Mon Sep 17 00:00:00 2001 From: Tibor Bizjak Date: Tue, 10 Sep 2019 21:36:49 +0200 Subject: [PATCH] Added history managment --- chess.py | 53 ++++++++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 50 insertions(+), 3 deletions(-) diff --git a/chess.py b/chess.py index d17b385..bd42a7f 100644 --- a/chess.py +++ b/chess.py @@ -119,15 +119,18 @@ class Piece: class Game: def __init__(self): + self.index = 0 self.make_board() self.moves = [] - self.stack = [] + self.AN_moves = [] + self.history = [] self.turn = "white" self.can_castle = {"white" : {"queen" : True, "king" : True}, "black" : {"queen" : True, "king" : True} } + self.history.append(deepcopy(self)) def __repr__(self): # Unicode board representation @@ -163,6 +166,31 @@ class Game: self.board["h1"].side = "king" self.board["h8"].side = "king" + def rebase(self): + self.moves = self.moves[:self.index+1] + self.history = self.history[:self.index+1] + + def timetravel(self, i): + if i >= len(self.history) or i < 0: + return False + new = self.history[i] + self.board = new.board + self.turn = new.turn + self.can_castle = new.can_castle + self.index = i + + def prev(self): + return self.timetravel(self.index-1) + + def next(self): + return self.timetravel(self.index+1) + + def last(self): + return self.timetravel(len(self.history)-1) + + def first(self): + return self.timetravel(0) + def is_empty(self, sq): return self.board[sq] == None @@ -216,6 +244,7 @@ class Game: if not (are_empty and not_attacked): return False + self.rebase() self.board[king_move[1]] = self.board[king_move[0]] self.board[rook_move[1]] = self.board[rook_move[0]] self.board[king_move[0]] = Piece() @@ -224,6 +253,8 @@ class Game: self.can_castle[color]["king"] = False self.moves.append(king_move) self.turn = invert(self.turn) + self.history.append(deepcopy(self)) + self.index += 1 return True def move(self, source, target, promotion=None): @@ -261,10 +292,13 @@ class Game: if new.is_check(self.turn): return False + self.rebase() self.moves.append((source, target)) self.board = new.board self.can_castle = new.can_castle self.turn = invert(moved.color) + self.history.append(deepcopy(self)) + self.index += 1 return True def is_legal(self, source, target, promotion): @@ -329,7 +363,8 @@ class Game: r.append(jump) for t in targets: a, b = move(t, dir), move(t, back) - en_passant = can_eat(b) and self.moves[-1] == (a,b) + en_passant = can_eat(b) and self.index>0 and\ + self.moves[self.index-1] == (a,b) if can_eat(t) or en_passant: r.append(t) return r @@ -389,6 +424,7 @@ class Game: return valid, new def AN_move(self, move): + AN = move info = parse_AN(move) if info == False: return False @@ -415,17 +451,28 @@ class Game: return False move = moves[0] self.move(*move) + self.AN_moves.append(AN) return True def test(): game = Game() - while not game.is_stall(): + move = "" + while not game.is_stall() and move!='q': move = input(">> ") + if move == "prev": + game.prev() + print(game) + continue + elif move == "next": + game.next() + print(game) + continue v = game.AN_move(move) if not v: print("Invalid") continue print(game) + print (game.history)