-
Notifications
You must be signed in to change notification settings - Fork 2
/
pieces.py
217 lines (163 loc) · 7.38 KB
/
pieces.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
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
from math import sqrt
class Piece:
"""A chess piece located on the chess board.
=== Public Attributes ===
colour:
The colour of the chess piece. Can either be 'B' or 'W'.
"""
colour: str
def __init__(self, colour: str) -> None:
"""Initialize a new Piece with a given colour.
"""
self.colour = colour
def check_valid_move(self, current_location: tuple,
attempted_location: tuple) -> bool:
"""Returns true iff the attempted move for the piece is valid.
For both current_location and attempted_location,
.._location[0] is the x coordinate and
.._location[1] is the y coordinate.
"""
raise NotImplementedError
class Pawn(Piece):
"""A chess pawn located on the chess board.
=== Private Attributes ===
_start:
True if the pawn has yet to make a move, False if it has moved.
=== Inherited Attributes ===
colour:
The colour of the chess piece. Can either be 'B' or 'W'.
"""
colour: str
_start: bool
def __init__(self, colour: str) -> None:
Piece.__init__(self, colour)
self._start = True
def check_valid_move(self, current_location: tuple,
attempted_location: tuple) -> bool:
"""If the pawn has yet to move, return true if the attempted_location
is one or two spaces forward. If the pawn has already moved, return
true if the attempted_location is only one space forward.
Return false otherwise."""
if current_location[0] == attempted_location[0]:
if self._start and\
current_location[1] == (attempted_location[1] - 2):
return True
elif current_location[1] == (attempted_location[1] - 1):
return True
return False
def made_first_move(self) -> None:
self._start = False
class Knight(Piece):
"""A chess knight located on the chess board.
=== Inherited Attributes ===
colour:
The colour of the chess piece. Can either be 'B' or 'W'.
"""
colour: str
def __init__(self, colour: str) -> None:
Piece.__init__(self, colour)
def check_valid_move(self, current_location: tuple,
attempted_location: tuple) -> bool:
"""Return true iff the attempted_location is two spaces in any
direction and the one space to either side. Return false otherwise."""
# Checks above and to both sides
if attempted_location[1] == current_location[1] + 2 and \
(attempted_location[0] == current_location[0] + 1 or
attempted_location[0] == current_location[0] - 1):
return True
# Checks below and to both sides
elif attempted_location[1] == current_location[1] - 2 and \
(attempted_location[0] == current_location[0] + 1 or
attempted_location[0] == current_location[0] - 1):
return True
# Checks to the right and to up or down
elif attempted_location[0] == current_location[0] + 2 and \
(attempted_location[1] == current_location[1] + 1 or
attempted_location[1] == current_location[1] - 1):
return True
# Checks to the left and to up or down
elif attempted_location[0] == current_location[0] - 2 and \
(attempted_location[1] == current_location[1] + 1 or
attempted_location[1] == current_location[1] - 1):
return True
return False
class Rook(Piece):
"""A chess rook located on the chess board.
=== Inherited Attributes ===
colour:
The colour of the chess piece. Can either be 'B' or 'W'.
"""
colour: str
def __init__(self, colour: str) -> None:
Piece.__init__(self, colour)
def check_valid_move(self, current_location: tuple,
attempted_location: tuple) -> bool:
"""Return true iff attempted_location is on the same x or y plane
as current_location."""
if current_location[0] == attempted_location[0] or \
current_location[1] == attempted_location[1]:
return True
return False
class Bishop(Piece):
"""A chess bishop located on the chess board.
=== Inherited Attributes ===
colour:
The colour of the chess piece. Can either be 'B' or 'W'.
"""
colour: str
def __init__(self, colour: str) -> None:
Piece.__init__(self, colour)
def check_valid_move(self, current_location: tuple,
attempted_location: tuple) -> bool:
"""Return true iff attempted_location is diagonal on the board
to current_location. Return False otherwise."""
change_x = int(sqrt(current_location[0] - attempted_location[0])**2)
change_y = int(sqrt(current_location[1] - attempted_location[1])**2)
if change_x == change_y:
return True
return False
class Queen(Piece):
"""A chess queen located on the chess board.
=== Inherited Attributes ===
colour:
The colour of the chess piece. Can either be 'B' or 'W'.
"""
colour: str
def __init__(self, colour: str) -> None:
Piece.__init__(self, colour)
def check_valid_move(self, current_location: tuple,
attempted_location: tuple) -> bool:
"""Return true iff attempted_location is diagonal on the board
or one space in any direction from current_location.
Return false otherwise."""
change_x = int(sqrt(current_location[0] - attempted_location[0])**2)
change_y = int(sqrt(current_location[1] - attempted_location[1])**2)
if change_x == change_y:
return True
elif current_location[0] == attempted_location[0] and \
(current_location[1] + 1 == attempted_location[1] or
current_location[1] - 1 == attempted_location[1]):
return True
elif current_location[1] == attempted_location[1] and \
(current_location[0] + 1 == attempted_location[0] or
current_location[0] - 1 == attempted_location[0]):
return False
class King(Piece):
"""A chess king located on the chess board.
=== Inherited Attributes ===
colour:
The colour of the chess piece. Can either be 'B' or 'W'.
"""
colour: str
def __init__(self, colour: str) -> None:
Piece.__init__(self, colour)
def check_valid_move(self, current_location: tuple,
attempted_location: tuple) -> bool:
"""Return true iff attempted_location is one space away from
current_location in any direction."""
if current_location[0] - 1 <= \
attempted_location[0] <= current_location[0] + 1 and \
current_location[1] - 1 <= \
attempted_location[1] <= current_location[1] + 1:
return True
return False