From 9fbeee827b4b7668bc50f77db8be08309b0f49c7 Mon Sep 17 00:00:00 2001 From: kojtech Date: Sun, 25 Oct 2026 22:33:12 +0100 Subject: [PATCH] Deathscreen done. --- highscores.json | 1 + main.py | 104 ++++++++++++++++++++++++++++++++++++++++++++---- 2 files changed, 98 insertions(+), 7 deletions(-) create mode 100644 highscores.json diff --git a/highscores.json b/highscores.json new file mode 100644 index 0000000..7b5ab4e --- /dev/null +++ b/highscores.json @@ -0,0 +1 @@ +{"hard": 32} \ No newline at end of file diff --git a/main.py b/main.py index 6b9c0d3..2abd4e4 100644 --- a/main.py +++ b/main.py @@ -1,5 +1,7 @@ import random import pygame +import json +from pathlib import Path pygame.init() @@ -165,6 +167,24 @@ def new_sugar(): random.randint(0, HEIGHT - 20), 50, 50) #20,s +SAVE_PATH = Path(__file__).with_name("highscores.json") + +def load_best(mode): + try: + scores = json.loads(SAVE_PATH.read_text()) + except (FileNotFoundError, json.JSONDecodeError): + return 0 + return scores.get(mode, 0) + +def save_best(mode, score): + try: + scores = json.loads(SAVE_PATH.read_text()) + except (FileNotFoundError, json.JSONDecodeError): + scores = {} + scores[mode] = score + SAVE_PATH.write_text(json.dumps(scores)) + + @@ -178,14 +198,15 @@ def game_screen(mode): sugar = new_sugar() lives = cfg["lives"] hit_timer = 0 + start_ticks = pygame.time.get_ticks() while True: for event in pygame.event.get(): if event.type == pygame.QUIT: - return "quit", score + return "quit", {} if event.type == pygame.KEYDOWN and event.key == pygame.K_ESCAPE: - return "menu", score + return "menu", {} @@ -214,7 +235,11 @@ def game_screen(mode): hit_timer = 90 break if lives <= 0: - return "gameover", score + return "gameover", { + "score": score, + "snapshot": screen.copy(), + "seconds": (pygame.time.get_ticks() - start_ticks) // 1000, + } #keep player in player.clamp_ip(screen.get_rect()) @@ -388,11 +413,77 @@ def mode_screen(): pygame.display.flip() clock.tick(60) +def game_over_screen(mode, result): + snapshot = result["snapshot"] + score = result["score"] + seconds = result.get("seconds", 0) + + best = load_best(mode) + new_best = score > best + if new_best: + save_best(mode, score) + best = score + + overlay = pygame.Surface((WIDTH, HEIGHT), pygame.SRCALPHA) + fade = 0 + + while True: + for event in pygame.event.get(): + if event.type == pygame.QUIT: + return "quit", {} + + if event.type == pygame.KEYDOWN: + if event.key in (pygame.K_RETURN, pygame.K_r): + return "game", {} + elif event.key == pygame.K_m: + return "mode", {} + elif event.key == pygame.K_ESCAPE: + return "menu", {} + elif event.key == pygame.K_q: + return "quit", {} + + if fade < 180: + fade = min(180, fade + 12) + + screen.blit(snapshot, (0, 0)) + overlay.fill((0, 0, 0, fade)) + screen.blit(overlay, (0, 0)) + + title = big_font.render("GAME OVER", True, (255, 240, 8)) + screen.blit(title, title.get_rect(center=(WIDTH // 2, 130))) + + score_text = font.render(f"Score: {score}", True, (255, 255, 255)) + screen.blit(score_text, score_text.get_rect(center=(WIDTH // 2, 205))) + + if new_best: + best_text = small_font.render("NEW BEST", True, (255, 240, 8)) + else: + best_text = small_font.render(f"best {best}", True, (255, 255, 255)) + screen.blit(best_text, best_text.get_rect(center=(WIDTH // 2, 245))) + + stats = small_font.render( + f"{mode} ยท {seconds}s survived", True, (255, 255, 255) + ) + screen.blit(stats, stats.get_rect(center=(WIDTH // 2, 285))) + + prompts = [ + "ENTER-RETRY", + "M-change mode", + "esc-main menu", + "Q-quit", + ] + for i, text in enumerate(prompts): + prompt = font.render(text, True, (255, 255, 255)) + screen.blit(prompt, prompt.get_rect(center=(WIDTH // 2, 345 + i * 36))) + + pygame.display.flip() + clock.tick(60) + if __name__ == "__main__": state = "menu" mode = None - score = 0 + payload = {} while state != "quit": if state == "menu": @@ -400,9 +491,8 @@ if __name__ == "__main__": elif state == "mode": state, mode = mode_screen() elif state == "game": - state, score = game_screen(mode) + state, payload = game_screen(mode) elif state == "gameover": - print(f"Game Over - score: {score}") - state = "menu" + state, payload = game_over_screen(mode, payload) pygame.quit()