Ninja adventures
unknown
plain_text
10 days ago
7.7 kB
5
Indexable
import pygame import random import sys import os # Initialize Pygame pygame.init() # Constants WIDTH = 800 HEIGHT = 600 FPS = 60 # Colors WHITE = (255, 255, 255) BLACK = (0, 0, 0) RED = (255, 0, 0) ORANGE = (255, 165, 0) YELLOW = (255, 255, 0) GREEN = (0, 255, 0) BLUE = (0, 0, 255) PURPLE = (128, 0, 128) # Set up the display screen = pygame.display.set_mode((WIDTH, HEIGHT)) pygame.display.set_caption("Ninja Adventures") clock = pygame.time.Clock() # Player class class Player(pygame.sprite.Sprite): def __init__(self): super().__init__() self.skins = { "black": BLACK, "red": RED, "orange": ORANGE, "yellow": YELLOW, "green": GREEN, "blue": BLUE, "purple": PURPLE } self.current_skin = "black" self.image = pygame.Surface((30, 50)) self.image.fill(self.skins[self.current_skin]) self.rect = self.image.get_rect() self.rect.center = (WIDTH // 2, HEIGHT - 50) self.speed_x = 0 self.jump_power = -15 self.velocity_y = 0 self.is_jumping = False self.gravity = 0.8 def update(self): # Apply gravity self.velocity_y += self.gravity self.rect.y += self.velocity_y # Keep player on screen if self.rect.bottom > HEIGHT: self.rect.bottom = HEIGHT self.velocity_y = 0 self.is_jumping = False self.rect.x += self.speed_x if self.rect.left < 0: self.rect.left = 0 if self.rect.right > WIDTH: self.rect.right = WIDTH # Enemy class class Enemy(pygame.sprite.Sprite): def __init__(self): super().__init__() self.image = pygame.Surface((20, 20)) self.image.fill(RED) self.rect = self.image.get_rect() self.rect.x = random.randrange(WIDTH - self.rect.width) self.rect.y = 0 self.speed_y = random.randrange(3, 8) def update(self): self.rect.y += self.speed_y if self.rect.top > HEIGHT: self.kill() # Button class class Button: def __init__(self, text, x, y, width, height, color, action=None): self.rect = pygame.Rect(x, y, width, height) self.color = color self.text = text self.action = action self.font = pygame.font.Font(None, 36) def draw(self, surface): pygame.draw.rect(surface, self.color, self.rect) text_surface = self.font.render(self.text, True, BLACK) text_rect = text_surface.get_rect(center=self.rect.center) surface.blit(text_surface, text_rect) def check_click(self, pos): if self.rect.collidepoint(pos) and self.action: return self.action() return None # Game states MENU = 0 PLAYING = 1 PAUSED = 2 SKINS = 3 QUIT_SCREEN = 4 # Game class class Game: def __init__(self): self.state = MENU self.player = None self.all_sprites = None self.enemies = None self.score = 0 self.enemy_timer = 0 self.selected_skin = "black" self.font = pygame.font.Font(None, 36) # Buttons self.play_button = Button("Play", WIDTH//2-50, HEIGHT//2-50, 100, 40, GREEN, self.start_game) self.skins_button = Button("Skins", WIDTH//2-50, HEIGHT//2, 100, 40, YELLOW, self.show_skins) self.quit_button = Button("Quit", WIDTH//2-50, HEIGHT//2+50, 100, 40, RED, self.show_quit_screen) self.pause_button = Button("Pause", WIDTH-70, 10, 60, 30, YELLOW, self.pause_game) # Skin buttons self.skin_buttons = [] skin_colors = ["black", "red", "orange", "yellow", "green", "blue", "purple"] for i, color in enumerate(skin_colors): btn = Button(color, WIDTH//2-50, 100+i*50, 100, 40, getattr(pygame, color.upper(), BLACK), lambda c=color: self.select_skin(c)) self.skin_buttons.append(btn) def start_game(self): self.state = PLAYING self.player = Player() self.player.current_skin = self.selected_skin self.player.image.fill(self.player.skins[self.selected_skin]) self.all_sprites = pygame.sprite.Group() self.enemies = pygame.sprite.Group() self.all_sprites.add(self.player) self.score = 0 self.enemy_timer = 0 def show_skins(self): self.state = SKINS def show_quit_screen(self): self.state = QUIT_SCREEN def pause_game(self): self.state = PAUSED if self.state == PLAYING else PLAYING def select_skin(self, color): self.selected_skin = color self.state = MENU def run(self): while True: for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() if event.type == pygame.MOUSEBUTTONDOWN: if self.state == MENU: result = self.play_button.check_click(event.pos) if not result: result = self.skins_button.check_click(event.pos) if not result: result = self.quit_button.check_click(event.pos) elif self.state == PLAYING: if self.pause_button.check_click(event.pos): continue # Jump on tap if not self.player.is_jumping: self.player.velocity_y = self.player.jump_power self.player.is_jumping = True elif self.state == SKINS: for btn in self.skin_buttons: btn.check_click(event.pos) # Update if self.state == PLAYING: # Virtual joystick (simulated by mouse position) mouse_x, _ = pygame.mouse.get_pos() self.player.speed_x = (mouse_x - self.player.rect.centerx) / 20 self.all_sprites.update() # Spawn enemies self.enemy_timer += 1 if self.enemy_timer >= 120: # 2 seconds at 60 FPS enemy = Enemy() self.all_sprites.add(enemy) self.enemies.add(enemy) self.enemy_timer = 0 # Check collisions hits = pygame.sprite.spritecollide(self.player, self.enemies, False) if hits: self.state = MENU self.score += 1 # Draw screen.fill(BLACK) # Background (could be replaced with barn/cornfield image) if self.state == MENU: self.play_button.draw(screen) self.skins_button.draw(screen) self.quit_button.draw(screen) elif self.state == PLAYING or self.state == PAUSED: self.all_sprites.draw(screen) self.pause_button.draw(screen) score_text = self.font.render(f"Score: {self.score}", True, WHITE) screen.blit(score_text, (10, 10)) elif self.state == SKINS: for btn in self.skin_buttons: btn.draw(screen) elif self.state == QUIT_SCREEN: text = self.font.render("Thank you for playing!", True, WHITE) text_rect = text.get_rect(center=(WIDTH//2, HEIGHT//2)) screen.blit(text, text_rect) pygame.display.flip() clock.tick(FPS) # Run the game if __name__ == "__main__": game = Game() game.run()
Editor is loading...
Leave a Comment