import random import pygame pygame.init() WIDTH, HEIGHT = 640, 480 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): self.rect = pygame.Rect(0, 0, 36, 36) while True: self.rect.x = random.randint(0, WIDTH - 36) 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 def update(self, target): if self.rect.centerx < target.centerx: self.rect.x += self.speed elif self.rect.centerx > target.centerx: self.rect.x -= self.speed if self.rect.y < target.centery: self.rect.y += self.speed elif self.rect.centery > target.centery: self.rect.y -= self.speed class DasherEnemy: def __init__(self, avoid_rect): self.rect = pygame.Rect(0, 0, 36, 36) while True: self.rect.x = random.randint(0, WIDTH - 36) 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.x = float(self.rect.x) self.y = float(self.rect.y) self.vx = 0 self.vy = 0 self.state = "wait" self.timer = 90 self.spawn_timer = 60 def update(self, target): self.timer -= 1 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) self.vx = dx / dist * 9 self.vy = dy / dist * 9 self.state = "dash" self.timer = 30 else: self.x += self.vx self.y += self.vy self.rect.x = int(self.x) self.rect.y = int(self.y) self.rect.clamp_ip(screen.get_rect()) self.x, self.y = float(self.rect.x), float(self.rect.y) if self.timer <= 0: self.state = "wait" self.timer = 90 class BouncerEnemy: def __init__(self, avoid_rect): self.rect = pygame.Rect(0, 0, 36, 36) while True: self.rect.x = random.randint(0, WIDTH - 36) 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.vx = random.choice([-3, -2, 2, 3]) self.vy = random.choice([-3, -2, 2, 3]) self.spawn_timer = 60 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: self.vx = -self.vx if self.rect.top < 0 or self.rect.bottom > HEIGHT: self.vy = -self.vy 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)) Bouncer_img = pygame.image.load("Bouncer.png").convert_alpha() Bouncer_img = pygame.transform.scale(Bouncer_img, (30, 45)) Chaser_img = pygame.image.load("Chaser.png").convert_alpha() Chaser_img = pygame.transform.scale(Chaser_img, (30, 45)) Dasher_img = pygame.image.load("Dasher.png").convert_alpha() 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)) heart_img = pygame.image.load("Heart.png").convert_alpha() 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 #game loop 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: 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(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()) # 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.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) pygame.quit() def menu_screen(): selected = 0 while True: for