Загрузка данных


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()