Single_Player_Chess/chess.py

78 lines
2.0 KiB
Python
Raw Normal View History

2019-09-01 21:29:25 +02:00
from unicodedata import lookup
2019-09-01 16:52:51 +02:00
def cross(A, B):
return tuple(a+b for a in A for b in B)
ranks = "12345678"
files = "abcdefgh"
squares = cross(files, ranks)
pawn_ranks = "27"
home_ranks = "18"
init_positions = {"pawn" : cross(files, pawn_ranks),
"rook" : cross("ah", home_ranks),
"knight" : cross("bg", home_ranks),
"bishop" : cross("cf", home_ranks),
"queen" : cross("d", home_ranks),
"king" : cross("e", home_ranks)
}
2019-09-01 21:29:25 +02:00
2019-09-03 20:46:59 +02:00
class Piece:
def __init__(self, color=None, piece=None):
self.color = color
self.piece = piece
def __repr__(self):
if None in (self.piece, self.color):
return None
name = self.color.upper() + " CHESS " + self.piece.upper()
return lookup(name)
2019-09-01 21:29:25 +02:00
2019-09-01 16:52:51 +02:00
class Game:
def __init__(self):
self.make_board()
2019-09-01 21:29:25 +02:00
def __repr__(self):
# Unicode board representation
r = ""
for rank in ranks:
r += rank + " |"
for file in files:
sq = file+rank
r += " "
if self.is_empty(sq):
r += " "
2019-09-01 21:29:25 +02:00
else:
r += repr(self.board[sq])
2019-09-01 21:29:25 +02:00
r += "\n"
r += " +" + "-"*16 + "\n"
r += " "*4 + " ".join(list(files))
return r
2019-09-01 16:52:51 +02:00
def make_board(self):
2019-09-03 20:46:59 +02:00
self.board = dict((sq, Piece()) for sq in squares)
2019-09-01 16:52:51 +02:00
# Add pieces
for piece, positions in init_positions.items():
for sq in positions:
2019-09-03 20:46:59 +02:00
self.board[sq].piece = piece
2019-09-01 16:52:51 +02:00
# Add colors
for sq in cross(files, "12"):
2019-09-03 20:46:59 +02:00
self.board[sq].color = "white"
2019-09-01 16:52:51 +02:00
for sq in cross(files, "78"):
2019-09-03 20:46:59 +02:00
self.board[sq].color = "black"
2019-09-01 16:52:51 +02:00
def is_empty(self, sq):
return self.board[sq].piece == None
2019-09-01 21:29:25 +02:00
2019-09-01 16:52:51 +02:00
def test():
game = Game()
assert len(squares) == 8**2
assert sum(map(len, init_positions.values())) == 8*4
2019-09-01 21:29:25 +02:00
print(game)
2019-09-01 16:52:51 +02:00
test()