Ninja adventures

 avatar
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