|
9 | 9 | from inputmodule.gui.ledmatrix import show_string
|
10 | 10 | from inputmodule.inputmodule import ledmatrix
|
11 | 11 |
|
12 |
| -# Initialize pygame |
13 |
| -pygame.init() |
14 |
| - |
15 | 12 | # Set the screen width and height for a 34 x 9 block Ledris game
|
16 | 13 | block_width = 20
|
17 | 14 | block_height = 20
|
|
25 | 22 | black = (0, 0, 0)
|
26 | 23 | white = (255, 255, 255)
|
27 | 24 |
|
28 |
| -# Create the screen |
29 |
| -screen = pygame.display.set_mode((width, height)) |
30 |
| - |
31 |
| -# Clock to control the speed of the game |
32 |
| -clock = pygame.time.Clock() |
33 |
| - |
34 | 25 | # Ledrimino shapes
|
35 | 26 | shapes = [
|
36 | 27 | [[1, 1, 1, 1]], # I shape
|
@@ -63,25 +54,6 @@ def draw_ledmatrix(board, devices):
|
63 | 54 | #vals = [0 for _ in range(39)]
|
64 | 55 | #send_command(dev, CommandVals.Draw, vals)
|
65 | 56 |
|
66 |
| -# Function to draw the game based on the board state |
67 |
| -def draw_board(board, devices): |
68 |
| - draw_ledmatrix(board, devices) |
69 |
| - screen.fill(white) |
70 |
| - for y in range(rows): |
71 |
| - for x in range(cols): |
72 |
| - if board[y][x]: |
73 |
| - rect = pygame.Rect(x * block_width, y * block_height, block_width, block_height) |
74 |
| - pygame.draw.rect(screen, black, rect) |
75 |
| - draw_grid() |
76 |
| - pygame.display.update() |
77 |
| - |
78 |
| -# Function to draw a grid |
79 |
| -def draw_grid(): |
80 |
| - for y in range(rows): |
81 |
| - for x in range(cols): |
82 |
| - rect = pygame.Rect(x * block_width, y * block_height, block_width, block_height) |
83 |
| - pygame.draw.rect(screen, black, rect, 1) |
84 |
| - |
85 | 57 | # Function to check if the position is valid
|
86 | 58 | def check_collision(board, shape, offset):
|
87 | 59 | off_x, off_y = offset
|
@@ -139,106 +111,144 @@ def display_score(board, score):
|
139 | 111 | [[1, 1, 1], [1, 0, 1], [1, 1, 1], [0, 0, 1], [1, 1, 1]], # 9
|
140 | 112 | ]
|
141 | 113 |
|
142 |
| -# Main game function |
143 |
| -def gameLoop(devices): |
144 |
| - board = [[0 for _ in range(cols)] for _ in range(rows)] |
145 |
| - current_shape = random.choice(shapes) |
146 |
| - current_pos = [cols // 2 - len(current_shape[0]) // 2, 5] # Start below the score display |
147 |
| - game_over = False |
148 |
| - fall_time = 0 |
149 |
| - fall_speed = 500 # Falling speed in milliseconds |
150 |
| - score = 0 |
151 |
| - |
152 |
| - while not game_over: |
153 |
| - # Adjust falling speed based on score |
154 |
| - fall_speed = max(100, 500 - (score * 10)) |
155 |
| - |
156 |
| - # Draw the current board state |
| 114 | + |
| 115 | +class Ledris: |
| 116 | + # Function to draw a grid |
| 117 | + def draw_grid(self): |
| 118 | + for y in range(rows): |
| 119 | + for x in range(cols): |
| 120 | + rect = pygame.Rect(x * block_width, y * block_height, block_width, block_height) |
| 121 | + pygame.draw.rect(self.screen, black, rect, 1) |
| 122 | + |
| 123 | + # Function to draw the game based on the board state |
| 124 | + def draw_board(self, board, devices): |
| 125 | + draw_ledmatrix(board, devices) |
| 126 | + self.screen.fill(white) |
| 127 | + for y in range(rows): |
| 128 | + for x in range(cols): |
| 129 | + if board[y][x]: |
| 130 | + rect = pygame.Rect(x * block_width, y * block_height, block_width, block_height) |
| 131 | + pygame.draw.rect(self.screen, black, rect) |
| 132 | + self.draw_grid() |
| 133 | + pygame.display.update() |
| 134 | + |
| 135 | + # Main game function |
| 136 | + def gameLoop(self, devices): |
| 137 | + board = [[0 for _ in range(cols)] for _ in range(rows)] |
| 138 | + current_shape = random.choice(shapes) |
| 139 | + current_pos = [cols // 2 - len(current_shape[0]) // 2, 5] # Start below the score display |
| 140 | + game_over = False |
| 141 | + fall_time = 0 |
| 142 | + fall_speed = 500 # Falling speed in milliseconds |
| 143 | + score = 0 |
| 144 | + |
| 145 | + while not game_over: |
| 146 | + # Adjust falling speed based on score |
| 147 | + fall_speed = max(100, 500 - (score * 10)) |
| 148 | + |
| 149 | + # Draw the current board state |
| 150 | + board_state = get_board_state(board, current_shape, current_pos) |
| 151 | + display_score(board_state, score) |
| 152 | + self.draw_board(board_state, devices) |
| 153 | + |
| 154 | + # Event handling |
| 155 | + for event in pygame.event.get(): |
| 156 | + if event.type == pygame.QUIT: |
| 157 | + game_over = True |
| 158 | + |
| 159 | + if event.type == pygame.KEYDOWN: |
| 160 | + if event.key in [pygame.K_LEFT, pygame.K_h]: |
| 161 | + new_pos = [current_pos[0] - 1, current_pos[1]] |
| 162 | + if not check_collision(board, current_shape, new_pos): |
| 163 | + current_pos = new_pos |
| 164 | + elif event.key in [pygame.K_RIGHT, pygame.K_l]: |
| 165 | + new_pos = [current_pos[0] + 1, current_pos[1]] |
| 166 | + if not check_collision(board, current_shape, new_pos): |
| 167 | + current_pos = new_pos |
| 168 | + elif event.key in [pygame.K_DOWN, pygame.K_j]: |
| 169 | + new_pos = [current_pos[0], current_pos[1] + 1] |
| 170 | + if not check_collision(board, current_shape, new_pos): |
| 171 | + current_pos = new_pos |
| 172 | + elif event.key in [pygame.K_UP, pygame.K_k]: |
| 173 | + rotated_shape = list(zip(*current_shape[::-1])) |
| 174 | + if not check_collision(board, rotated_shape, current_pos): |
| 175 | + current_shape = rotated_shape |
| 176 | + elif event.key == pygame.K_SPACE: # Hard drop |
| 177 | + while not check_collision(board, current_shape, [current_pos[0], current_pos[1] + 1]): |
| 178 | + current_pos[1] += 1 |
| 179 | + |
| 180 | + # Automatic falling |
| 181 | + fall_time += self.clock.get_time() |
| 182 | + if fall_time >= fall_speed: |
| 183 | + fall_time = 0 |
| 184 | + new_pos = [current_pos[0], current_pos[1] + 1] |
| 185 | + if not check_collision(board, current_shape, new_pos): |
| 186 | + current_pos = new_pos |
| 187 | + else: |
| 188 | + merge_shape(board, current_shape, current_pos) |
| 189 | + board, cleared_rows = clear_rows(board) |
| 190 | + score += cleared_rows # Increase score by one for each row cleared |
| 191 | + current_shape = random.choice(shapes) |
| 192 | + current_pos = [cols // 2 - len(current_shape[0]) // 2, 5] # Start below the score display |
| 193 | + if check_collision(board, current_shape, current_pos): |
| 194 | + game_over = True |
| 195 | + |
| 196 | + self.clock.tick(30) |
| 197 | + |
| 198 | + # Flash the screen twice before waiting for restart |
| 199 | + for _ in range(2): |
| 200 | + for dev in devices: |
| 201 | + ledmatrix.percentage(dev, 0) |
| 202 | + self.screen.fill(black) |
| 203 | + pygame.display.update() |
| 204 | + time.sleep(0.3) |
| 205 | + |
| 206 | + for dev in devices: |
| 207 | + ledmatrix.percentage(dev, 100) |
| 208 | + self.screen.fill(white) |
| 209 | + pygame.display.update() |
| 210 | + time.sleep(0.3) |
| 211 | + |
| 212 | + # Display final score and wait for restart without clearing the screen |
157 | 213 | board_state = get_board_state(board, current_shape, current_pos)
|
158 | 214 | display_score(board_state, score)
|
159 |
| - draw_board(board_state, devices) |
160 |
| - |
161 |
| - # Event handling |
162 |
| - for event in pygame.event.get(): |
163 |
| - if event.type == pygame.QUIT: |
164 |
| - game_over = True |
165 |
| - |
166 |
| - if event.type == pygame.KEYDOWN: |
167 |
| - if event.key in [pygame.K_LEFT, pygame.K_h]: |
168 |
| - new_pos = [current_pos[0] - 1, current_pos[1]] |
169 |
| - if not check_collision(board, current_shape, new_pos): |
170 |
| - current_pos = new_pos |
171 |
| - elif event.key in [pygame.K_RIGHT, pygame.K_l]: |
172 |
| - new_pos = [current_pos[0] + 1, current_pos[1]] |
173 |
| - if not check_collision(board, current_shape, new_pos): |
174 |
| - current_pos = new_pos |
175 |
| - elif event.key in [pygame.K_DOWN, pygame.K_j]: |
176 |
| - new_pos = [current_pos[0], current_pos[1] + 1] |
177 |
| - if not check_collision(board, current_shape, new_pos): |
178 |
| - current_pos = new_pos |
179 |
| - elif event.key in [pygame.K_UP, pygame.K_k]: |
180 |
| - rotated_shape = list(zip(*current_shape[::-1])) |
181 |
| - if not check_collision(board, rotated_shape, current_pos): |
182 |
| - current_shape = rotated_shape |
183 |
| - elif event.key == pygame.K_SPACE: # Hard drop |
184 |
| - while not check_collision(board, current_shape, [current_pos[0], current_pos[1] + 1]): |
185 |
| - current_pos[1] += 1 |
186 |
| - |
187 |
| - # Automatic falling |
188 |
| - fall_time += clock.get_time() |
189 |
| - if fall_time >= fall_speed: |
190 |
| - fall_time = 0 |
191 |
| - new_pos = [current_pos[0], current_pos[1] + 1] |
192 |
| - if not check_collision(board, current_shape, new_pos): |
193 |
| - current_pos = new_pos |
194 |
| - else: |
195 |
| - merge_shape(board, current_shape, current_pos) |
196 |
| - board, cleared_rows = clear_rows(board) |
197 |
| - score += cleared_rows # Increase score by one for each row cleared |
198 |
| - current_shape = random.choice(shapes) |
199 |
| - current_pos = [cols // 2 - len(current_shape[0]) // 2, 5] # Start below the score display |
200 |
| - if check_collision(board, current_shape, current_pos): |
| 215 | + self.draw_board(board_state, devices) |
| 216 | + |
| 217 | + waiting = True |
| 218 | + while waiting: |
| 219 | + for event in pygame.event.get(): |
| 220 | + if event.type == pygame.QUIT: |
| 221 | + waiting = False |
201 | 222 | game_over = True
|
| 223 | + if event.type == pygame.KEYDOWN: |
| 224 | + if event.key == pygame.K_q: |
| 225 | + waiting = False |
| 226 | + if event.key == pygame.K_r: |
| 227 | + board = [[0 for _ in range(cols)] for _ in range(rows)] |
| 228 | + gameLoop() |
202 | 229 |
|
203 |
| - clock.tick(30) |
| 230 | + pygame.quit() |
| 231 | + quit() |
204 | 232 |
|
205 |
| - # Flash the screen twice before waiting for restart |
206 |
| - for _ in range(2): |
207 |
| - for dev in devices: |
208 |
| - ledmatrix.percentage(dev, 0) |
209 |
| - screen.fill(black) |
210 |
| - pygame.display.update() |
211 |
| - time.sleep(0.3) |
| 233 | + def __init__(self): |
| 234 | + # Initialize pygame |
| 235 | + pygame.init() |
212 | 236 |
|
213 |
| - for dev in devices: |
214 |
| - ledmatrix.percentage(dev, 100) |
215 |
| - screen.fill(white) |
216 |
| - pygame.display.update() |
217 |
| - time.sleep(0.3) |
218 |
| - |
219 |
| - # Display final score and wait for restart without clearing the screen |
220 |
| - board_state = get_board_state(board, current_shape, current_pos) |
221 |
| - display_score(board_state, score) |
222 |
| - draw_board(board_state, devices) |
223 |
| - |
224 |
| - waiting = True |
225 |
| - while waiting: |
226 |
| - for event in pygame.event.get(): |
227 |
| - if event.type == pygame.QUIT: |
228 |
| - waiting = False |
229 |
| - game_over = True |
230 |
| - if event.type == pygame.KEYDOWN: |
231 |
| - if event.key == pygame.K_q: |
232 |
| - waiting = False |
233 |
| - if event.key == pygame.K_r: |
234 |
| - board = [[0 for _ in range(cols)] for _ in range(rows)] |
235 |
| - gameLoop() |
| 237 | + # Create the screen |
| 238 | + self.screen = pygame.display.set_mode((width, height)) |
236 | 239 |
|
237 |
| - pygame.quit() |
238 |
| - quit() |
| 240 | + # Clock to control the speed of the game |
| 241 | + self.clock = pygame.time.Clock() |
239 | 242 |
|
240 |
| -if __name__ == "__main__": |
| 243 | +def main_devices(devices): |
| 244 | + ledris = Ledris() |
| 245 | + ledris.gameLoop(devices) |
| 246 | + |
| 247 | +def main(): |
241 | 248 | devices = cli.find_devs()
|
242 |
| - for dev in devices: |
243 |
| - show_string(dev, 'YAY') |
244 |
| - gameLoop(devices) |
| 249 | + |
| 250 | + ledris = Ledris() |
| 251 | + ledris.gameLoop(devices) |
| 252 | + |
| 253 | +if __name__ == "__main__": |
| 254 | + main() |
0 commit comments