Ninja adventures
unknown
plain_text
8 months ago
7.7 kB
6
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