From 944b1bd682162e6f73def885db0fac06e07990d1 Mon Sep 17 00:00:00 2001 From: yuvraj-k-singh Date: Sat, 23 May 2026 22:00:16 +0530 Subject: [PATCH] Fix Game Over screen does not appear when no moves are left in 2048 game --- games/2048-Game/2048-Game.py | 76 ++++++++++++++++++++++-------------- 1 file changed, 46 insertions(+), 30 deletions(-) diff --git a/games/2048-Game/2048-Game.py b/games/2048-Game/2048-Game.py index dce78ac..bfb7307 100644 --- a/games/2048-Game/2048-Game.py +++ b/games/2048-Game/2048-Game.py @@ -1,6 +1,5 @@ import tkinter as tk import random -import os from pathlib import Path GRID_SIZE = 4 @@ -45,12 +44,13 @@ class Game2048: def __init__(self, root): self.root = root self.root.title("2048 Game") + self.root.resizable(False, False) self.score = 0 self.high_score = self.load_high_score() self.main_frame = tk.Frame(root, bg=BACKGROUND_COLOR) - self.main_frame.grid() + self.main_frame.grid(padx=10, pady=10) self.score_label = tk.Label( root, @@ -70,10 +70,10 @@ def __init__(self, root): self.cells = [] self.board = [[0] * GRID_SIZE for _ in range(GRID_SIZE)] + self.game_over_label = None + self.create_grid() - self.add_new_tile() - self.add_new_tile() - self.update_grid() + self.start_new_game() self.root.bind("", self.handle_keypress) @@ -89,7 +89,7 @@ def save_high_score(self): try: HIGH_SCORE_PATH.write_text(str(self.high_score)) except Exception as e: - print(f"⚠️ Warning: Could not save high score: {e}") + print(f"Warning: Could not save high score: {e}") def create_grid(self): for row in range(GRID_SIZE): @@ -110,27 +110,31 @@ def create_grid(self): pady=CELL_PADDING ) + frame.grid_propagate(False) + label = tk.Label( - self.main_frame, + frame, text="", bg=EMPTY_CELL_COLOR, justify=tk.CENTER, - font=("Arial", 24, "bold"), - width=4, - height=2 + font=("Arial", 24, "bold") ) - label.grid( - row=row, - column=col, - padx=CELL_PADDING, - pady=CELL_PADDING - ) + label.place(relx=0.5, rely=0.5, anchor="center") row_cells.append(label) self.cells.append(row_cells) + def start_new_game(self): + self.board = [[0] * GRID_SIZE for _ in range(GRID_SIZE)] + self.score = 0 + + self.add_new_tile() + self.add_new_tile() + + self.update_grid() + def add_new_tile(self): empty_cells = [] @@ -168,9 +172,7 @@ def update_grid(self): def compress(self, row): new_row = [num for num in row if num != 0] - new_row += [0] * (GRID_SIZE - len(new_row)) - return new_row def merge(self, row): @@ -184,7 +186,6 @@ def merge(self, row): def move_left(self): moved = False - new_board = [] for row in self.board: @@ -198,7 +199,6 @@ def move_left(self): new_board.append(final) self.board = new_board - return moved def reverse(self): @@ -228,6 +228,7 @@ def move_down(self): def check_game_over(self): for row in range(GRID_SIZE): for col in range(GRID_SIZE): + if self.board[row][col] == 0: return False @@ -243,7 +244,6 @@ def check_game_over(self): def handle_keypress(self, event): key = event.keysym - moved = False if key == "Left": @@ -258,6 +258,9 @@ def handle_keypress(self, event): elif key == "Down": moved = self.move_down() + else: + return + if moved: self.add_new_tile() @@ -267,27 +270,40 @@ def handle_keypress(self, event): self.update_grid() - if self.check_game_over(): - self.game_over() + # FIXED BUG: + # Game over is now checked even when no movement happens + if self.check_game_over(): + self.game_over() def game_over(self): + + # Prevent duplicate labels + if self.game_over_label is not None: + return + + # Disable controls after game over + self.root.unbind("") + self.game_over_label = tk.Label( self.root, text="GAME OVER", font=("Arial", 24, "bold"), fg="red" ) + self.game_over_label.grid(pady=10) def restart_game(self): - if hasattr(self, 'game_over_label'): + + # Remove old game over label + if self.game_over_label is not None: self.game_over_label.destroy() - - self.board = [[0] * GRID_SIZE for _ in range(GRID_SIZE)] - self.score = 0 - self.add_new_tile() - self.add_new_tile() - self.update_grid() + self.game_over_label = None + + self.start_new_game() + + # Re-enable keyboard controls + self.root.bind("", self.handle_keypress) if __name__ == "__main__":