Загрузка данных
import pygame
import random
import math
# --- НАСТРОЙКИ ---
WIDTH, HEIGHT = 1000, 600
FPS = 60
pygame.init()
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("SPACE SURVIVOR")
clock = pygame.time.Clock()
# --- ЦВЕТА ---
WHITE = (255, 255, 255)
BLACK = (10, 10, 20)
RED = (255, 70, 70)
BLUE = (70, 170, 255)
GREEN = (70, 255, 120)
YELLOW = (255, 255, 100)
font = pygame.font.SysFont("Arial", 30)
big_font = pygame.font.SysFont("Arial", 70)
# --- ИГРОК ---
player_x = WIDTH // 2
player_y = HEIGHT // 2
player_speed = 6
player_radius = 20
# --- ПУЛИ ---
bullets = []
# --- ВРАГИ ---
enemies = []
# --- ЭФФЕКТЫ ---
particles = []
score = 0
game_over = False
def spawn_enemy():
side = random.choice(["top", "bottom", "left", "right"])
if side == "top":
x = random.randint(0, WIDTH)
y = -50
elif side == "bottom":
x = random.randint(0, WIDTH)
y = HEIGHT + 50
elif side == "left":
x = -50
y = random.randint(0, HEIGHT)
else:
x = WIDTH + 50
y = random.randint(0, HEIGHT)
speed = random.uniform(1.5, 3.5)
enemies.append({
"x": x,
"y": y,
"speed": speed,
"size": random.randint(20, 35)
})
def create_explosion(x, y):
for _ in range(20):
particles.append({
"x": x,
"y": y,
"dx": random.uniform(-5, 5),
"dy": random.uniform(-5, 5),
"life": random.randint(20, 40),
"size": random.randint(2, 5)
})
# --- ЗВЕЗДЫ ---
stars = []
for _ in range(120):
stars.append([
random.randint(0, WIDTH),
random.randint(0, HEIGHT),
random.randint(1, 3)
])
enemy_timer = 0
running = True
while running:
clock.tick(FPS)
# --- СОБЫТИЯ ---
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()
angle = math.atan2(my - player_y, mx - player_x)
bullets.append({
"x": player_x,
"y": player_y,
"dx": math.cos(angle) * 12,
"dy": math.sin(angle) * 12
})
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_r and game_over:
bullets.clear()
enemies.clear()
particles.clear()
score = 0
game_over = False
player_x = WIDTH // 2
player_y = HEIGHT // 2
# --- ДВИЖЕНИЕ ---
keys = pygame.key.get_pressed()
if not game_over:
if keys[pygame.K_w]:
player_y -= player_speed
if keys[pygame.K_s]:
player_y += player_speed
if keys[pygame.K_a]:
player_x -= player_speed
if keys[pygame.K_d]:
player_x += player_speed
player_x = max(0, min(WIDTH, player_x))
player_y = max(0, min(HEIGHT, player_y))
# --- СПАВН ВРАГОВ ---
if not game_over:
enemy_timer += 1
if enemy_timer >= 35:
spawn_enemy()
enemy_timer = 0
# --- ОБНОВЛЕНИЕ ПУЛЬ ---
for bullet in bullets[:]:
bullet["x"] += bullet["dx"]
bullet["y"] += bullet["dy"]
if (
bullet["x"] < 0 or bullet["x"] > WIDTH or
bullet["y"] < 0 or bullet["y"] > HEIGHT
):
bullets.remove(bullet)
# --- ОБНОВЛЕНИЕ ВРАГОВ ---
for enemy in enemies[:]:
dx = player_x - enemy["x"]
dy = player_y - enemy["y"]
dist = math.hypot(dx, dy)
if dist != 0:
enemy["x"] += dx / dist * enemy["speed"]
enemy["y"] += dy / dist * enemy["speed"]
# Столкновение с игроком
if dist < enemy["size"] + player_radius:
game_over = True
# Попадание пули
for bullet in bullets[:]:
bdx = bullet["x"] - enemy["x"]
bdy = bullet["y"] - enemy["y"]
if math.hypot(bdx, bdy) < enemy["size"]:
create_explosion(enemy["x"], enemy["y"])
if enemy in enemies:
enemies.remove(enemy)
if bullet in bullets:
bullets.remove(bullet)
score += 1
break
# --- ЧАСТИЦЫ ---
for p in particles[:]:
p["x"] += p["dx"]
p["y"] += p["dy"]
p["life"] -= 1
if p["life"] <= 0:
particles.remove(p)
# --- РЕНДЕР ---
screen.fill(BLACK)
# Звезды
for star in stars:
pygame.draw.circle(screen, WHITE, (star[0], star[1]), star[2])
# Игрок
pygame.draw.circle(screen, BLUE, (int(player_x), int(player_y)), player_radius)
# Пули
for bullet in bullets:
pygame.draw.circle(
screen,
YELLOW,
(int(bullet["x"]), int(bullet["y"])),
5
)
# Враги
for enemy in enemies:
pygame.draw.circle(
screen,
RED,
(int(enemy["x"]), int(enemy["y"])),
enemy["size"]
)
# Частицы
for p in particles:
pygame.draw.circle(
screen,
GREEN,
(int(p["x"]), int(p["y"])),
p["size"]
)
# Счет
score_text = font.render(f"Score: {score}", True, WHITE)
screen.blit(score_text, (20, 20))
# GAME OVER
if game_over:
over = big_font.render("GAME OVER", True, RED)
retry = font.render("Нажми R для рестарта", True, WHITE)
screen.blit(over, (WIDTH // 2 - 190, HEIGHT // 2 - 80))
screen.blit(retry, (WIDTH // 2 - 150, HEIGHT // 2 + 10))
pygame.display.flip()
pygame.quit()