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


from tkinter import *
import random
import math

# =========================
# НАСТРОЙКИ
# =========================

WIDTH = 1200
HEIGHT = 700

root = Tk()
root.title("CYBER DODGE")
root.resizable(False, False)

canvas = Canvas(root, width=WIDTH, height=HEIGHT, bg="#050510")
canvas.pack()

# =========================
# ИГРОК
# =========================

player_x = WIDTH // 2
player_y = HEIGHT // 2

player_size = 25
player_speed = 7

score = 0
best_score = 0

game_started = False
game_over = False

# =========================
# ЭФФЕКТЫ
# =========================

particles = []
enemies = []
stars = []

# =========================
# ФОН
# =========================

for _ in range(200):
    x = random.randint(0, WIDTH)
    y = random.randint(0, HEIGHT)
    s = random.randint(1, 3)

    stars.append(
        canvas.create_oval(
            x,
            y,
            x+s,
            y+s,
            fill="white",
            outline=""
        )
    )

# =========================
# НЕОН СЕТКА
# =========================

for i in range(0, WIDTH, 50):
    canvas.create_line(i, 0, i, HEIGHT, fill="#101030")

for i in range(0, HEIGHT, 50):
    canvas.create_line(0, i, WIDTH, i, fill="#101030")

# =========================
# ИГРОК
# =========================

player_glow = canvas.create_oval(
    player_x-player_size-10,
    player_y-player_size-10,
    player_x+player_size+10,
    player_y+player_size+10,
    fill="",
    outline="#00ffff",
    width=3
)

player = canvas.create_oval(
    player_x-player_size,
    player_y-player_size,
    player_x+player_size,
    player_y+player_size,
    fill="#00ccff",
    outline=""
)

# =========================
# ТЕКСТ
# =========================

title = canvas.create_text(
    WIDTH//2,
    120,
    text="CYBER DODGE",
    fill="#00ffff",
    font=("Arial", 50, "bold")
)

info = canvas.create_text(
    WIDTH//2,
    220,
    text="WASD - движение\nУклоняйся от врагов\nНажми SPACE чтобы начать",
    fill="white",
    font=("Arial", 24)
)

score_text = canvas.create_text(
    120,
    40,
    text="Score: 0",
    fill="white",
    font=("Arial", 25, "bold")
)

best_text = canvas.create_text(
    140,
    80,
    text="Best: 0",
    fill="#00ff99",
    font=("Arial", 22)
)

# =========================
# УПРАВЛЕНИЕ
# =========================

keys = set()

def key_press(event):
    global game_started

    keys.add(event.keysym.lower())

    if event.keysym == "space":
        start_game()

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 start_game():
    global game_started, game_over, score, enemies

    if game_started:
        return

    game_started = True
    game_over = False
    score = 0

    for enemy in enemies:
        canvas.delete(enemy["id"])

    enemies.clear()

    canvas.itemconfig(title, state="hidden")
    canvas.itemconfig(info, state="hidden")

# =========================
# СПАВН ВРАГОВ
# =========================

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)

    size = random.randint(20, 45)
    speed = random.uniform(2, 6)

    glow = canvas.create_oval(
        x-size-10,
        y-size-10,
        x+size+10,
        y+size+10,
        outline="#ff0055",
        width=3
    )

    body = canvas.create_oval(
        x-size,
        y-size,
        x+size,
        y+size,
        fill="#ff0033",
        outline=""
    )

    enemies.append({
        "x": x,
        "y": y,
        "size": size,
        "speed": speed,
        "id": body,
        "glow": glow
    })

# =========================
# ЧАСТИЦЫ
# =========================

def create_particles(x, y):

    for _ in range(20):

        size = random.randint(2, 6)

        particle = canvas.create_oval(
            x-size,
            y-size,
            x+size,
            y+size,
            fill=random.choice([
                "#00ffff",
                "#00ff99",
                "#ff0055",
                "#ffff00"
            ]),
            outline=""
        )

        particles.append({
            "x": x,
            "y": y,
            "dx": random.uniform(-8, 8),
            "dy": random.uniform(-8, 8),
            "life": random.randint(20, 40),
            "id": particle
        })

# =========================
# GAME OVER
# =========================

def end_game():
    global game_started, game_over, best_score

    game_started = False
    game_over = True

    if score > best_score:
        best_score = score

    canvas.itemconfig(
        title,
        text="GAME OVER",
        state="normal",
        fill="#ff0033"
    )

    canvas.itemconfig(
        info,
        text=f"Счет: {score}\nЛучший: {best_score}\nSPACE - рестарт",
        state="normal"
    )

# =========================
# ОБНОВЛЕНИЕ
# =========================

spawn_timer = 0

def update():

    global player_x
    global player_y
    global spawn_timer
    global score

    # -----------------
    # ДВИЖЕНИЕ
    # -----------------

    if game_started:

        if "w" in keys:
            player_y -= player_speed

        if "s" in keys:
            player_y += player_speed

        if "a" in keys:
            player_x -= player_speed

        if "d" in keys:
            player_x += player_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
    )

    canvas.coords(
        player_glow,
        player_x-player_size-10,
        player_y-player_size-10,
        player_x+player_size+10,
        player_y+player_size+10
    )

    # -----------------
    # ВРАГИ
    # -----------------

    if game_started:

        spawn_timer += 1

        if spawn_timer >= 20:
            spawn_enemy()
            spawn_timer = 0

        score += 1

        canvas.itemconfig(
            score_text,
            text=f"Score: {score}"
        )

        canvas.itemconfig(
            best_text,
            text=f"Best: {best_score}"
        )

        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"]
            )

            canvas.coords(
                enemy["glow"],
                enemy["x"]-enemy["size"]-10,
                enemy["y"]-enemy["size"]-10,
                enemy["x"]+enemy["size"]+10,
                enemy["y"]+enemy["size"]+10
            )

            # СТОЛКНОВЕНИЕ

            if dist < enemy["size"] + player_size:
                create_particles(player_x, player_y)
                end_game()

    # -----------------
    # ЧАСТИЦЫ
    # -----------------

    for p in particles[:]:

        p["x"] += p["dx"]
        p["y"] += p["dy"]

        p["life"] -= 1

        canvas.move(
            p["id"],
            p["dx"],
            p["dy"]
        )

        if p["life"] <= 0:
            canvas.delete(p["id"])
            particles.remove(p)

    root.after(16, update)

update()
root.mainloop()