## 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