Untitled

 avatar
unknown
plain_text
9 months ago
10 kB
11
Indexable
import pygame
import random
import math

# Initialize pygame
pygame.init()

# Screen dimensions
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Elemental Arena - FreeFire Clone")

# Colors
BLACK = (0, 0, 0)
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
BLUE = (0, 120, 255)
YELLOW = (255, 255, 0)
PURPLE = (180, 0, 255)
ORANGE = (255, 165, 0)
BROWN = (139, 69, 19)
GRAY = (100, 100, 100)

# Game variables
clock = pygame.time.Clock()
FPS = 60
running = True
score = 0
game_over = False
spawn_timer = 0
element_change_timer = 0
current_element = "fire"  # fire, water, earth, air

# Player class
class Player:
    def __init__(self):
        self.x = WIDTH // 2
        self.y = HEIGHT // 2
        self.radius = 20
        self.speed = 5
        self.health = 100
        self.color = RED
        self.bullets = []
        self.element = "fire"
        self.element_timer = 0
        
    def draw(self):
        # Draw player
        pygame.draw.circle(screen, self.color, (int(self.x), int(self.y)), self.radius)
        
        # Draw element indicator
        element_colors = {"fire": RED, "water": BLUE, "earth": BROWN, "air": WHITE}
        pygame.draw.circle(screen, element_colors[self.element], (int(self.x), int(self.y)), 8)
        
        # Draw health bar
        pygame.draw.rect(screen, RED, (10, 10, 200, 20))
        pygame.draw.rect(screen, GREEN, (10, 10, 200 * (self.health/100), 20))
        
    def move(self, keys):
        if keys[pygame.K_a] and self.x - self.radius > 0:
            self.x -= self.speed
        if keys[pygame.K_d] and self.x + self.radius < WIDTH:
            self.x += self.speed
        if keys[pygame.K_w] and self.y - self.radius > 0:
            self.y -= self.speed
        if keys[pygame.K_s] and self.y + self.radius < HEIGHT:
            self.y += self.speed
            
    def shoot(self, mx, my):
        angle = math.atan2(my - self.y, mx - self.x)
        speed = 10
        
        # Different bullet properties based on element
        if self.element == "fire":
            self.bullets.append({"x": self.x, "y": self.y, "dx": math.cos(angle) * speed, 
                                "dy": math.sin(angle) * speed, "color": RED, "radius": 6, "damage": 25})
        elif self.element == "water":
            self.bullets.append({"x": self.x, "y": self.y, "dx": math.cos(angle) * speed * 0.7, 
                                "dy": math.sin(angle) * speed * 0.7, "color": BLUE, "radius": 8, "damage": 15})
        elif self.element == "earth":
            self.bullets.append({"x": self.x, "y": self.y, "dx": math.cos(angle) * speed * 0.5, 
                                "dy": math.sin(angle) * speed * 0.5, "color": BROWN, "radius": 12, "damage": 35})
        elif self.element == "air":
            self.bullets.append({"x": self.x, "y": self.y, "dx": math.cos(angle) * speed * 1.2, 
                                "dy": math.sin(angle) * speed * 1.2, "color": WHITE, "radius": 5, "damage": 20})
    
    def update_bullets(self):
        for bullet in self.bullets[:]:
            bullet["x"] += bullet["dx"]
            bullet["y"] += bullet["dy"]
            
            # Remove bullets that go off screen
            if (bullet["x"] < 0 or bullet["x"] > WIDTH or 
                bullet["y"] < 0 or bullet["y"] > HEIGHT):
                self.bullets.remove(bullet)
                
    def draw_bullets(self):
        for bullet in self.bullets:
            pygame.draw.circle(screen, bullet["color"], (int(bullet["x"]), int(bullet["y"])), bullet["radius"])

# Enemy class
class Enemy:
    def __init__(self):
        side = random.randint(0, 3)
        if side == 0:  # Top
            self.x = random.randint(0, WIDTH)
            self.y = -30
        elif side == 1:  # Right
            self.x = WIDTH + 30
            self.y = random.randint(0, HEIGHT)
        elif side == 2:  # Bottom
            self.x = random.randint(0, WIDTH)
            self.y = HEIGHT + 30
        else:  # Left
            self.x = -30
            self.y = random.randint(0, HEIGHT)
            
        self.radius = 15
        self.speed = random.uniform(1.0, 3.0)
        self.health = 30
        self.color = (random.randint(150, 255), random.randint(50, 150), random.randint(50, 150))
        
    def draw(self):
        pygame.draw.circle(screen, self.color, (int(self.x), int(self.y)), self.radius)
        
    def move(self, player_x, player_y):
        angle = math.atan2(player_y - self.y, player_x - self.x)
        self.x += math.cos(angle) * self.speed
        self.y += math.sin(angle) * self.speed
        
    def check_collision(self, bullet):
        distance = math.sqrt((bullet["x"] - self.x)**2 + (bullet["y"] - self.y)**2)
        return distance < self.radius + bullet["radius"]

