-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathgameboard4.py
132 lines (97 loc) · 4.2 KB
/
gameboard4.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
#!/usr/bin/env python3
# Copyright © 2012-13 Qtrac Ltd. All rights reserved.
# This program or module is free software: you can redistribute it
# and/or modify it under the terms of the GNU General Public License as
# published by the Free Software Foundation, either version 3 of the
# License, or (at your option) any later version. It is provided for
# educational purposes and is distributed in the hope that it will be
# useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
# General Public License for more details.
import io
import itertools
import os
import sys
import tempfile
import unicodedata
DRAUGHT, PAWN, ROOK, KNIGHT, BISHOP, KING, QUEEN = ("DRAUGHT", "PAWN",
"ROOK", "KNIGHT", "BISHOP", "KING", "QUEEN")
BLACK, WHITE = ("BLACK", "WHITE")
def main():
checkers = CheckersBoard()
print(checkers)
chess = ChessBoard()
print(chess)
if sys.platform.startswith("win"):
filename = os.path.join(tempfile.gettempdir(), "gameboard.txt")
with open(filename, "w", encoding="utf-8") as file:
file.write(sys.stdout.getvalue())
print("wrote '{}'".format(filename), file=sys.__stdout__)
if sys.platform.startswith("win"):
def console(char, background):
return char or " "
sys.stdout = io.StringIO()
else:
def console(char, background):
return "\x1B[{}m{}\x1B[0m".format(
43 if background == BLACK else 47, char or " ")
class AbstractBoard:
def __init__(self, rows, columns):
self.board = [[None for _ in range(columns)] for _ in range(rows)]
self.populate_board()
def populate_board(self):
raise NotImplementedError()
def __str__(self):
squares = []
for y, row in enumerate(self.board):
for x, piece in enumerate(row):
square = console(piece, BLACK if (y + x) % 2 else WHITE)
squares.append(square)
squares.append("\n")
return "".join(squares)
class CheckersBoard(AbstractBoard):
def __init__(self):
self.populate_board()
def populate_board(self): # Thanks to Doug Hellmann for the idea!
def black():
return create_piece(DRAUGHT, BLACK)
def white():
return create_piece(DRAUGHT, WHITE)
rows = ((None, black()), (black(), None), (None, black()),
(black(), None), # 4 black rows
(None, None), (None, None), # 2 blank rows
(None, white()), (white(), None), (None, white()),
(white(), None)) # 4 white rows
self.board = [list(itertools.islice(
itertools.cycle(squares), 0, len(rows))) for squares in rows]
class ChessBoard(AbstractBoard):
def __init__(self):
super().__init__(8, 8)
def populate_board(self):
for row, color in ((0, BLACK), (7, WHITE)):
for columns, kind in (((0, 7), ROOK), ((1, 6), KNIGHT),
((2, 5), BISHOP), ((3,), QUEEN), ((4,), KING)):
for column in columns:
self.board[row][column] = create_piece(kind, color)
for column in range(8):
for row, color in ((1, BLACK), (6, WHITE)):
self.board[row][column] = create_piece(PAWN, color)
def create_piece(kind, color):
color = "White" if color == WHITE else "Black"
name = {DRAUGHT: "Draught", PAWN: "ChessPawn", ROOK: "ChessRook",
KNIGHT: "ChessKnight", BISHOP: "ChessBishop",
KING: "ChessKing", QUEEN: "ChessQueen"}[kind]
return globals()[color + name]()
class Piece(str):
__slots__ = ()
for code in itertools.chain((0x26C0, 0x26C2), range(0x2654, 0x2660)):
char = chr(code)
name = unicodedata.name(char).title().replace(" ", "")
if name.endswith("sMan"):
name = name[:-4]
new = (lambda char: lambda Class: Piece.__new__(Class, char))(char)
new.__name__ = "__new__"
Class = type(name, (Piece,), dict(__slots__=(), __new__=new))
globals()[name] = Class
if __name__ == "__main__":
main()