bunkier + strelanie celów

This commit is contained in:
tymek 2026-06-03 19:15:39 +02:00
parent df82b85a75
commit 6da624638d

150
statek.py
View file

@ -2,6 +2,7 @@ import math
from tkinter import * from tkinter import *
from tkinter import ttk from tkinter import ttk
from random import randrange from random import randrange
import random
def obroc_prostokat_o_2_stopnie_zg(canvas, element_id): def obroc_prostokat_o_2_stopnie_zg(canvas, element_id):
@ -96,9 +97,9 @@ def strzal_z_karabinu():
start_x = cx + dlugosc_lufy * math.cos(kat_myszy) start_x = cx + dlugosc_lufy * math.cos(kat_myszy)
start_y = cy + dlugosc_lufy * math.sin(kat_myszy) start_y = cy + dlugosc_lufy * math.sin(kat_myszy)
predkosc_karabinu = 12 predkosc_karabinu = 11
dx = predkosc_karabinu * math.cos(kat_myszy) dx = predkosc_karabinu * math.cos(kat_myszy) + random.uniform(-0.8, 0.8)
dy = predkosc_karabinu * math.sin(kat_myszy) dy = predkosc_karabinu * math.sin(kat_myszy) + random.uniform(-0.8, 0.8)
r_karabinu = 1 r_karabinu = 1
id_karabinu = canvas.create_oval(start_x - r_karabinu, start_y - r_karabinu, start_x + r_karabinu, start_y + r_karabinu, fill="black", outline="") id_karabinu = canvas.create_oval(start_x - r_karabinu, start_y - r_karabinu, start_x + r_karabinu, start_y + r_karabinu, fill="black", outline="")
@ -137,41 +138,122 @@ def cele_ruch():
x1, y1, x2, y2, x3, y3, x4, y4 = canvas.coords(dul) x1, y1, x2, y2, x3, y3, x4, y4 = canvas.coords(dul)
celx = int((x1 + x2 + x3 + x4) / 4) celx = int((x1 + x2 + x3 + x4) / 4)
cely = int((y1 + y2 + y3 + y4) / 4) cely = int((y1 + y2 + y3 + y4) / 4)
krok_x = 0
krok_y = 0
for idx, c in enumerate(cele): for idx, c in enumerate(cele):
krok_x=0
krok_y=0
dx = celx - c["dul"]["x1"] dx = celx - c["dul"]["x1"]
dy = cely - c["dul"]["y1"] dy = cely - c["dul"]["y1"]
odleglosc_kwadrat = dx ** 2 + dy ** 2 odleglosc_kwadrat = dx ** 2 + dy ** 2
if odleglosc_kwadrat > 40000: if c.get("omijanie", 0) > 0:
c["omijanie"] -= 1
krok_x = c["boczny_x"]
krok_y = c["boczny_y"]
canvas.move(c["wieza"]["id"], krok_x, krok_y)
canvas.move(c["lufa"]["id"], krok_x, krok_y)
canvas.move(c["dul"]["id"], krok_x, krok_y)
c["dul"]["x1"] += krok_x
c["dul"]["x2"] += krok_x
c["dul"]["y1"] += krok_y
c["dul"]["y2"] += krok_y
elif odleglosc_kwadrat > 40000:
odleglosc = math.sqrt(odleglosc_kwadrat) odleglosc = math.sqrt(odleglosc_kwadrat)
predkosc = 1.0 predkosc = 1.0
krok_x = (dx / odleglosc) * predkosc krok_x = (dx / odleglosc) * predkosc
krok_y = (dy / odleglosc) * predkosc krok_y = (dy / odleglosc) * predkosc
canvas.move(c["dul"]["id"], krok_x, krok_y) canvas.move(c["dul"]["id"], krok_x, krok_y)
c["dul"]["x1"] += krok_x c["dul"]["x1"] += krok_x
c["dul"]["x2"] += krok_x c["dul"]["x2"] += krok_x
c["dul"]["y1"] += krok_y c["dul"]["y1"] += krok_y
c["dul"]["y2"] += krok_y c["dul"]["y2"] += krok_y
canvas.move(c["wieza"]["id"], krok_x, krok_y)
canvas.move(c["lufa"]["id"], krok_x, krok_y)
wspol = canvas.coords(c["dul"]["id"])
if len(wspol) < 8:
return
xs = [wspol[i] for i in range(0, len(wspol), 2)]
ys = [wspol[i] for i in range(1, len(wspol), 2)]
cx = sum(xs) / len(xs)
cy = sum(ys) / len(ys)
promien_czolgu = 18
for k in kamycki:
kx_srodek = k["x"] + (k["pr"] / 2)
ky_srodek = k["y"] + (k["pr"] / 2)
odleglosc_kamyka = math.sqrt((cx - kx_srodek) ** 2 + (cy - ky_srodek) ** 2)
min_odleglosc = promien_czolgu + (k["pr"] / 2)
if odleglosc_kamyka < min_odleglosc:
nakladanie = min_odleglosc - odleglosc_kamyka
kat = math.atan2(cy - ky_srodek, cx - kx_srodek)
odbicie_x = nakladanie * math.cos(kat)
odbicie_y = nakladanie * math.sin(kat)
canvas.move(c["dul"]["id"], odbicie_x, odbicie_y)
canvas.move(c["wieza"]["id"], odbicie_x, odbicie_y)
canvas.move(c["lufa"]["id"], odbicie_x, odbicie_y)
c["dul"]["x1"] += odbicie_x
c["dul"]["x2"] += odbicie_x
c["dul"]["y1"] += odbicie_y
c["dul"]["y2"] += odbicie_y
c["hp"] -= 1
if randrange(0, 2) == 1:
c["boczny_x"] = math.sin(kat)
c["boczny_y"] = -math.cos(kat)
else:
c["boczny_x"] = -math.sin(kat)
c["boczny_y"] = math.cos(kat)
c["omijanie"] = 35
break
c["ip"].place(x=c["dul"]["x1"] + 2.5, y=c["dul"]["y1"] - 10) c["ip"].place(x=c["dul"]["x1"] + 2.5, y=c["dul"]["y1"] - 10)
c["ip"]['value'] = c["hp"] c["ip"]['value'] = c["hp"]
cx = (c["dul"]["x1"] + c["dul"]["x2"]) / 2 cx = (c["dul"]["x1"] + c["dul"]["x2"]) / 2
cy = (c["dul"]["y1"] + c["dul"]["y2"]) / 2 cy = (c["dul"]["y1"] + c["dul"]["y2"]) / 2
dlugosc_lufy = c["lufa"]["wiel"] dlugosc_lufy = c["lufa"]["wiel"]
dx = celx - cx dx_celu = celx - cx
dy = cely - cy dy_celu = cely - cy
kat_czolgu = math.atan2(dy, dx) kat_czolgu = math.atan2(dy_celu, dx_celu)
lx = cx + dlugosc_lufy * math.cos(kat_czolgu) lx = cx + dlugosc_lufy * math.cos(kat_czolgu)
ly = cy + dlugosc_lufy * math.sin(kat_czolgu) ly = cy + dlugosc_lufy * math.sin(kat_czolgu)
canvas.coords(c["lufa"]["id"], cx, cy, lx, ly) canvas.coords(c["lufa"]["id"], cx, cy, lx, ly)
if odleglosc_kwadrat < 160000 and not c["karabiny"]["czyprze"] and c["karabiny"]["mag"] > 0:
c["karabiny"]["mag"] -= 1
dlugosc_wylotu = 8
start_x = cx + dlugosc_wylotu * math.cos(kat_czolgu)
start_y = cy + dlugosc_wylotu * math.sin(kat_czolgu)
canvas.move(c["wieza"]["id"],krok_x,krok_y) predkosc_karabinu = 11
bullet_dx = predkosc_karabinu * math.cos(kat_czolgu) + random.uniform(-0.8, 0.8)
bullet_dy = predkosc_karabinu * math.sin(kat_czolgu) + random.uniform(-0.8, 0.8)
r_karabinu = 1
id_karabinu = canvas.create_oval(start_x - r_karabinu, start_y - r_karabinu, start_x + r_karabinu, start_y + r_karabinu, fill="black", outline="")
karabiny.append({"id": id_karabinu, "dx": bullet_dx, "dy": bullet_dy})
if c["karabiny"]["mag"] == 0:
c["karabiny"]["czyprze"] = True
if c["karabiny"]["czyprze"]:
c["karabiny"]["prze"] += 1
if c["karabiny"]["prze"] >= 80:
c["karabiny"]["czyprze"] = False
c["karabiny"]["prze"] = 0
c["karabiny"]["mag"] = 80
def aktualizuj_karabiny(): def aktualizuj_karabiny():
global cele_zniszczone global cele_zniszczone, hp, hpbar
szerokosc_okna = canvas.winfo_width() szerokosc_okna = canvas.winfo_width()
wysokosc_okna = canvas.winfo_height() wysokosc_okna = canvas.winfo_height()
@ -180,7 +262,9 @@ def aktualizuj_karabiny():
cele_do_usuniecia = [] cele_do_usuniecia = []
for i in range(len(karabiny) - 1, -1, -1): for i in range(len(karabiny) - 1, -1, -1):
p = karabiny[i] p = karabiny[i]
canvas.move(p["id"], p["dx"], p["dy"]) dx = p["dx"]
dy = p["dy"]
canvas.move(p["id"], dx, dy)
coords = canvas.coords(p["id"]) coords = canvas.coords(p["id"])
if coords: if coords:
@ -188,7 +272,6 @@ def aktualizuj_karabiny():
if px < 0 or px > szerokosc_okna or py < 0 or py > wysokosc_okna: if px < 0 or px > szerokosc_okna or py < 0 or py > wysokosc_okna:
pociski_do_usuniecia.append(i) pociski_do_usuniecia.append(i)
continue continue
for idx, j in enumerate(kamycki): for idx, j in enumerate(kamycki):
if j["x"] <= px <= j["x"] + j["pr"] and j["y"] <= py <= j["y"] + j["pr"]: if j["x"] <= px <= j["x"] + j["pr"] and j["y"] <= py <= j["y"] + j["pr"]:
pociski_do_usuniecia.append(i) pociski_do_usuniecia.append(i)
@ -203,6 +286,11 @@ def aktualizuj_karabiny():
if c["hp"] <= 0: if c["hp"] <= 0:
cele_do_usuniecia.append(idx) cele_do_usuniecia.append(idx)
break break
wym = canvas.coords(dul)
if min(wym[0], wym[2], wym[4], wym[6]) < px < max(wym[0], wym[2], wym[4], wym[6]) and min(wym[1], wym[3], wym[5], wym[7]) < py < max(wym[1], wym[3], wym[5], wym[7]):
hp -= 0.01
hpile["text"] = str(int(hp))
hpbar['value'] = hp
cele_do_usuniecia.sort(reverse=True) cele_do_usuniecia.sort(reverse=True)
for idx in cele_do_usuniecia: for idx in cele_do_usuniecia:
@ -226,9 +314,7 @@ def aktualizuj_karabiny():
root.after(1000, lambda wid2=wybuch_id2: canvas.delete(wid2)) root.after(1000, lambda wid2=wybuch_id2: canvas.delete(wid2))
root.after(1500, lambda wid3=wybuch_id3: canvas.delete(wid3)) root.after(1500, lambda wid3=wybuch_id3: canvas.delete(wid3))
root.after(3000, lambda wid4=wybuch_id4: canvas.delete(wid4)) root.after(3000, lambda wid4=wybuch_id4: canvas.delete(wid4))
slad_id = canvas.create_rectangle(srodek_x - 15, srodek_y - 10, slad_id = canvas.create_rectangle(srodek_x - 15, srodek_y - 10, srodek_x + 15, srodek_y + 10, fill="black", outline="")
srodek_x + 15, srodek_y + 10,
fill="black", outline="")
canvas.tag_lower(slad_id) canvas.tag_lower(slad_id)
canvas.delete(c["dul"]["id"]) canvas.delete(c["dul"]["id"])
@ -300,7 +386,7 @@ def misja():
hp_wrog_id['value'] = 10 hp_wrog_id['value'] = 10
long = randrange(5, 20) long = randrange(5, 20)
lufa_id = canvas.create_line(cx + 15, cy + 10, cx + long + 15, cy + 10, width=long / 5) lufa_id = canvas.create_line(cx + 15, cy + 10, cx + long + 15, cy + 10, width=long / 5)
cele.append({"dul":{"id": wrog_id, "x1": cx, "y1": cy, "x2": cx + 30, "y2": cy + 20}, "hp": 60, "ip": hp_wrog_id, "lufa": {"id": lufa_id, "x": 0, "y": 0, "wiel": long}}) cele.append({"dul": {"id": wrog_id, "x1": cx, "y1": cy, "x2": cx + 30, "y2": cy + 20}, "hp": 60, "ip": hp_wrog_id, "lufa": {"id": lufa_id, "x": 0, "y": 0, "wiel": long}, "wieza": {"id": wieza_id, "pro": promien_kola}, "karabiny": {"mag": 80, "prze": 100, "czyprze": False}, "omijanie": 0, "boczny_x": 0.0, "boczny_y": 0.0})
def aktualizuj_pociski(): def aktualizuj_pociski():
@ -404,7 +490,6 @@ def sprawdz_kolizje_czolgu():
promien_czolgu = 18 promien_czolgu = 18
for k in kamycki: for k in kamycki:
kx_srodek = k["x"] + (k["pr"] / 2) kx_srodek = k["x"] + (k["pr"] / 2)
ky_srodek = k["y"] + (k["pr"] / 2) ky_srodek = k["y"] + (k["pr"] / 2)
odleglosc = math.sqrt((cx - kx_srodek) ** 2 + (cy - ky_srodek) ** 2) odleglosc = math.sqrt((cx - kx_srodek) ** 2 + (cy - ky_srodek) ** 2)
@ -678,10 +763,9 @@ for i in range(cel_wymagany):
long = randrange(5, 20) long = randrange(5, 20)
lufa_id = canvas.create_line(cx + 15, cy + 10, cx + long + 15, cy + 10, width=long / 5) lufa_id = canvas.create_line(cx + 15, cy + 10, cx + long + 15, cy + 10, width=long / 5)
promien_kola = long / 2 promien_kola = long / 2
wieza_id = canvas.create_oval(cx - promien_kola+15, cy - promien_kola+10, cx + promien_kola+15, cy + promien_kola+10, fill="red3", outline="black") wieza_id = canvas.create_oval(cx - promien_kola + 15, cy - promien_kola + 10, cx + promien_kola + 15, cy + promien_kola + 10, fill="red3", outline="black")
canvas.tag_lower(wieza_id,lufa_id) canvas.tag_lower(wieza_id, lufa_id)
cele.append({"dul": {"id": wrog_id, "x1": cx, "y1": cy, "x2": cx + 30, "y2": cy + 20}, "hp": 60, "ip": hp_wrog_id, "lufa": {"id": lufa_id, "x": 0, "y": 0, "wiel": long}, cele.append({"dul": {"id": wrog_id, "x1": cx, "y1": cy, "x2": cx + 30, "y2": cy + 20}, "hp": 60, "ip": hp_wrog_id, "lufa": {"id": lufa_id, "x": 0, "y": 0, "wiel": long}, "wieza": {"id": wieza_id, "pro": promien_kola}, "karabiny": {"mag": 80, "prze": 100, "czyprze": False}, "omijanie": 0, "boczny_x": 0.0, "boczny_y": 0.0})
"wieza": {"id": wieza_id, "pro": promien_kola}})
kamycki = [] kamycki = []
for i in range(60): for i in range(60):
@ -692,6 +776,24 @@ for i in range(60):
t = canvas.create_oval(kax, kay, kax + wt, kay + wt, fill=ka, outline="") t = canvas.create_oval(kax, kay, kax + wt, kay + wt, fill=ka, outline="")
canvas.tag_lower(t) canvas.tag_lower(t)
kamycki.append({"id": t, "x": kax, "y": kay, "pr": wt}) kamycki.append({"id": t, "x": kax, "y": kay, "pr": wt})
x = randrange(0, 1900)
y = randrange(0, 1000)
bunkier = []
for j in range(8):
for i in range(100):
bunkier.append([x + (j * 2), y + (i * 2) - 100])
for i in range(140):
bunkier.append([x + randrange(-10, 1), y + randrange(-100, 100)])
for i in range(140):
bunkier.append([x + randrange(16, 26), y + randrange(-100, 100)])
for x, y in bunkier:
ka = "grey" + str(randrange(30, 40))
wt = 3
t = canvas.create_oval(x, y, x + wt, y + wt, fill=ka, outline="")
canvas.tag_lower(t)
kamycki.append({"id": t, "x": x, "y": y, "pr": wt})
x = 0
for i in range(1600): for i in range(1600):
trxx = randrange(0, 1900) trxx = randrange(0, 1900)