# Power-up class
class PowerUp:
    def __init__(self):
        self.x = random.randint(30, WIDTH - 30)
        self.y = random.randint(30, HEIGHT - 30)
        self.radius = 12
        self.type = random.choice(["health", "speed", "element"])
        self.color = GREEN if self.type == "health" else YELLOW if self.type == "speed" else PURPLE
        self.active = True
        
    def draw(self):
        if self.active:
            pygame.draw.circle(screen, self.color, (int(self.x), int(self.y)), self.radius)
            
    def check_collision(self, player):
        distance = math.sqrt((player.x - self.x)**2 + (player.y - self.y)**2)
        return distance < player.radius + self.radius

# Create game objects
player = Player()
enemies = []
powerups = []

# Main game loop
while running:
    clock.tick(FPS)
    
    # Event handling
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            running = False
        if event.type == pygame.MOUSEBUTTONDOWN and not game_over:
            mx, my = pygame.mouse.get_pos()
            player.shoot(mx, my)
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_r and game_over:
                # Reset game
                player = Player()
                enemies = []
                powerups = []
                score = 0
                game_over = False
            if event.key == pygame.K_1:
                player.element = "fire"
            if event.key == pygame.K_2:
                player.element = "water"
            if event.key == pygame.K_3:
                player.element = "earth"
            if event.key == pygame.K_4:
                player.element = "air"
    
    if not game_over:
        # Player movement
        keys = pygame.key.get_pressed()
        player.move(keys)
        
        # Update bullets
        player.update_bullets()
        
        # Spawn enemies
        spawn_timer += 1
        if spawn_timer >= 60:  # Spawn every second
            spawn_timer = 0
            if len(enemies) < 10 + score // 10:  # Increase max enemies as score increases
                enemies.append(Enemy())
        
        # Move enemies and check collisions with player
        for enemy in enemies[:]:
            enemy.move(player.x, player.y)
            
            # Check collision with player
            distance = math.sqrt((player.x - enemy.x)**2 + (player.y - enemy.y)**2)
            if distance < player.radius + enemy.radius:
                player.health -= 5
                enemies.remove(enemy)
                if player.health <= 0:
                    game_over = True
            
            # Check collision with bullets
            for bullet in player.bullets[:]:
                if enemy.check_collision(bullet):
                    enemy.health -= bullet["damage"]
                    if bullet in player.bullets:
                        player.bullets.remove(bullet)
                    if enemy.health <= 0:
                        if enemy in enemies:
                            enemies.remove(enemy)
                        score += 10
                        # Chance to spawn power-up
                        if random.random() < 0.2:
                            powerups.append(PowerUp())
                    break
        
        # Check power-up collisions
        for powerup in powerups[:]:
            if powerup.check_collision(player):
                if powerup.type == "health":
                    player.health = min(100, player.health + 30)
                elif powerup.type == "speed":
                    player.speed += 1
                elif powerup.type == "element":
                    # Cycle to next element
                    elements = ["fire", "water", "earth", "air"]
                    current_index = elements.index(player.element)
                    player.element = elements[(current_index + 1) % len(elements)]
                
                powerups.remove(powerup)
        
        # Randomly change player's element every 10 seconds
        element_change_timer += 1
        if element_change_timer >= 600:
            element_change_timer = 0
            elements = ["fire", "water", "earth", "air"]
            elements.remove(player.element)
            player.element = random.choice(elements)
    
    # Drawing
    screen.fill(BLACK)
    
    # Draw grid background
    for x in range(0, WIDTH, 50):
        pygame.draw.line(screen, GRAY, (x, 0), (x, HEIGHT), 1)
    for y in range(0, HEIGHT, 50):
        pygame.draw.line(screen, GRAY, (0, y), (WIDTH, y), 1)
    
    # Draw game objects
    for powerup in powerups:
        powerup.draw()
    
    player.draw_bullets()
    player.draw()
    
    for enemy in enemies:
        enemy.draw()
    
    # Draw UI
    font = pygame.font.SysFont(None, 36)
    score_text = font.render(f"Score: {score}", True, WHITE)
    screen.blit(score_text, (WIDTH - 150, 10))
    
    element_text = font.render(f"Element: {player.element.capitalize()}", True, WHITE)
    screen.blit(element_text, (10, 40))
    
    controls_text = font.render("Controls: WASD to move, Mouse to aim/shoot, 1-4 to change element", True, WHITE)
    screen.blit(controls_text, (10, HEIGHT - 40))
    
    if game_over:
        game_over_text = font.render("GAME OVER - Press R to restart", True, RED)
        screen.blit(game_over_text, (WIDTH//2 - 180, HEIGHT//2))
    
    pygame.display.flip()

pygame.quit()
Editor is loading...
Leave a Comment