Added possible moves for king and pawn

master
Tibor Bizjak 2019-09-03 23:33:24 +02:00
parent ad7ad5e066
commit e93d09f939
1 changed files with 38 additions and 4 deletions

View File

@ -84,6 +84,9 @@ class Game:
def occupying(self, piece): def occupying(self, piece):
return [sq for sq in squares if self.board[sq] == piece] return [sq for sq in squares if self.board[sq] == piece]
def is_attacked(self, sq):
return False
def possible_moves(self, sq): def possible_moves(self, sq):
def is_possible(target): def is_possible(target):
return target in squares and \ return target in squares and \
@ -111,10 +114,37 @@ class Game:
vecs = [ldvecs, rdvecs, negatevs(ldvecs), negatevs(rdvecs)] vecs = [ldvecs, rdvecs, negatevs(ldvecs), negatevs(rdvecs)]
return sum(map(are_possible, vecs), []) return sum(map(are_possible, vecs), [])
piece = self.board[sq].piece board = self.board
piece = board[sq].piece
color = board[sq].color
if piece == "pawn": if piece == "pawn":
pass r = []
direction = (0,1)
if color == "black":
direction = (0, -1)
frwd = addv(sq, direction)
jump = addv(frwd, direction)
eatl = addv(frwd, (-1, 0))
eatr = addv(frwd, (1, 0))
if is_possible(frwd) and self.is_empty(frwd):
r.append(frwd)
checklr = lambda x: is_possible(x) \
and \
not self.is_empty(x) \
and \
board[x].color != color
if checklr(eatl):
r.append(eatl)
if checklr(eatr):
r.append(eatr)
is_on_pawn_rank = (color == "black" and sq[1]=='7') \
or \
(color == "white" and sq[1]=='2')
if is_possible(jump) and frwd in r and self.is_empty(jump) and is_on_pawn_rank:
r.append(jump)
return r
elif piece == "knight": elif piece == "knight":
vecs = list(product((1,-1), (2,-2))) vecs = list(product((1,-1), (2,-2)))
vecs += list(product((2,-2), (1,-1))) vecs += list(product((2,-2), (1,-1)))
@ -125,6 +155,10 @@ class Game:
return possible_bishop() return possible_bishop()
elif piece == "queen": elif piece == "queen":
return possible_bishop() + possible_rook() return possible_bishop() + possible_rook()
elif piece == "king":
vecs = product([-1, 0, 1], [-1, 0, 1])
return [sq for sq in addvs(sq, vecs)
if is_possible(sq) and not self.is_attacked(sq)]
@ -132,8 +166,8 @@ 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
game.board["d4"] = Piece("black", "bishop") game.board["d3"] = Piece("black", "queen")
print(game) print(game)
print (game.possible_moves("d4")) print (game.possible_moves("d2"))
test() test()