Загрузка данных
from tkinter import *
import random
import math
# --- ОКНО ---
WIDTH = 1000
HEIGHT = 600
root = Tk()
root.title("SPACE SURVIVOR")
root.resizable(False, False)
canvas = Canvas(root, width=WIDTH, height=HEIGHT, bg="black")
canvas.pack()
# --- ИГРОК ---
player_x = WIDTH // 2
player_y = HEIGHT // 2
player_size = 20
speed = 8
# --- СПИСКИ ---
bullets = []
enemies = []
stars = []
score = 0
game_over = False
# --- ТЕКСТ ---
score_text = canvas.create_text(
100,
30,
text="Score: 0",
fill="white",
font=("Arial", 25)
)
# --- ЗВЕЗДЫ ---
for _ in range(120):
x = random.randint(0, WIDTH)
y = random.randint(0, HEIGHT)
size = random.randint(1, 3)
stars.append(
canvas.create_oval(
x,
y,
x + size,
y + size,
fill="white",
outline=""
)
)
# --- ИГРОК ---
player = canvas.create_oval(
player_x - player_size,
player_y - player_size,
player_x + player_size,
player_y + player_size,
fill="cyan",
outline=""
)
# --- УПРАВЛЕНИЕ ---
keys = set()
def key_press(event):
keys.add(event.keysym.lower())
def key_release(event):
if event.keysym.lower() in keys:
keys.remove(event.keysym.lower())
root.bind("<KeyPress>", key_press)
root.bind("<KeyRelease>", key_release)
# --- СТРЕЛЬБА ---
def shoot(event):
if game_over:
return
mx = event.x
my = event.y
angle = math.atan2(my - player_y, mx - player_x)
bullets.append({
"x": player_x,
"y": player_y,
"dx": math.cos(angle) * 15,
"dy": math.sin(angle) * 15,
"id": canvas.create_oval(
player_x - 5,
player_y - 5,
player_x + 5,
player_y + 5,
fill="yellow",
outline=""
)
})
canvas.bind("<Button-1>", shoot)
# --- СПАВН ВРАГОВ ---
def spawn_enemy():
side = random.choice(["top", "bottom", "left", "right"])
if side == "top":
x = random.randint(0, WIDTH)
y = -40
elif side == "bottom":
x = random.randint(0, WIDTH)
y = HEIGHT + 40
elif side == "left":
x = -40
y = random.randint(0, HEIGHT)
else:
x = WIDTH + 40
y = random.randint(0, HEIGHT)
size = random.randint(20, 35)
enemy = {
"x": x,
"y": y,
"size": size,
"speed": random.uniform(2, 4),
"id": canvas.create_oval(
x - size,
y - size,
x + size,
y + size,
fill="red",
outline=""
)
}
enemies.append(enemy)
# --- GAME OVER ---
def show_game_over():
canvas.create_text(
WIDTH // 2,
HEIGHT // 2 - 30,
text="GAME OVER",
fill="red",
font=("Arial", 50, "bold")
)
canvas.create_text(
WIDTH // 2,
HEIGHT // 2 + 30,
text=f"Твой счет: {score}",
fill="white",
font=("Arial", 25)
)
# --- ОБНОВЛЕНИЕ ---
timer = 0
def update():
global player_x, player_y, timer, score, game_over
if not game_over:
# ДВИЖЕНИЕ
if "w" in keys:
player_y -= speed
if "s" in keys:
player_y += speed
if "a" in keys:
player_x -= speed
if "d" in keys:
player_x += speed
player_x = max(player_size, min(WIDTH - player_size, player_x))
player_y = max(player_size, min(HEIGHT - player_size, player_y))
canvas.coords(
player,
player_x - player_size,
player_y - player_size,
player_x + player_size,
player_y + player_size
)
# СПАВН ВРАГОВ
timer += 1
if timer >= 25:
spawn_enemy()
timer = 0
# ПУЛИ
for bullet in bullets[:]:
bullet["x"] += bullet["dx"]
bullet["y"] += bullet["dy"]
canvas.coords(
bullet["id"],
bullet["x"] - 5,
bullet["y"] - 5,
bullet["x"] + 5,
bullet["y"] + 5
)
if (
bullet["x"] < 0 or bullet["x"] > WIDTH or
bullet["y"] < 0 or bullet["y"] > HEIGHT
):
canvas.delete(bullet["id"])
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"]
canvas.coords(
enemy["id"],
enemy["x"] - enemy["size"],
enemy["y"] - enemy["size"],
enemy["x"] + enemy["size"],
enemy["y"] + enemy["size"]
)
# СТОЛКНОВЕНИЕ С ИГРОКОМ
if dist < enemy["size"] + player_size:
game_over = True
show_game_over()
# ПОПАДАНИЕ ПУЛИ
for bullet in bullets[:]:
bdx = bullet["x"] - enemy["x"]
bdy = bullet["y"] - enemy["y"]
if math.hypot(bdx, bdy) < enemy["size"]:
canvas.delete(enemy["id"])
canvas.delete(bullet["id"])
enemies.remove(enemy)
bullets.remove(bullet)
score += 1
canvas.itemconfig(
score_text,
text=f"Score: {score}"
)
break
root.after(16, update)
update()
root.mainloop()