Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
76 changes: 46 additions & 30 deletions games/2048-Game/2048-Game.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
import tkinter as tk
import random
import os
from pathlib import Path

GRID_SIZE = 4
Expand Down Expand Up @@ -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,
Expand All @@ -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("<Key>", self.handle_keypress)

Expand All @@ -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):
Expand All @@ -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 = []

Expand Down Expand Up @@ -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):
Expand All @@ -184,7 +186,6 @@ def merge(self, row):

def move_left(self):
moved = False

new_board = []

for row in self.board:
Expand All @@ -198,7 +199,6 @@ def move_left(self):
new_board.append(final)

self.board = new_board

return moved

def reverse(self):
Expand Down Expand Up @@ -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

Expand All @@ -243,7 +244,6 @@ def check_game_over(self):

def handle_keypress(self, event):
key = event.keysym

moved = False

if key == "Left":
Expand All @@ -258,6 +258,9 @@ def handle_keypress(self, event):
elif key == "Down":
moved = self.move_down()

else:
return

if moved:
self.add_new_tile()

Expand All @@ -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("<Key>")

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("<Key>", self.handle_keypress)


if __name__ == "__main__":
Expand Down
Loading