1
+ import pygame
2
+ from .constants import BLACK , ROWS , RED , SQUARE_SIZE , COLS , WHITE
3
+ from .piece import Piece
4
+
5
+ class Board :
6
+ def __init__ (self ):
7
+ self .board = []
8
+ self .red_left = self .white_left = 12
9
+ self .red_kings = self .white_kings = 0
10
+ self .create_board ()
11
+
12
+ def draw_squares (self , win ):
13
+ win .fill (BLACK )
14
+ for row in range (ROWS ):
15
+ for col in range (row % 2 , COLS , 2 ):
16
+ pygame .draw .rect (win , RED , (row * SQUARE_SIZE , col * SQUARE_SIZE , SQUARE_SIZE , SQUARE_SIZE ))
17
+
18
+ def move (self , piece , row , col ):
19
+ self .board [piece .row ][piece .col ], self .board [row ][col ] = self .board [row ][col ], self .board [piece .row ][piece .col ]
20
+ piece .move (row , col )
21
+
22
+ if row == ROWS - 1 or row == 0 :
23
+ piece .make_king ()
24
+ if piece .color == WHITE :
25
+ self .white_kings += 1
26
+ else :
27
+ self .red_kings += 1
28
+
29
+ def get_piece (self , row , col ):
30
+ return self .board [row ][col ]
31
+
32
+ def create_board (self ):
33
+ for row in range (ROWS ):
34
+ self .board .append ([])
35
+ for col in range (COLS ):
36
+ if col % 2 == ((row + 1 ) % 2 ):
37
+ if row < 3 :
38
+ self .board [row ].append (Piece (row , col , WHITE ))
39
+ elif row > 4 :
40
+ self .board [row ].append (Piece (row , col , RED ))
41
+ else :
42
+ self .board [row ].append (0 )
43
+ else :
44
+ self .board [row ].append (0 )
45
+
46
+ def draw (self , win ):
47
+ self .draw_squares (win )
48
+ for row in range (ROWS ):
49
+ for col in range (COLS ):
50
+ piece = self .board [row ][col ]
51
+ if piece != 0 :
52
+ piece .draw (win )
53
+
54
+ def remove (self , pieces ):
55
+ for piece in pieces :
56
+ self .board [piece .row ][piece .col ] = 0
57
+ if piece != 0 :
58
+ if piece .color == RED :
59
+ self .red_left -= 1
60
+ else :
61
+ self .white_left -= 1
62
+
63
+ def winner (self ):
64
+ if self .red_left <= 0 :
65
+ return WHITE
66
+ elif self .white_left <= 0 :
67
+ return RED
68
+
69
+ return None
70
+
71
+ def get_valid_moves (self , piece ):
72
+ moves = {}
73
+ left = piece .col - 1
74
+ right = piece .col + 1
75
+ row = piece .row
76
+
77
+ if piece .color == RED or piece .king :
78
+ moves .update (self ._traverse_left (row - 1 , max (row - 3 , - 1 ), - 1 , piece .color , left ))
79
+ moves .update (self ._traverse_right (row - 1 , max (row - 3 , - 1 ), - 1 , piece .color , right ))
80
+ if piece .color == WHITE or piece .king :
81
+ moves .update (self ._traverse_left (row + 1 , min (row + 3 , ROWS ), 1 , piece .color , left ))
82
+ moves .update (self ._traverse_right (row + 1 , min (row + 3 , ROWS ), 1 , piece .color , right ))
83
+
84
+ return moves
85
+
86
+ def _traverse_left (self , start , stop , step , color , left , skipped = []):
87
+ moves = {}
88
+ last = []
89
+ for r in range (start , stop , step ):
90
+ if left < 0 :
91
+ break
92
+
93
+ current = self .board [r ][left ]
94
+ if current == 0 :
95
+ if skipped and not last :
96
+ break
97
+ elif skipped :
98
+ moves [(r , left )] = last + skipped
99
+ else :
100
+ moves [(r , left )] = last
101
+
102
+ if last :
103
+ if step == - 1 :
104
+ row = max (r - 3 , 0 )
105
+ else :
106
+ row = min (r + 3 , ROWS )
107
+ moves .update (self ._traverse_left (r + step , row , step , color , left - 1 ,skipped = last ))
108
+ moves .update (self ._traverse_right (r + step , row , step , color , left + 1 ,skipped = last ))
109
+ break
110
+ elif current .color == color :
111
+ break
112
+ else :
113
+ last = [current ]
114
+
115
+ left -= 1
116
+
117
+ return moves
118
+
119
+ def _traverse_right (self , start , stop , step , color , right , skipped = []):
120
+ moves = {}
121
+ last = []
122
+ for r in range (start , stop , step ):
123
+ if right >= COLS :
124
+ break
125
+
126
+ current = self .board [r ][right ]
127
+ if current == 0 :
128
+ if skipped and not last :
129
+ break
130
+ elif skipped :
131
+ moves [(r ,right )] = last + skipped
132
+ else :
133
+ moves [(r , right )] = last
134
+
135
+ if last :
136
+ if step == - 1 :
137
+ row = max (r - 3 , 0 )
138
+ else :
139
+ row = min (r + 3 , ROWS )
140
+ moves .update (self ._traverse_left (r + step , row , step , color , right - 1 ,skipped = last ))
141
+ moves .update (self ._traverse_right (r + step , row , step , color , right + 1 ,skipped = last ))
142
+ break
143
+ elif current .color == color :
144
+ break
145
+ else :
146
+ last = [current ]
147
+
148
+ right += 1
149
+
150
+ return moves
0 commit comments