Загрузка данных
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()