Spaces:
Running
Running
| ## game.py | |
| import random | |
| from typing import List, Tuple | |
| class Game: | |
| def __init__(self): | |
| self.grid: List[List[int]] = [[0 for _ in range(4)] for _ in range(4)] | |
| self.score: int = 0 | |
| self.game_over: bool = False | |
| def reset_game(self): | |
| self.grid = [[0 for _ in range(4)] for _ in range(4)] | |
| self.score = 0 | |
| self.game_over = False | |
| self.add_new_tile() | |
| self.add_new_tile() | |
| def move(self, direction: str): | |
| if direction == "up": | |
| self._move_up() | |
| elif direction == "down": | |
| self._move_down() | |
| elif direction == "left": | |
| self._move_left() | |
| elif direction == "right": | |
| self._move_right() | |
| def is_game_over(self) -> bool: | |
| for i in range(4): | |
| for j in range(4): | |
| if self.grid[i][j] == 0: | |
| return False | |
| if j < 3 and self.grid[i][j] == self.grid[i][j + 1]: | |
| return False | |
| if i < 3 and self.grid[i][j] == self.grid[i + 1][j]: | |
| return False | |
| return True | |
| def get_empty_cells(self) -> List[Tuple[int, int]]: | |
| empty_cells = [] | |
| for i in range(4): | |
| for j in range(4): | |
| if self.grid[i][j] == 0: | |
| empty_cells.append((i, j)) | |
| return empty_cells | |
| def add_new_tile(self): | |
| empty_cells = self.get_empty_cells() | |
| if empty_cells: | |
| x, y = random.choice(empty_cells) | |
| self.grid[x][y] = 2 if random.random() < 0.9 else 4 | |
| def get_score(self) -> int: | |
| return self.score | |
| def _move_up(self): | |
| for j in range(4): | |
| for i in range(1, 4): | |
| if self.grid[i][j] != 0: | |
| for k in range(i, 0, -1): | |
| if self.grid[k - 1][j] == 0: | |
| self.grid[k - 1][j] = self.grid[k][j] | |
| self.grid[k][j] = 0 | |
| def _move_down(self): | |
| for j in range(4): | |
| for i in range(2, -1, -1): | |
| if self.grid[i][j] != 0: | |
| for k in range(i, 3): | |
| if self.grid[k + 1][j] == 0: | |
| self.grid[k + 1][j] = self.grid[k][j] | |
| self.grid[k][j] = 0 | |
| def _move_left(self): | |
| for i in range(4): | |
| for j in range(1, 4): | |
| if self.grid[i][j] != 0: | |
| for k in range(j, 0, -1): | |
| if self.grid[i][k - 1] == 0: | |
| self.grid[i][k - 1] = self.grid[i][k] | |
| self.grid[i][k] = 0 | |
| def _move_right(self): | |
| for i in range(4): | |
| for j in range(2, -1, -1): | |
| if self.grid[i][j] != 0: | |
| for k in range(j, 3): | |
| if self.grid[i][k + 1] == 0: | |
| self.grid[i][k + 1] = self.grid[i][k] | |
| self.grid[i][k] = 0 | |