From 48081bb043fe81ff8e1f2ee8feff6b9df6909c96 Mon Sep 17 00:00:00 2001 From: kojtech Date: Thu, 22 Oct 2026 21:15:31 +0200 Subject: [PATCH] started on main menu system, 3 gamemodes. --- main.py | 167 +++++++++++++++++++++++++++++++------------------------- 1 file changed, 92 insertions(+), 75 deletions(-) diff --git a/main.py b/main.py index 9f5b79b..6324704 100644 --- a/main.py +++ b/main.py @@ -8,6 +8,22 @@ screen = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption("Sugarmania") clock = pygame.time.Clock() font = pygame.font.SysFont(None, 36) +big_font = pygame.font.SysFont(None, 64) +small_font = pygame.font.SysFont(None, 26) + +MENU_OPTIONS = ["Play", "Quit"] + +MODE_NAMES = ["easy", "medium", "hard"] + +MODES = { + "easy": {"lives": 5, "speed": 7, "spawn_every": 10, "enemy_pool": ["Bouncer"], "desc": "Only Bouncers. One new enemy per 10 sugar"}, + "medium": {"lives": 3, "speed": 6, "spawn_every": 7, "enemy_pool": ["Bouncer", "Chaser"], "desc": "Bouncers and Chasers. One new enemy per 7 sugar"}, + "hard": {"lives": 2, "speed": 5, "spawn_every": 5, "enemy_pool": ["Bouncer", "Chaser", "Dasher"], "desc": "Bouncers, Chasers and Dashers. One new enemy per 5 sugar"} +} + + + + class ChaserEnemy: def __init__(self, avoid_rect): @@ -17,8 +33,8 @@ class ChaserEnemy: self.rect.y = random.randint(0, HEIGHT - 36) if abs(self.rect.x - avoid_rect.x) > 150 or abs(self.rect.y - avoid_rect.y) > 150: break - self.speed = 2 - self.spawn_timer = 60 + self.speed = 2 + self.spawn_timer = 60 def update(self, target): if self.rect.centerx < target.centerx: @@ -50,7 +66,7 @@ class DasherEnemy: if self.state == "wait": dx = target.centerx - self.rect.centerx dy = target.centery - self.rect.centery - dist = max(1, (dx ** 2 + dy ** 2) ** 0,5) + dist = max(1, (dx ** 2 + dy ** 2) ** 0.5) self.vx = dx / dist * 9 self.vy = dy / dist * 9 self.state = "dash" @@ -77,7 +93,7 @@ class BouncerEnemy: self.vy = random.choice([-3, -2, 2, 3]) self.spawn_timer = 60 - def update(self): + def update(self, target=None): self.rect.x += self.vx self.rect.y += self.vy if self.rect.left < 0 or self.rect.right > WIDTH: @@ -86,23 +102,13 @@ class BouncerEnemy: self.vy = -self.vy -def enemy_for_level(level): #idk if I'll add the levels - if level == 2: - return ChaserEnemy - if level == 3: - return DasherEnemy - if level == 4: - return DasherEnemy - return random.choice([BouncerEnemy, DasherEnemy, ChaserEnemy]) - - +ENEMY_CLASSES = {"Bouncer": BouncerEnemy, "Chaser": ChaserEnemy, "Dasher": DasherEnemy} player_img = pygame.image.load("player.png").convert_alpha() player_img = pygame.transform.scale(player_img, (40, 60)) -player = pygame.Rect(300, 220, 40, 60) -speed = 5 + Bouncer_img = pygame.image.load("Bouncer.png").convert_alpha() Bouncer_img = pygame.transform.scale(Bouncer_img, (30, 45)) @@ -116,8 +122,6 @@ Dasher_img = pygame.transform.scale(Dasher_img, (30, 45)) sugar_img = pygame.image.load("honey.png").convert_alpha() sugar_img = pygame.transform.scale(sugar_img, (50, 50)) -score = 0 -Enemies = [] heart_img = pygame.image.load("Heart.png").convert_alpha() @@ -127,77 +131,90 @@ heart_img = pygame.transform.scale(heart_img,(40, 40)) def new_sugar(): return pygame.Rect(random.randint(0, WIDTH - 20), random.randint(0, HEIGHT - 20), 50, 50) #20,s -sugar = new_sugar() -lives = 3 -hit_timer = 0 + #game loop -running = True -while running: - for event in pygame.event.get(): +def game_screen(mode): + cfg = MODES[mode] + player = pygame.Rect(300, 220, 40, 60) + speed = cfg["speed"] + score = 0 + Enemies = [] + sugar = new_sugar() + lives = cfg["lives"] + hit_timer = 0 + + while True: + for event in pygame.event.get(): if event.type == pygame.QUIT: - running = False + return "quit", score - #movement - keys = pygame.key.get_pressed() - if keys[pygame.K_LEFT] or keys[pygame.K_a]: - player.x -= speed - if keys[pygame.K_RIGHT] or keys[pygame.K_d]: - player.x += speed - if keys[pygame.K_UP] or keys[pygame.K_w]: - player.y -= speed - if keys[pygame.K_DOWN] or keys[pygame.K_s]: - player.y += speed - for enemy in Enemies: - if enemy.spawn_timer > 0: - enemy.spawn_timer -= 1 - else: - enemy.update() - if hit_timer > 0: - hit_timer -= 1 - else: + #movement + keys = pygame.key.get_pressed() + if keys[pygame.K_LEFT] or keys[pygame.K_a]: + player.x -= speed + if keys[pygame.K_RIGHT] or keys[pygame.K_d]: + player.x += speed + if keys[pygame.K_UP] or keys[pygame.K_w]: + player.y -= speed + if keys[pygame.K_DOWN] or keys[pygame.K_s]: + player.y += speed + for enemy in Enemies: - if enemy.spawn_timer <= 0 and player.colliderect(enemy.rect): - lives -= 1 - hit_timer = 90 - break - if lives <= 0: - running = False + if enemy.spawn_timer > 0: + enemy.spawn_timer -= 1 + else: + enemy.update(player) + if hit_timer > 0: + hit_timer -= 1 + else: + for enemy in Enemies: + if enemy.spawn_timer <= 0 and player.colliderect(enemy.rect): + lives -= 1 + hit_timer = 90 + break + if lives <= 0: + return "gameover", score - #keep player in - player.clamp_ip(screen.get_rect()) + #keep player in + player.clamp_ip(screen.get_rect()) - # score - if player.colliderect(sugar): - score += 1 - sugar = new_sugar() - if score % 10 == 0: - Enemies.append(BouncerEnemy(player)) + # score + if player.colliderect(sugar): + score += 1 + sugar = new_sugar() + if score % cfg["spawn_every"] == 0 and cfg["enemy_pool"]: + enemy_name = random.choice(cfg["enemy_pool"]) + Enemies.append(ENEMY_CLASSES[enemy_name](player)) - screen.fill((255, 228, 240)) # screen - screen.blit(sugar_img, sugar) #sugar - screen.blit(player_img, player) #player - if hit_timer % 10 < 5: + screen.fill((255, 228, 240)) # screen + screen.blit(sugar_img, sugar) #sugar + screen.blit(player_img, player) #player + if hit_timer % 10 < 5: + screen.blit(player_img, player) + text = font.render(f"score: {score}", True, (90, 30, 60)) + screen.blit(text, (10, 10)) + for enemy in Enemies: + if enemy.spawn_timer % 10 < 5: + screen.blit(Bouncer_img, enemy.rect) screen.blit(player_img, player) - text = font.render(f"score: {score}", True, (90, 30, 60)) - screen.blit(text, (10, 10)) - for enemy in Enemies: - if enemy.spawn_timer % 10 < 5: - screen.blit(Bouncer_img, enemy.rect) - screen.blit(player_img, player) - if hit_timer > 0 and hit_timer % 10 < 5: - red = player_img.copy() - red.fill((255, 40, 40, 0), special_flags=pygame.BLEND_RGBA_ADD) - screen.blit(red, player) - for i in range(lives): - screen.blit(heart_img, (10 + i * 35, 40)) - pygame.display.flip() - clock.tick(60) + if hit_timer > 0 and hit_timer % 10 < 5: + red = player_img.copy() + red.fill((255, 40, 40, 0), special_flags=pygame.BLEND_RGBA_ADD) + screen.blit(red, player) + for i in range(lives): + screen.blit(heart_img, (10 + i * 35, 40)) + pygame.display.flip() + clock.tick(60) pygame.quit() +def menu_screen(): + selected = 0 + while True: + for