Untitled
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