Added parser for algebraic notation and turn variable to Game class

master
Tibor Bizjak 2019-09-06 17:10:43 +02:00
parent dad2fc7d58
commit e68196be39
1 changed files with 54 additions and 3 deletions

View File

@ -21,6 +21,12 @@ init_positions = {"pawn" : cross(files, pawn_ranks),
"king" : cross("e", home_ranks) "king" : cross("e", home_ranks)
} }
AN_names = {'R' : "rook",
'N' : "knight",
'B' : "bishop",
'Q' : "queen",
'K' : "king"}
def get_rank(sq): def get_rank(sq):
return int(sq[1]) return int(sq[1])
@ -39,6 +45,49 @@ def invert(color):
return "black" return "black"
return "white" return "white"
class Empty:
def __repr__(self):
return str(vars(self))
def parse_AN(move):
def suffix_in(l, dval=False, i=1):
nonlocal move
x = move[-i:]
if x in list(l):
move = move[:-i]
return x
return dval
queenside = ["{}-{}-{}".format(c,c,c) for c in "0O"]
kingside = ["{}-{}".format(c,c) for c in "0O"]
r = Empty()
r.kingside = r.queenside = False
if move in queenside:
r.queenside = True
return r
if move in kingside:
r.kingside = True
return r
r.move = move
r.mate = suffix_in('#') == '#'
r.check = suffix_in('+') == '+'
r.promotion = suffix_in(AN_names)
if r.promotion:
r.promotion = AN_names[r.promotion]
_ = suffix_in('=')
r.dest = suffix_in(squares, i=2)
r.capture = suffix_in("xX") != False
r.rank = suffix_in(ranks, None)
r.file = suffix_in(files, None)
r.piece = suffix_in(AN_names, 'pawn')
if len(move) > 0 or (r.promotion and r.piece != "pawn") or not r.dest:
return False
if r.piece != "pawn":
r.piece = AN_names[r.piece]
return r
up, down = (0, 1), (0, -1) up, down = (0, 1), (0, -1)
left, right = (-1, 0), (1, 0) left, right = (-1, 0), (1, 0)
rook_dirs = (up, down, left, right) rook_dirs = (up, down, left, right)
@ -71,6 +120,7 @@ class Game:
self.make_board() self.make_board()
self.moves = [] self.moves = []
self.stack = [] self.stack = []
self.turn = "white"
def __repr__(self): def __repr__(self):
# Unicode board representation # Unicode board representation
@ -119,10 +169,12 @@ class Game:
board[source] = Piece() board[source] = Piece()
board[target] = moved board[target] = moved
self.turn = invert(moved.color)
return True return True
def is_legal(self, source, target): def is_legal(self, source, target):
return target in self.possible_moves(source) color = self.board[source].color
return color == self.turn and target in self.possible_moves(source)
def is_attacked(self, color, sq): def is_attacked(self, color, sq):
enemy_color = invert(color) enemy_color = invert(color)
@ -217,7 +269,7 @@ def test():
game = Game() game = Game()
assert len(squares) == 8**2 assert len(squares) == 8**2
assert sum(map(len, init_positions.values())) == 8*4 assert sum(map(len, init_positions.values())) == 8*4
moves = [("a2", "a3"), ("b1", "c3"), ("c3", "b5"), ("b5", "c7")] moves = [("a2", "a3"), ("b1", "c3"), ("c3", "b5"), ("b8", "c6")]
for m in moves: for m in moves:
game.move(*m) game.move(*m)
print (game) print (game)
@ -228,4 +280,3 @@ def test():
print(game.possible_moves("c3")) print(game.possible_moves("c3"))
print(game.is_attacked("black", "d8")) print(game.is_attacked("black", "d8"))
test()