Professional Documents
Culture Documents
Chess Saksham Pages 1 Merged Numbered
Chess Saksham Pages 1 Merged Numbered
Chess
Using Python
______________________________________________________________________________________________________________________
Submitted By Saksham
Class XII
Section B
______________________________________________________________________________________________________________________
1
______________________________________________________________________________________________________________________
INDEX
______________________________________________________________________________________________________________________
Certificate 3
Acknowledgment 4
About 5
Software and Hardware Requirements 6
Source Code 7
Output Screen 64
Bibliography 67
2
______________________________________________________________________________________________________________________
CERTIFICATE
______________________________________________________________________________________________________________________
______________________________________________________________________________________________________________________
3
______________________________________________________________________________________________________________________
ACKNOWLEDGEMENT
______________________________________________________________________________________________________________________
______________________________________________________________________________________________________________________
(Signature of Student)
______________________________________________________________________________________________________________________
4
______________________________________________________________________________________________________________________
ABOUT
______________________________________________________________________________________________________________________
5
______________________________________________________________________________________________________________________
SOFTWARE
AND HARDWARE REQUIREMENTS
______________________________________________________________________________________________________________________
Processor
Intel Core i3-2310m (Any dual core would Work)
Memory
A minimum of 2Gb
Storage
A minimum of 2Gb
Software
Command Prompt
Python 3.8 or Higher
Python IDLE
6
SOURCE CODE
STARTS HERE
7
File Structure
│ board_image.png
│ start.py
│ __init__.py
│
├───classes
│ │ board.py
│ │ piece.py
│ │ position.py
│ │ vars.py
│ │ __init__.py
│ │
│ └───pieces
│ bishop.py
│ king.py
│ knight.py
│ pawn.py
│ queen.py
│ rook.py
│ __init__.py
│
├───database
│ config.py
│ connect.py
│ create.py
│ get.py
│ setup.py
│ update.py
│
└───ui
auth.py
classes.py
game.py
__init__.py
8
9
start.py
10
__init__.py
11
classes/board.py
14
classes/peice.py
1 class Piece :
2 def __init__(self, board, piece_color, piece_position):
3 self.board = board # Board on which the piece is put
4 self.piece_color = piece_color # Color of the piece
5 self.piece_position = piece_position # Code of the position at which the piece is put
6
7 def forced_move(self, to):
8 """
9 Move piece from self.piece_position to given position even if given position is not in valid moves
10 """
11
12 # Remove the piece from it's original position
13 self.board.position_dict[self.piece_position].piece = None
14 # Put the piece on thr given 'to' position
15 self.board.position_dict[to].piece = self
16 # Update the name of the position at which the piece is
17 self.piece_position = to
18
19 def move(self, to):
20 """
21 Move piece from self.piece_position to given position if given position is in valid moves
22 """
23
24 # Check if the given 'to' position is a valid move
25 if to not in self.get_moves():
26 raise ValueError("Not a valid move!! ")
27
28 #generate notations for moves
29 notation = f"{self.piece_position}_{to} "
30
31 # Move the piece
32 self.forced_move(to)
33
34 return notation
35
36
15
classes/position.py
16
classes/vars.py
17
classes/pieces/bishop.py
1
class Bishop(Piece):
2
"""
3
Creates a bishop object for given board, with given piece color and piece position
4
"""
5
def __init__(self, board, piece_color, piece_position):
6
"""
7
board: board object
8
piece_color: color of the piece
9
piece_position: position code of the piece
10
"""
11
super().__init__(board, piece_color, piece_position)
12
13
def get_moves(self):
14
15 """
16 Get all possible moves of the piece
17 """
18
19 valid_moves_bishop = []
20 x = ord(self.piece_position[0])
21 y = int(self.piece_position[1])
22
23 if self.piece_color == "white":
24 # up left loop
25 new_x = x
26 new_y = y
27 while True:
28 new_x = new_x - 1
29 new_y = new_y + 1
30 new_pos = f"{chr(new_x)}{new_y}"
31 if new_pos not in pos_tuple:
32 break
33 piece_at_new_position = self.board.position_dict[new_pos].piece
34 if piece_at_new_position is None:
35 valid_moves_bishop.append(new_pos)
36 continue
37 if piece_at_new_position.piece_color == "black" and type(piece_at_new_position) != King:
38 valid_moves_bishop.append(new_pos)
39 break
40
41 # up right loop
42 new_x = x
43 new_y = y
44 while True:
45 new_x = new_x + 1
46 new_y = new_y + 1
47 new_pos = f"{chr(new_x)}{new_y}"
48 if new_pos not in pos_tuple:
49 break
50 piece_at_new_position = self.board.position_dict[new_pos].piece
51 if piece_at_new_position is None:
52 valid_moves_bishop.append(new_pos)
53 continue
54
if piece_at_new_position.piece_color == "black" and type(piece_at_new_position) != King:
55
valid_moves_bishop.append(new_pos)
56
break
57
58
# down right loop
59
new_x = x
60
61
new_y = y 18
while True:
62
classes/pieces/bishop.py
63 new_x = new_x + 1
64 new_y = new_y - 1
65 new_pos = f"{chr(new_x)}{new_y}"
66 if new_pos not in pos_tuple:
67 break
68 piece_at_new_position = self.board.position_dict[new_pos].piece
69 if piece_at_new_position is None:
70 valid_moves_bishop.append(new_pos)
71 continue
72 if piece_at_new_position.piece_color == "black" and type(piece_at_new_position) != King:
73 valid_moves_bishop.append(new_pos)
74 break
75
76 # down left loop
77 new_x = x
78 new_y = y
79 while True:
80
new_x = new_x - 1
81
new_y = new_y -1
82
new_pos = f"{chr(new_x)}{new_y}"
83
if new_pos not in pos_tuple:
84
break
85
piece_at_new_position = self.board.position_dict[new_pos].piece
86
if piece_at_new_position is None:
87
88 valid_moves_bishop.append(new_pos)
89 continue
90 if piece_at_new_position.piece_color == "black" and type(piece_at_new_position) != King:
91 valid_moves_bishop.append(new_pos)
92 break
93
94 if self.piece_color == "black":
95 # up left loop
96 new_x = x
97 new_y = y
98 while True:
99 new_x = new_x - 1
100 new_y = new_y - 1
101 new_pos = f"{chr(new_x)}{new_y}"
102 if new_pos not in pos_tuple:
103 break
104 piece_at_new_position = self.board.position_dict[new_pos].piece
105 if piece_at_new_position is None:
106 valid_moves_bishop.append(new_pos)
107 continue
108 if piece_at_new_position.piece_color == "white" and type(piece_at_new_position) != King:
109 valid_moves_bishop.append(new_pos)
110 break
111
112 # up right loop
113 new_x = x
114 new_y = y
115 while True:
116 new_x = new_x + 1
117 new_y = new_y - 1
118 new_pos = f"{chr(new_x)}{new_y}"
119 if new_pos not in pos_tuple:
120
break
121
piece_at_new_position = self.board.position_dict[new_pos].piece
122
if piece_at_new_position is None:
123
valid_moves_bishop.append(new_pos)
124
continue
125
126 if piece_at_new_position.piece_color == "white" and type(piece_at_new_position) != King:
127 valid_moves_bishop.append(new_pos)
128 break 19
classes/pieces/bishop.py
129 # down right loop
130 new_x = x
131 new_y = y
132 while True:
133 new_x = new_x + 1
134 new_y = new_y + 1
135 new_pos = f"{chr(new_x)}{new_y}"
136 if new_pos not in pos_tuple:
137 break
138 piece_at_new_position = self.board.position_dict[new_pos].piece
139 if piece_at_new_position is None:
140 valid_moves_bishop.append(new_pos)
141 continue
142 if piece_at_new_position.piece_color == "white" and type(piece_at_new_position) != King:
143 valid_moves_bishop.append(new_pos)
144 break
145
146
# down left loop
147
new_x = x
148
new_y = y
149
while True:
150
new_x = new_x - 1
151
new_y = new_y + 1
152
new_pos = f"{chr(new_x)}{new_y}"
153
if new_pos not in pos_tuple:
154
break
155
156 piece_at_new_position = self.board.position_dict[new_pos].piece
157 if piece_at_new_position is None:
158 valid_moves_bishop.append(new_pos)
159 continue
160 if piece_at_new_position.piece_color == "white" and type(piece_at_new_position) != King:
161 valid_moves_bishop.append(new_pos)
162 break
163
164 # Select same color king
165 for pos in pos_tuple:
166 position = self.board.position_dict[pos]
167 if position.piece is not None and type(position.piece) == King and position.piece.piece_color == self.piece_color:
168 my_king = position.piece
169 break
170
171 # If king is in check, allow only those moves which prevent the check
172 if my_king.is_in_check():
173 # Play every valid move and see if king is still in check.
174 # If king remains in check, then that valid move is removed
175 new_valid_moves_bishop = []
176 initial_position = self.piece_position
177 for final_position in valid_moves_bishop:
178 piece_already_at_final_position = self.board.position_dict[final_position].piece
179 self.forced_move(final_position)
180 if not my_king.is_in_check():
181 new_valid_moves_bishop.append(final_position)
182 self.forced_move(initial_position)
183 self.board.position_dict[final_position].piece = piece_already_at_final_position
184 return new_valid_moves_bishop
185
186 return valid_moves_bishop
187
188 def get_invalid_moves_for_opposite_king(self):
189
"""
190
Get the moves where opposite color king cannot move
191
"""
192
193
194
invalid_moves_for_king = [] 20
x = ord(self.piece_position[0])
classes/pieces/bishop.py
195 y = int(self.piece_position[1])
196
197 # Includes every possible move of the piece
198 # If it encounters a piece loop terminates , unless ->
199 # If it encounters a opposite color king , then it continues to get invalid moves for opposite king
200
201 if self.piece_color == "white":
202 # up left loop
203 new_x = x
204 new_y = y
205 while True:
206 new_x = new_x - 1
207 new_y = new_y + 1
208 new_pos = f"{chr(new_x)}{new_y}"
209 if new_pos not in pos_tuple:
210 break
211 invalid_moves_for_king.append(new_pos)
212 piece_at_new_position = self.board.position_dict[new_pos].piece
213 if piece_at_new_position is not None :
214 if type(piece_at_new_position) == King:
215 if piece_at_new_position.piece_color == "black":
216
continue
217
break
218
break
219
220
221 # up right loop
222 new_x = x
223 new_y = y
224 while True:
225 new_x = new_x + 1
226 new_y = new_y + 1
227 new_pos = f"{chr(new_x)}{new_y}"
228 if new_pos not in pos_tuple:
229 break
230 invalid_moves_for_king.append(new_pos)
231 piece_at_new_position = self.board.position_dict[new_pos].piece
232 if piece_at_new_position is not None:
233 if type(piece_at_new_position) == King:
234 if piece_at_new_position.piece_color == "black":
235 continue
236 break
237 break
238 # down right loop
239 new_x = x
240 new_y = y
241 while True:
242 new_x = new_x + 1
243 new_y = new_y - 1
244 new_pos = f"{chr(new_x)}{new_y}"
245 if new_pos not in pos_tuple:
246 break
247 invalid_moves_for_king.append(new_pos)
248 piece_at_new_position = self.board.position_dict[new_pos].piece
249 if piece_at_new_position is not None :
250
if type(piece_at_new_position) == King:
251
if piece_at_new_position.piece_color == "black":
252
continue
253
254 break
255 break
256
257 # down left loop
258 new_x = x
259 new_y = y
260 while True: 21
new_x = new_x - 1
classes/pieces/bishop.py
261 new_y = new_y -1
262 new_pos = f"{chr(new_x)}{new_y}"
263 if new_pos not in pos_tuple:
264 break
265 invalid_moves_for_king.append(new_pos)
266 piece_at_new_position = self.board.position_dict[new_pos].piece
267 if piece_at_new_position is not None :
268 if type(piece_at_new_position) == King:
269 if piece_at_new_position.piece_color == "black":
270 continue
271 break
272
break
273
274
if self.piece_color == "black":
275
# up left loop
276
new_x = x
277
new_y = y
278
while True:
279
280 new_x = new_x - 1
281 new_y = new_y - 1
282 new_pos = f"{chr(new_x)}{new_y}"
283 if new_pos not in pos_tuple:
284 break
285 invalid_moves_for_king.append(new_pos)
286 piece_at_new_position = self.board.position_dict[new_pos].piece
287 if piece_at_new_position is not None :
288 if type(piece_at_new_position) == King:
289 if piece_at_new_position.piece_color == "white":
290 continue
291 break
292 break
293 # up right loop
294 new_x = x
295 new_y = y
296 while True:
297 new_x = new_x + 1
298 new_y = new_y - 1
299 new_pos = f"{chr(new_x)}{new_y}"
300 if new_pos not in pos_tuple:
301 break
302 invalid_moves_for_king.append(new_pos)
303 piece_at_new_position = self.board.position_dict[new_pos].piece
304 if piece_at_new_position is not None :
305 if type(piece_at_new_position) == King:
306
if piece_at_new_position.piece_color == "white":
307
continue
308
break
309
310 break
311 # down right loop
312 new_x = x
313 new_y = y
314 while True:
315 new_x = new_x + 1
316 new_y = new_y + 1
317 new_pos = f"{chr(new_x)}{new_y}"
318 if new_pos not in pos_tuple:
319 break
320 invalid_moves_for_king.append(new_pos)
321 piece_at_new_position = self.board.position_dict[new_pos].piece
322 if piece_at_new_position is not None:
323 if type(piece_at_new_position) == King:
324 if piece_at_new_position.piece_color == "white":
325 continue
326
22
break
classes/pieces/bishop.py
327 break
328
329 # down left loop
330 new_x = x
331 new_y = y
332 while True:
333 new_x = new_x - 1
334 new_y = new_y + 1
335 new_pos = f"{chr(new_x)}{new_y}"
336 if new_pos not in pos_tuple:
337 break
338 invalid_moves_for_king.append(new_pos)
339 piece_at_new_position = self.board.position_dict[new_pos].piece
340 if piece_at_new_position is not None :
341 if type(piece_at_new_position) == King:
342 if piece_at_new_position.piece_color == "white":
343
continue
344
break
345
break
346
347
return invalid_moves_for_king
def __str__(self):
return f"{self.piece_color[0]}b"
23
classes/pieces/king.py
def __str__(self):
return f"{self.piece_color[0]}k"
28
classes/pieces/knight.py
32
classes/pieces/pawn.py
35
classes/pieces/queen.py
class Queen(Piece):
"""
Creates a queen object for given board, with given piece color and piece position
1 """
2 def __init__(self, board, piece_color, piece_position):
3 """
4 board: board object
5 piece_color: color of the piece
6 piece_position: position code of the piece
7 """
8 super().__init__(board, piece_color, piece_position)
9
10 def get_moves(self):
11 valid_moves_queen = []
12 x = ord(self.piece_position[0])
13 y = int(self.piece_position[1])
14
15 if self.piece_color == "white":
16
# up left loop
17
new_x = x
18
new_y = y
19
while True:
20
new_x = new_x - 1
21
new_y = new_y + 1
22
new_pos = f"{chr(new_x)}{new_y}"
23
if new_pos not in pos_tuple:
24
break
25
26 piece_at_new_position = self.board.position_dict[new_pos].piece
27 if piece_at_new_position is None:
28 valid_moves_queen.append(new_pos)
29 continue
30 if piece_at_new_position.piece_color == "black" and type(piece_at_new_position) != King:
31 valid_moves_queen.append(new_pos)
32 break
33 # up right loop
34 new_x = x
35 new_y = y
36 while True:
37 new_x = new_x + 1
38 new_y = new_y + 1
39 new_pos = f"{chr(new_x)}{new_y}"
40 if new_pos not in pos_tuple:
41 break
42 piece_at_new_position = self.board.position_dict[new_pos].piece
43 if piece_at_new_position is None:
44 valid_moves_queen.append(new_pos)
45 continue
46 if piece_at_new_position.piece_color == "black" and type(piece_at_new_position) != King:
47 valid_moves_queen.append(new_pos)
48 break
49 #down right loop
50 new_x = x
51 new_y = y
52 while True:
53 new_x = new_x + 1
54 new_y = new_y - 1
55 new_pos = f"{chr(new_x)}{new_y}"
56 if new_pos not in pos_tuple:
57
58
break 36
piece_at_new_position = self.board.position_dict[new_pos].piece
classes/pieces/queen.py
59 if piece_at_new_position is None:
60 valid_moves_queen.append(new_pos)
61 continue
62 if piece_at_new_position.piece_color == "black" and type(piece_at_new_position) != King:
63 valid_moves_queen.append(new_pos)
64 break
65 #down left loop
66 new_x = x
67 new_y = y
68 while True:
69 new_x = new_x - 1
70 new_y = new_y -1
71 new_pos = f"{chr(new_x)}{new_y}"
72 if new_pos not in pos_tuple:
73 break
74
piece_at_new_position = self.board.position_dict[new_pos].piece
75
if piece_at_new_position is None:
76
valid_moves_queen.append(new_pos)
77
continue
78
if piece_at_new_position.piece_color == "black" and type(piece_at_new_position) != King:
79
80 valid_moves_queen.append(new_pos)
81 break
82
83 #up loop
84 new_x = x
85 new_y = y
86 while True:
87 new_x = new_x
88 new_y = new_y + 1
89 new_pos = f"{chr(new_x)}{new_y}"
90 if new_pos not in pos_tuple:
91 break
92 piece_at_new_position = self.board.position_dict[new_pos].piece
93 if piece_at_new_position is None:
94 valid_moves_queen.append(new_pos)
95 continue
96 if piece_at_new_position.piece_color == "black" and type(piece_at_new_position) != King:
97 valid_moves_queen.append(new_pos)
98 break
99
100 #down loop
101 new_x = x
102 new_y = y
103 while True:
104 new_x = new_x
105 new_y = new_y + 1
106 new_pos = f"{chr(new_x)}{new_y}"
107 if new_pos not in pos_tuple:
108 break
109 piece_at_new_position = self.board.position_dict[new_pos].piece
110 if piece_at_new_position is None:
111 valid_moves_queen.append(new_pos)
112 continue
113
if piece_at_new_position.piece_color == "black" and type(piece_at_new_position) != King:
114
valid_moves_queen.append(new_pos)
115
break
116
117
# right loop
118
new_x = x
119
new_y = y
120
while True:
121
122 new_x = new_x + 1
123 new_y = new_y
124 new_pos = f"{chr(new_x)}{new_y}" 37
if new_pos not in pos_tuple:
classes/pieces/queen.py
125 break
126 piece_at_new_position = self.board.position_dict[new_pos].piece
127 if piece_at_new_position is None:
128 valid_moves_queen.append(new_pos)
129 continue
130 if piece_at_new_position.piece_color == "black" and type(piece_at_new_position) != King:
131 valid_moves_queen.append(new_pos)
132 break
133 # left loop
134 new_x = x
135 new_y = y
136 while True:
137 new_x = new_x - 1
138 new_y = new_y
139 new_pos = f"{chr(new_x)}{new_y}"
140 if new_pos not in pos_tuple:
141
break
142
piece_at_new_position = self.board.position_dict[new_pos].piece
143
if piece_at_new_position is None:
144
valid_moves_queen.append(new_pos)
145
continue
146
147 if piece_at_new_position.piece_color == "black" and type(piece_at_new_position) != King:
148 valid_moves_queen.append(new_pos)
149 break
150
151
152 if self.piece_color == "black":
153 # up left loop
154 new_x = x
155 new_y = y
156 while True:
157 new_x = new_x - 1
158 new_y = new_y - 1
159 new_pos = f"{chr(new_x)}{new_y}"
160 if new_pos not in pos_tuple:
161 break
162 piece_at_new_position = self.board.position_dict[new_pos].piece
163 if piece_at_new_position is None:
164 valid_moves_queen.append(new_pos)
165 continue
166 if piece_at_new_position.piece_color == "white" and type(piece_at_new_position) != King:
167 valid_moves_queen.append(new_pos)
168 break
169 # up right loop
170 new_x = x
171 new_y = y
172 while True:
173 new_x = new_x + 1
174 new_y = new_y - 1
175 new_pos = f"{chr(new_x)}{new_y}"
176 if new_pos not in pos_tuple:
177 break
178
piece_at_new_position = self.board.position_dict[new_pos].piece
179
if piece_at_new_position is None:
180
valid_moves_queen.append(new_pos)
181
continue
182
if piece_at_new_position.piece_color == "white" and type(piece_at_new_position) != King:
183
184 valid_moves_queen.append(new_pos)
185 break
186
187 #down right loop
188 new_x = x
189 new_y = y
190 while True: 38
new_x = new_x + 1
classes/pieces/queen.py
191 new_y = new_y + 1
192 new_pos = f"{chr(new_x)}{new_y}"
193 if new_pos not in pos_tuple:
194 break
195 piece_at_new_position = self.board.position_dict[new_pos].piece
196 if piece_at_new_position is None:
197 valid_moves_queen.append(new_pos)
198 continue
199 if piece_at_new_position.piece_color == "white" and type(piece_at_new_position) != King:
200 valid_moves_queen.append(new_pos)
201 break
202
203 #down left loop
204 new_x = x
205 new_y = y
206 while True:
207
new_x = new_x - 1
208
new_y = new_y + 1
209
new_pos = f"{chr(new_x)}{new_y}"
210
if new_pos not in pos_tuple:
211
break
212
piece_at_new_position = self.board.position_dict[new_pos].piece
213
if piece_at_new_position is None:
214
215 valid_moves_queen.append(new_pos)
216 continue
217 if piece_at_new_position.piece_color == "white" and type(piece_at_new_position) != King:
218 valid_moves_queen.append(new_pos)
219 break
220
221 # up loop
222 new_x = x
223 new_y = y
224 while True:
225 new_x = new_x
226 new_y = new_y - 1
227 new_pos = f"{chr(new_x)}{new_y}"
228 if new_pos not in pos_tuple:
229 break
230 piece_at_new_position = self.board.position_dict[new_pos].piece
231 if piece_at_new_position is None:
232 valid_moves_queen.append(new_pos)
233 continue
234 if piece_at_new_position.piece_color == "white" and type(piece_at_new_position) != King:
235 valid_moves_queen.append(new_pos)
236 break
237
238 #down loop
239 new_x = x
240 new_y = y
241 while True:
242 new_x = new_x
243 new_y = new_y + 1
244 new_pos = f"{chr(new_x)}{new_y}"
245 if new_pos not in pos_tuple:
246 break
247
piece_at_new_position = self.board.position_dict[new_pos].piece
248
if piece_at_new_position is None:
249
valid_moves_queen.append(new_pos)
250
continue
251
if piece_at_new_position.piece_color == "white" and type(piece_at_new_position) != King:
252
253 valid_moves_queen.append(new_pos)
254 break
255
256 # right loop 39
new_x = x
classes/pieces/queen.py
257 new_y = y
258 while True:
259 new_x = new_x + 1
260 new_y = new_y
261 new_pos = f"{chr(new_x)}{new_y}"
262 if new_pos not in pos_tuple:
263 break
264 piece_at_new_position = self.board.position_dict[new_pos].piece
265 if piece_at_new_position is None:
266 valid_moves_queen.append(new_pos)
267 continue
268 if piece_at_new_position.piece_color == "white" and type(piece_at_new_position) != King:
269 valid_moves_queen.append(new_pos)
270 break
271
# left loop
272
new_x = x
273
new_y = y
274
while True:
275
new_x = new_x - 1
276
new_y = new_y
277
new_pos = f"{chr(new_x)}{new_y}"
278
if new_pos not in pos_tuple:
279
break
280
281 piece_at_new_position = self.board.position_dict[new_pos].piece
282 if piece_at_new_position is None:
283 valid_moves_queen.append(new_pos)
284 continue
285 if piece_at_new_position.piece_color == "white" and type(piece_at_new_position) != King:
286 valid_moves_queen.append(new_pos)
287 break
288
289 # Select same color king
290 for pos in pos_tuple:
291 position = self.board.position_dict[pos]
292 if position.piece is not None and type(position.piece) == King and position.piece.piece_color == self.piece_color:
293 my_king = position.piece
294 break
295
296 # If king is in check, allow only those moves which prevent the check
297 if my_king.is_in_check():
298 # Play every valid move and see if king is still in check.
299 # If king remains in check, then that valid move is removed
300 new_valid_moves_queen = []
301 initial_position = self.piece_position
302 for final_position in valid_moves_queen:
303 piece_already_at_final_position = self.board.position_dict[final_position].piece
304 self.forced_move(final_position)
305 if not my_king.is_in_check():
306 new_valid_moves_queen.append(final_position)
307 self.forced_move(initial_position)
308 self.board.position_dict[final_position].piece = piece_already_at_final_position
309 return new_valid_moves_queen
310
311 return valid_moves_queen
312
313
314 def get_invalid_moves_for_opposite_king(self):
315
"""
316
Get the moves where opposite color king cannot move
317
"""
318
319
invalid_moves_for_king = []
320
x = ord(self.piece_position[0])
321
322
y = int(self.piece_position[1]) 40
classes/pieces/queen.py
323 # Includes every possible move of the piece
324 # If it encounters a piece loop terminates , unless ->
325 # If it encounters a opposite color king , then it continues to get invalid moves for opposite king
326
327 if self.piece_color == "white":
328 # up loop
329 new_x = x
330 new_y = y
331 # Includes every move and breaks the loop when a piece is encountered
332 while True:
333 new_x = new_x
334 new_y = new_y + 1
335 new_pos = f"{chr(new_x)}{new_y}"
336 if new_pos not in pos_tuple:
337 break
338 invalid_moves_for_king.append(new_pos)
339 piece_at_new_position = self.board.position_dict[new_pos].piece
340 if piece_at_new_position is not None:
341 if type(piece_at_new_position) == King:
342 if piece_at_new_position.piece_color == "black":
343
continue
344
break
345
break
346
347 # right loop
348 new_x = x
349 new_y = y
350 while True:
351 new_x = new_x + 1
352 new_y = new_y
353 new_pos = f"{chr(new_x)}{new_y}"
354 if new_pos not in pos_tuple:
355 break
356 invalid_moves_for_king.append(new_pos)
357 piece_at_new_position = self.board.position_dict[new_pos].piece
358 if piece_at_new_position is not None:
359 if type(piece_at_new_position) == King:
360 if piece_at_new_position.piece_color == "black":
361 continue
362 break
363 break
364
365 # down loop
366 new_x = x
367 new_y = y
368 while True:
369 new_x = new_x
370 new_y = new_y - 1
371 new_pos = f"{chr(new_x)}{new_y}"
372 if new_pos not in pos_tuple:
373 break
374 invalid_moves_for_king.append(new_pos)
375 piece_at_new_position = self.board.position_dict[new_pos].piece
376 if piece_at_new_position is not None:
377
if type(piece_at_new_position) == King:
378
if piece_at_new_position.piece_color == "black":
379
continue
380
381 break
382 break
383 # left loop
384 new_x = x
385 new_y = y
386 while True:
387 new_x = new_x - 1
388 new_y = new_y 41
new_pos = f"{chr(new_x)}{new_y}"
classes/pieces/queen.py
389 if new_pos not in pos_tuple:
390 break
391 invalid_moves_for_king.append(new_pos)
392 piece_at_new_position = self.board.position_dict[new_pos].piece
393 if piece_at_new_position is not None:
394 if type(piece_at_new_position) == King:
395 if piece_at_new_position.piece_color == "black":
396 continue
397 break
398
break
399
# up left loop
400
new_x = x
401
new_y = y
402
# Includes every move and breaks the loop when a piece is encountered
403
while True:
404
new_x = new_x - 1
405
new_y = new_y + 1
406
new_pos = f"{chr(new_x)}{new_y}"
407
if new_pos not in pos_tuple:
408
409 break
410 invalid_moves_for_king.append(new_pos)
411 piece_at_new_position = self.board.position_dict[new_pos].piece
412 if piece_at_new_position is not None:
413 if type(piece_at_new_position) == King:
414 if piece_at_new_position.piece_color == "black":
415 continue
416 break
417 break
418
419 # up right loop
420 new_x = x
421 new_y = y
422 while True:
423 new_x = new_x + 1
424 new_y = new_y + 1
425 new_pos = f"{chr(new_x)}{new_y}"
426 if new_pos not in pos_tuple:
427 break
428 invalid_moves_for_king.append(new_pos)
429 piece_at_new_position = self.board.position_dict[new_pos].piece
430 if piece_at_new_position is not None:
431 if type(piece_at_new_position) == King:
432 if piece_at_new_position.piece_color == "black":
433
continue
434
break
435
break
436
437 # down right loop
438 new_x = x
439 new_y = y
440 while True:
441 new_x = new_x + 1
442 new_y = new_y - 1
443 new_pos = f"{chr(new_x)}{new_y}"
444 if new_pos not in pos_tuple:
445 break
446 invalid_moves_for_king.append(new_pos)
447 piece_at_new_position = self.board.position_dict[new_pos].piece
448 if piece_at_new_position is not None:
449 if type(piece_at_new_position) == King:
450 if piece_at_new_position.piece_color == "black":
451 continue
452 break
453 break
454
42
# down left loop
classes/pieces/queen.py
455 new_x = x
456 new_y = y
457 while True:
458 new_x = new_x - 1
459 new_y = new_y -1
460 new_pos = f"{chr(new_x)}{new_y}"
461 if new_pos not in pos_tuple:
462 break
463 invalid_moves_for_king.append(new_pos)
464 piece_at_new_position = self.board.position_dict[new_pos].piece
465 if piece_at_new_position is not None:
466 if type(piece_at_new_position) == King:
467 if piece_at_new_position.piece_color == "black":
468 continue
469
break
470
break
471
472
if self.piece_color == "black":
473
474 # up loop
475 new_x = x
476 new_y = y
477 # Includes every move and breaks the loop when a piece is encountered
478 while True:
479 new_x = new_x
480 new_y = new_y - 1
481 new_pos = f"{chr(new_x)}{new_y}"
482 if new_pos not in pos_tuple:
483 break
484 invalid_moves_for_king.append(new_pos)
485 piece_at_new_position = self.board.position_dict[new_pos].piece
486 if piece_at_new_position is not None:
487 if type(piece_at_new_position) == King:
488 if piece_at_new_position.piece_color == "white":
489 continue
490 break
491 break
492
493 # right loop
494 new_x = x
495 new_y = y
496 while True:
497 new_x = new_x + 1
498 new_y = new_y
499 new_pos = f"{chr(new_x)}{new_y}"
500 if new_pos not in pos_tuple:
501 break
502 invalid_moves_for_king.append(new_pos)
503 piece_at_new_position = self.board.position_dict[new_pos].piece
504 if piece_at_new_position is not None:
505
if type(piece_at_new_position) == King:
506
if piece_at_new_position.piece_color == "white":
507
continue
508
509 break
510 break
511 # down loop
512 new_x = x
513 new_y = y
514 while True:
515 new_x = new_x
516 new_y = new_y + 1
517 new_pos = f"{chr(new_x)}{new_y}"
518 if new_pos not in pos_tuple:
519 break
520 invalid_moves_for_king.append(new_pos) 43
classes/pieces/queen.py
521 piece_at_new_position = self.board.position_dict[new_pos].piece
522 if piece_at_new_position is not None:
523 if type(piece_at_new_position) == King:
524 if piece_at_new_position.piece_color == "white":
525 continue
526 break
527 break
528
529 # left loop
530 new_x = x
531 new_y = y
532 while True:
533
new_x = new_x - 1
534
new_y = new_y
535
new_pos = f"{chr(new_x)}{new_y}"
536
if new_pos not in pos_tuple:
537
break
538
invalid_moves_for_king.append(new_pos)
539
piece_at_new_position = self.board.position_dict[new_pos].piece
540
if piece_at_new_position is not None :
541
542 if type(piece_at_new_position) == King:
543 if piece_at_new_position.piece_color == "white":
544 continue
545 break
546 break
547
548 # up left loop
549 new_x = x
550 new_y = y
551 # Includes every move and breaks the loop when a piece is encountered
552 while True:
553 new_x = new_x - 1
554 new_y = new_y - 1
555 new_pos = f"{chr(new_x)}{new_y}"
556 if new_pos not in pos_tuple:
557 break
558 invalid_moves_for_king.append(new_pos)
559 piece_at_new_position = self.board.position_dict[new_pos].piece
560 if piece_at_new_position is not None:
561 if type(piece_at_new_position) == King:
562 if piece_at_new_position.piece_color == "white":
563 continue
564 break
565
break
566
567
# up right loop
568
new_x = x
569
new_y = y
570
while True:
571
new_x = new_x + 1
572
new_y = new_y - 1
573
new_pos = f"{chr(new_x)}{new_y}"
574
if new_pos not in pos_tuple:
575
576 break
577 invalid_moves_for_king.append(new_pos)
578 piece_at_new_position = self.board.position_dict[new_pos].piece
579 if piece_at_new_position is not None:
580 if type(piece_at_new_position) == King:
581 if piece_at_new_position.piece_color == "white":
582 continue
583 break
584 break
585 # down right loop
586
44
new_x = x
classes/pieces/queen.py
587 new_y = y
588 while True:
589 new_x = new_x + 1
590 new_y = new_y + 1
591 new_pos = f"{chr(new_x)}{new_y}"
592 if new_pos not in pos_tuple:
593 break
594 invalid_moves_for_king.append(new_pos)
595 piece_at_new_position = self.board.position_dict[new_pos].piece
596 if piece_at_new_position is not None:
597 if type(piece_at_new_position) == King:
598 if piece_at_new_position.piece_color == "white":
599 continue
600
break
601
break
602
# down left loop
603
new_x = x
604
new_y = y
605
while True:
606
607 new_x = new_x - 1
608 new_y = new_y + 1
609 new_pos = f"{chr(new_x)}{new_y}"
610 if new_pos not in pos_tuple:
611 break
612 invalid_moves_for_king.append(new_pos)
613 piece_at_new_position = self.board.position_dict[new_pos].piece
614 if piece_at_new_position is not None:
615 if type(piece_at_new_position) == King:
616 if piece_at_new_position.piece_color == "white":
617 continue
618 break
619 break
620
return invalid_moves_for_king
def __str__(self):
return f"{self.piece_color[0]}q"
45
classes/pieces/rook.py
1 class Rook(Piece):
2
"""
3
Creates a rook object for given board, with given piece color and piece position
4
"""
5
def __init__(self, board, piece_color, piece_position):
6
"""
7
board: board object
8
piece_color: color of the piece
9
piece_position: position code of the piece
10
"""
11
super().__init__(board, piece_color, piece_position)
12
13
def get_moves(self):
14
"""
15
Get all possible moves of the piece
16
"""
17
valid_moves_rook = []
18
x = ord(self.piece_position[0])
19
y = int(self.piece_position[1])
20
21
if self.piece_color == "white":
22
23 # up loop
24 new_x = x
25 new_y = y
26 while True:
27 new_x = new_x
28 new_y = new_y + 1
29 new_pos = f"{chr(new_x)}{new_y}"
30 if new_pos not in pos_tuple:
31 break
32 piece_at_new_position = self.board.position_dict[new_pos].piece
33 if piece_at_new_position is None:
34 valid_moves_rook.append(new_pos)
35 continue
36 if piece_at_new_position.piece_color == "black" and type(piece_at_new_position) != King:
37 valid_moves_rook.append(new_pos)
38 break
39
40 #down loop
41 new_x = x
42 new_y = y
43 while True:
44 new_x = new_x
45 new_y = new_y - 1
46 new_pos = f"{chr(new_x)}{new_y}"
47 if new_pos not in pos_tuple:
48 break
49 piece_at_new_position = self.board.position_dict[new_pos].piece
50 if piece_at_new_position is None:
51 valid_moves_rook.append(new_pos)
52 continue
53 if piece_at_new_position.piece_color == "black" and type(piece_at_new_position) != King:
54
valid_moves_rook.append(new_pos)
55
break
56
57
# right loop
58
new_x = x
59
new_y = y
60
61
while True: 46
new_x = new_x + 1
62
classes/pieces/rook.py
63 new_y = new_y
64 new_pos = f"{chr(new_x)}{new_y}"
65 if new_pos not in pos_tuple:
66 break
67 piece_at_new_position = self.board.position_dict[new_pos].piece
68
69 if piece_at_new_position is None:
70 valid_moves_rook.append(new_pos)
71 continue
72 if piece_at_new_position.piece_color == "black" and type(piece_at_new_position) != King:
73 valid_moves_rook.append(new_pos)
74 break
75 # left loop
76 new_x = x
77 new_y = y
78 while True:
79
new_x = new_x - 1
80
new_y = new_y
81
new_pos = f"{chr(new_x)}{new_y}"
82
if new_pos not in pos_tuple:
83
break
84
piece_at_new_position = self.board.position_dict[new_pos].piece
85
86
if piece_at_new_position is None:
87
88 valid_moves_rook.append(new_pos)
89 continue
90 if piece_at_new_position.piece_color == "black" and type(piece_at_new_position) != King:
91 valid_moves_rook.append(new_pos)
92 break
93
94 elif self.piece_color == "black":
95 # up loop
96 new_x = x
97 new_y = y
98 while True:
99 new_x = new_x
100 new_y = new_y - 1
101 new_pos = f"{chr(new_x)}{new_y}"
102 if new_pos not in pos_tuple:
103 break
104 piece_at_new_position = self.board.position_dict[new_pos].piece
105 if piece_at_new_position is None:
106 valid_moves_rook.append(new_pos)
107 continue
108 if piece_at_new_position.piece_color == "white" and type(piece_at_new_position) != King:
109 valid_moves_rook.append(new_pos)
110 break
111
112 #down loop
113 new_x = x
114 new_y = y
115 while True:
116 new_x = new_x
117 new_y = new_y + 1
118 new_pos = f"{chr(new_x)}{new_y}"
119 if new_pos not in pos_tuple:
120
break
121
piece_at_new_position = self.board.position_dict[new_pos].piece
122
if piece_at_new_position is None:
123
valid_moves_rook.append(new_pos)
124
continue
125
126 if piece_at_new_position.piece_color == "white" and type(piece_at_new_position) != King:
127 valid_moves_rook.append(new_pos)
128 break 47
classes/pieces/rook.py
129 # right loop
130 new_x = x
131 new_y = y
132 while True:
133 new_x = new_x + 1
134 new_y = new_y
135 new_pos = f"{chr(new_x)}{new_y}"
136 if new_pos not in pos_tuple:
137 break
138 piece_at_new_position = self.board.position_dict[new_pos].piece
139 if piece_at_new_position is None:
140 valid_moves_rook.append(new_pos)
141 continue
142 if piece_at_new_position.piece_color == "white" and type(piece_at_new_position) != King:
143 valid_moves_rook.append(new_pos)
144 break
145
# left loop
146
new_x = x
147
new_y = y
148
while True:
149
new_x = new_x - 1
150
new_y = new_y
151
new_pos = f"{chr(new_x)}{new_y}"
152
if new_pos not in pos_tuple:
153
break
154
155 piece_at_new_position = self.board.position_dict[new_pos].piece
156 if piece_at_new_position is None:
157 valid_moves_rook.append(new_pos)
158 continue
159 if piece_at_new_position.piece_color == "white" and type(piece_at_new_position) != King :
160 valid_moves_rook.append(new_pos)
161 break
162
163 # Select same color king
164 for pos in pos_tuple:
165 position = self.board.position_dict[pos]
166 if position.piece is not None and type(position.piece) == King and position.piece.piece_color == self.piece_color:
167 my_king = position.piece
168 break
169
170 # If king is in check, allow only those moves which prevent the check
171 if my_king.is_in_check():
172 # Play every valid move and see if king is still in check.
173 # If king remains in check, then that valid move is removed
174 new_valid_moves_rook = []
175 initial_position = self.piece_position
176 for final_position in valid_moves_rook:
177 piece_already_at_final_position = self.board.position_dict[final_position].piece
178 self.forced_move(final_position)
179 if not my_king.is_in_check():
180 new_valid_moves_rook.append(final_position)
181 self.forced_move(initial_position)
182 self.board.position_dict[final_position].piece = piece_already_at_final_position
183 return new_valid_moves_rook
184
185 return valid_moves_rook
186
187 def get_invalid_moves_for_opposite_king(self):
188
"""
189
Get the moves where opposite color king cannot move
190
"""
191
192
invalid_moves_for_king = []
193
194
x = ord(self.piece_position[0]) 48
y = int(self.piece_position[1])
classes/pieces/rook.py
195
196 # Includes every possible move of the piece
197 # If it encounters a piece loop terminates , unless ->
198 # If it encounters a opposite color king , then it continues to get invalid moves for opposite king
199
200 if self.piece_color == "white":
201 # up loop
202 new_x = x
203 new_y = y
204 while True:
205 new_x = new_x
206 new_y = new_y + 1
207 new_pos = f"{chr(new_x)}{new_y}"
208 if new_pos not in pos_tuple:
209 break
210 invalid_moves_for_king.append(new_pos)
211 piece_at_new_position = self.board.position_dict[new_pos].piece
212 if piece_at_new_position is not None :
213 if type(piece_at_new_position) == King:
214 if piece_at_new_position.piece_color == "black":
215
continue
216
break
217
break
218
219
220 # right loop
221 new_x = x
222 new_y = y
223 while True:
224 new_x = new_x + 1
225 new_y = new_y
226 new_pos = f"{chr(new_x)}{new_y}"
227 if new_pos not in pos_tuple:
228 break
229 invalid_moves_for_king.append(new_pos)
230 piece_at_new_position = self.board.position_dict[new_pos].piece
231 if piece_at_new_position is not None :
232 if type(piece_at_new_position) == King:
233 if piece_at_new_position.piece_color == "black":
234 continue
235 break
236 break
237
238 # down loop
239 new_x = x
240 new_y = y
241 while True:
242 new_x = new_x
243 new_y = new_y - 1
244 new_pos = f"{chr(new_x)}{new_y}"
245 if new_pos not in pos_tuple:
246 break
247 invalid_moves_for_king.append(new_pos)
248 piece_at_new_position = self.board.position_dict[new_pos].piece
249 if piece_at_new_position is not None :
250
if type(piece_at_new_position) == King:
251
if piece_at_new_position.piece_color == "black":
252
continue
253
254 break
255 break
256 # left loop
257 new_x = x
258 new_y = y
259 while True:
260 new_x = new_x - 1 49
new_y = new_y
classes/pieces/rook.py
261 new_pos = f"{chr(new_x)}{new_y}"
262 if new_pos not in pos_tuple:
263 break
264 invalid_moves_for_king.append(new_pos)
265 piece_at_new_position = self.board.position_dict[new_pos].piece
266 if piece_at_new_position is not None :
267 if type(piece_at_new_position) == King:
268 if piece_at_new_position.piece_color == "black":
269 continue
270 break
271
break
272
273
if self.piece_color == "black":
274
# up loop
275
new_x = x
276
new_y = y
277
# Includes every move and breaks the loop when a piece is encountered
278
while True:
279
280 new_x = new_x
281 new_y = new_y - 1
282 new_pos = f"{chr(new_x)}{new_y}"
283 if new_pos not in pos_tuple:
284 break
285 invalid_moves_for_king.append(new_pos)
286 piece_at_new_position = self.board.position_dict[new_pos].piece
287 if piece_at_new_position is not None :
288 if type(piece_at_new_position) == King:
289 if piece_at_new_position.piece_color == "white":
290 continue
291 break
292 break
293 break
294
295 # right loop
296 new_x = x
297 new_y = y
298 while True:
299 new_x = new_x + 1
300 new_y = new_y
301 new_pos = f"{chr(new_x)}{new_y}"
302 if new_pos not in pos_tuple:
303 break
304 invalid_moves_for_king.append(new_pos)
305 piece_at_new_position = self.board.position_dict[new_pos].piece
306 if piece_at_new_position is not None:
307
if type(piece_at_new_position) == King:
308
if piece_at_new_position.piece_color == "white":
309
continue
310
311 break
312 break
313 # down loop
314 new_x = x
315 new_y = y
316 while True:
317 new_x = new_x
318 new_y = new_y + 1
319 new_pos = f"{chr(new_x)}{new_y}"
320 if new_pos not in pos_tuple:
321 break
322 invalid_moves_for_king.append(new_pos)
323 piece_at_new_position = self.board.position_dict[new_pos].piece
324 if piece_at_new_position is not None :
325 if type(piece_at_new_position) == King:
326
50
if piece_at_new_position.piece_color == "white":
classes/pieces/rook.py
327 continue
328 break
329 break
330
331
332 # left loop
333 new_x = x
334 new_y = y
335 while True:
336 new_x = new_x - 1
337 new_y = new_y
338 new_pos = f"{chr(new_x)}{new_y}"
339 if new_pos not in pos_tuple:
340 break
341 invalid_moves_for_king.append(new_pos)
342 piece_at_new_position = self.board.position_dict[new_pos].piece
343 if piece_at_new_position is not None :
344
if type(piece_at_new_position) == King:
345
if piece_at_new_position.piece_color == "white":
346
continue
347
348 break
349 break
350
return invalid_moves_for_king
def __str__(self):
return f"{self.piece_color[0]}r"
51
database/config.py
52
database/connect.py
53
database/create.py
54
database/get.py
55
database/setup.py
1 # Database Setup
2
3 from .config import DATABASE, HOST, USER, PASSWORD
4 from .connect import connect
5
6
7 def setup():
8 connection = connect()
9 cursor = connection.cursor()
10
11 # Check if users table exists
12 command = f"SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '{DATABASE}' AND TABLE_NAME = 'users' LIMIT 1"
13 cursor.execute(command)
14 results = cursor.fetchone()
15 if results[0] != 1:
16 # Table doesn't exist, create it
17 command = f"CREATE TABLE users (id INT NOT NULL AUTO_INCREMENT, username VARCHAR(20) NOT NULL UNIQUE, password TEXT NOT NULL, PRIMARY KEY (id))"
18 cursor.execute(command)
19 connection.commit()
20
21 # Check if games table exists
22 command = f"SELECT COUNT(*) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = '{DATABASE}' AND TABLE_NAME = 'games' LIMIT 1"
23 cursor.execute(command)
24 results = cursor.fetchone()
25 if results[0] != 1:
26 # Table doesn't exist, create one
27 command = f"CREATE TABLE games (id INT NOT NULL AUTO_INCREMENT, status VARCHAR(10), user1 VARCHAR(20), user2 VARCHAR(20) DEFAULT '', moves TEXT, result VARCHAR(20) DEF
28 cursor.execute(command)
29 connection.commit()
56
database/update.py
57
ui/auth.py
58
ui/classes.py
1 class User:
2 def __init__(self, username):
3 self.username = username
59
ui/game.py
from ..database.update import join_game, update_game
from ..database.create import create_game
from ..database.get import get
from ..classes.board import Board
1 from ..classes.vars import pos_tuple
2 import os
3 from time import sleep
4
5
6 def playing_loop(game_data, game_board, my_color, mode):
7
game_board.print_board(my_color)
8
while True:
9
print("\nYour Color:", my_color)
10
while True:
11
12 from_pos = input("\nMove from: ")
13 if from_pos in pos_tuple and game_board.position_dict[from_pos].piece is not None and game_board.position_dict[from_pos].piece.piece_color == my_color:
14 valid_moves = game_board.position_dict[from_pos].piece.get_moves()
15 else:
16 print("\nInvalid Piece!")
17 continue
18 if valid_moves == []:
19 print(f"\nThe piece at {from_pos} cannot move, choose a different piece.")
20 continue
21 change_piece = False
22 while True:
23 print(f"\nValid Moves for piece at {from_pos}:", *valid_moves)
24 to_pos = input("\nMove to (leave empty to move a different piece): ")
25 if to_pos == "":
26 change_piece = True
27 break
28
if to_pos in pos_tuple and to_pos in valid_moves:
29
break
30
print("\nInvalid Move!")
31
32 if not change_piece:
33 break
34
35 game_board.play_move(f"{from_pos}_{to_pos}")
36
37 res = get("games", f"id = {game_data[0]} and status = 'running'")
38 if len(res) != 1:
39 raise ValueError("Ivalid game")
40
41 old_game_data = res[0]
42
43 old_moves = old_game_data[4]
44
45 new_moves = old_moves + f" {from_pos}_{to_pos}"
46 status_tuple = game_board.is_game_over(my_color)
47 if status_tuple[0]:
48 new_status = 'ended'
49 if status_tuple[1] == "won":
50 if mode == "hosted":
51 new_result = "user1"
52 else:
53 new_result = "user2"
54 elif status_tuple[1] == "lost":
55 if mode == "hosted":
56 new_result = "user2"
57 else:
58 new_result = "user1"
59 else:
60 new_result = "stalemate"
61 else:
62 new_status = old_game_data[1]
63 new_result = old_game_data[5]
64
65 update_game(game_data[0], f"moves = '{new_moves}', status = '{new_status}', result = '{new_result}'")
66
67 new_game_data = list(old_game_data)
68 new_game_data[4] = new_moves
69 new_game_data[1] = new_status
70 new_game_data[5] = new_result
71 break
72
73 return tuple(new_game_data)
74
75 def waiting_loop(game_data, game_board, my_color, moves):
76 while True:
77 os.system('cls' if os.name == 'nt' else 'clear')
78 game_board.print_board(my_color)
79 if my_color == "white":
80 print(f"\nWaiting for {game_data[3]}'s move...")
81
82
else: 60
print(f"\nWaiting for {game_data[2]}'s move...")
83
res = get("games", f"id = {game_data[0]}")
84
res = get("games", f"id = {game_data[0]}") ui/game.py
84
if len(res) != 1:
85
86 raise ValueError("Ivalid game")
87
88 new_game_data = res[0]
89
90 if moves == new_game_data[4]:
91 continue
92
93 new_move_notation = new_game_data[4].replace(moves, '').strip()
94 game_board.play_move(new_move_notation)
95 break
96
97 return new_game_data
98
99 def start_game(myuser):
100 os.system('cls' if os.name == 'nt' else 'clear')
101 while True:
102 option = input(f"""Welcome {myuser.username}
103 Enter 1 to join a game
104 2 to host a game
105 3 to quit
106
107 > """)
108 if option in ['1', '2', '3']:
109 break
110
111 print("\nInvalid option\n")
112
113 os.system('cls' if os.name == 'nt' else 'clear')
114
115 if option == '3':
116
return
117
118
if option == '1':
119
print("Searching for games...")
120
121 res = get("games", f"status = 'open' and user1 <> '{myuser.username}'")
122 print("\tDone.")
123 if len(res) == 0:
124 print("No open public game found, try hosting one.")
125 print("Returning to menu...")
126 sleep(3)
127 return start_game(myuser)
128 else:
129 sleep(1)
130
131 game_data = res[0]
132 print(f"Joining game with {game_data[2]}...")
133 join_game(game_data[0], myuser)
134 print("\tDone.")
135 sleep(1)
136
137 os.system('cls' if os.name == 'nt' else 'clear')
138
139 game_board = Board()
140 my_color = "black"
141 moves = ''
142
143 while True:
144 game_data = waiting_loop(game_data, game_board, my_color, moves)
145 moves = game_data[4]
146
147 os.system('cls' if os.name == 'nt' else 'clear')
148
149 game_board.print_board(my_color)
150 if game_data[1] == 'ended':
151
print()
152
if game_data[5] == 'user2':
153
print("You won!")
154
155 elif game_data[5] == 'user1':
156 print("You lost!")
157 else:
158 print("The game was a draw!")
159
160 input("Press Enter to continue\n")
161 return start_game(myuser)
162
163 os.system('cls' if os.name == 'nt' else 'clear')
164
165 game_data = playing_loop(game_data, game_board, my_color, "joined")
166
167 os.system('cls' if os.name == 'nt' else 'clear')
168
169 game_board.print_board(my_color)
170 moves = game_data[4] 61
171 if game_data[1] == 'ended':
172 print()
172
ui/game.py
print()
173 if game_data[5] == 'user2':
174 print("You won!")
175 elif game_data[5] == 'user1':
176
print("You lost!")
177
else:
178
print("The game was a draw!")
179
180
181 input("Press Enter to continue\n")
182 return start_game(myuser)
183 elif option == '2':
184 print("Creating game...")
185 game_id = create_game(myuser)
186 print("\tDone.")
187 sleep(0.5)
188
189 game_board = Board()
190 my_color = "white"
191 moves = ''
192
193 while True:
194
195 os.system('cls' if os.name == 'nt' else 'clear')
196
197 game_board.print_board(my_color)
198 print("\nWaiting for someone to join the game...")
199 res = get("games", f"id = {game_id}")
200 game_data = res[0]
201 if game_data[1] == 'running':
202 break
203 sleep(0.1)
204
205 print("\tDone.")
206 print(f"{game_data[3]} joined the game")
207 print("Loading...")
208
sleep(1)
209
210
while True:
211
212
os.system('cls' if os.name == 'nt' else 'clear')
213
214
game_data = playing_loop(game_data, game_board, my_color, "joined")
215
216
os.system('cls' if os.name == 'nt' else 'clear')
217
218
219 game_board.print_board(my_color)
220 moves = game_data[4]
221 if game_data[1] == 'ended':
222 print()
223 if game_data[5] == 'user1':
224 print("You won!")
225 elif game_data[5] == 'user2':
226 print("You lost!")
227 else:
228 print("The game was a draw!")
229
230 input("Press Enter to continue\n")
231 return start_game(myuser)
232
233 os.system('cls' if os.name == 'nt' else 'clear')
234
235 game_data = waiting_loop(game_data, game_board, my_color, moves)
236 moves = game_data[4]
237
238 os.system('cls' if os.name == 'nt' else 'clear')
239
240 game_board.print_board(my_color)
241 if game_data[1] == 'ended':
242
print()
243
if game_data[5] == 'user1':
244
print("You won!")
245
246 elif game_data[5] == 'user2':
247 print("You lost!")
248 else:
print("The game was a draw!")
62
ui/__init__.py
63
______________________________________________________________________________________________________________________
OUTPUT SCREEN
______________________________________________________________________________________________________________________
64
65
66
______________________________________________________________________________________________________________________
BIBLIOGRAPHY
______________________________________________________________________________________________________________________
• https://python.org/
• https://mysql.com/
• https://stackoverflow.com/
• https://geeksforgeeks.org/
67