-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathgameboard3.py
144 lines (106 loc) · 4.52 KB
/
gameboard3.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
133
134
135
136
137
138
139
140
141
142
143
144
#!/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 Piece(str):
__slots__ = ()
def make_new_method(char): # Needed to create a fresh method each time
def new(Class): # Can't use super() or super(Piece, Class)
return Piece.__new__(Class, char)
return new
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 = make_new_method(char)
Class = type(name, (Piece,), dict(__slots__=(), __new__=new))
setattr(sys.modules[__name__], name, Class) # Can be done better!
class AbstractBoard:
__classForPiece = {(DRAUGHT, BLACK): BlackDraught,
(PAWN, BLACK): BlackChessPawn,
(ROOK, BLACK): BlackChessRook,
(KNIGHT, BLACK): BlackChessKnight,
(BISHOP, BLACK): BlackChessBishop,
(KING, BLACK): BlackChessKing,
(QUEEN, BLACK): BlackChessQueen,
(DRAUGHT, WHITE): WhiteDraught,
(PAWN, WHITE): WhiteChessPawn,
(ROOK, WHITE): WhiteChessRook,
(KNIGHT, WHITE): WhiteChessKnight,
(BISHOP, WHITE): WhiteChessBishop,
(KING, WHITE): WhiteChessKing,
(QUEEN, WHITE): WhiteChessQueen}
def __init__(self, rows, columns):
self.board = [[None for _ in range(columns)] for _ in range(rows)]
self.populate_board()
def create_piece(self, kind, color):
return AbstractBoard.__classForPiece[kind, color]()
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):
super().__init__(10, 10)
def populate_board(self):
for x in range(0, 9, 2):
for y in range(4):
column = x + ((y + 1) % 2)
for row, color in ((y, BLACK), (y + 6, WHITE)):
self.board[row][column] = self.create_piece(DRAUGHT,
color)
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] = self.create_piece(kind,
color)
for column in range(8):
for row, color in ((1, BLACK), (6, WHITE)):
self.board[row][column] = self.create_piece(PAWN, color)
if __name__ == "__main__":
main()