Загрузка данных
import random
W, H = 800, 600
px = W // 2
py = H - 70
sc = 0
lv = 5
b = []
as_ = []
bf = []
ws = 1
g = 0
sh = False
st = 0
et = 0
def setup():
size(W, H)
noStroke()
f = createFont("Segoe UI", 16, True)
textFont(f)
def draw_gemini_logo(x, y, sz):
pushMatrix()
translate(x, y)
fill(138, 180, 248)
beginShape()
vertex(0, -sz)
quadraticVertex(0, 0, sz, 0)
quadraticVertex(0, 0, 0, sz)
quadraticVertex(0, 0, -sz, 0)
quadraticVertex(0, 0, 0, -sz)
endShape(CLOSE)
fill(210, 227, 252)
beginShape()
vertex(sz * 0.4, -sz * 0.4)
quadraticVertex(sz * 0.4, -sz * 0.1, sz * 0.7, -sz * 0.1)
quadraticVertex(sz * 0.4, -sz * 0.1, sz * 0.4, sz * 0.2)
quadraticVertex(sz * 0.4, -sz * 0.1, sz * 0.1, -sz * 0.1)
quadraticVertex(sz * 0.4, -sz * 0.1, sz * 0.4, -sz * 0.4)
endShape(CLOSE)
popMatrix()
def draw():
global px, sc, lv, as_, b, bf, ws, g, sh, st, et
if g == 0:
background(15, 20, 40)
fill(0, 230, 180)
textSize(32)
textAlign(CENTER)
text(u"КОСМИЧЕСКИЙ СИМУЛЯТОР", W // 2, 60)
textSize(18)
fill(255)
text(u"НАЖМИТЕ ПРОБЕЛ ДЛЯ СТАРТА", W // 2, 110)
textAlign(LEFT)
textSize(16)
fill(200, 200, 255)
text(u"СПИСОК БАФОВ И ШАНСЫ ВЫПАДЕНИЯ:", 100, 160)
fill(255, 200, 0)
triangle(120, 205, 110, 225, 130, 225)
fill(255)
text(u"Апгрейд оружия (Шанс: 12%) - Добавляет лазеры", 160, 220)
fill(0, 255, 100)
rect(115, 255, 10, 26, 3)
rect(107, 263, 26, 10, 3)
fill(255)
text(u"Ремкомплект (Шанс: 10%) - Восстанавливает 1 жизнь", 160, 275)
fill(0, 150, 255)
arc(120, 325, 24, 24, 0, PI + QUARTER_PI, CHORD)
fill(255)
text(u"Энергетический щит (Шанс: 8%) - Блокирует 1 удар", 160, 330)
fill(200, 100, 255)
circle(120, 385, 22)
fill(15, 20, 40)
circle(120, 385, 16)
fill(200, 100, 255)
rect(119, 377, 2, 9)
rect(119, 384, 6, 2)
fill(255)
text(u"Временная петля (Шанс: 5%) - Замедляет метеориты", 160, 385)
fill(255, 70, 70)
circle(120, 440, 20)
fill(255, 200, 0)
rect(118, 426, 4, 6)
fill(255, 100, 0)
circle(120, 422, 6)
fill(255)
text(u"Космическая бомба (Шанс: 5%) - Уничтожает всё", 160, 440)
fill(150, 150, 150)
textAlign(CENTER)
text(u"УПРАВЛЕНИЕ: СТРЕЛКИ - ДВИЖЕНИЕ / ПРОБЕЛ - ОГОНЬ", W // 2, 530)
draw_gemini_logo(W - 40, 40, 15)
elif g == 1:
background(11, 16, 38)
et = (millis() - st) // 1000
fill(255, 255, 255, 100)
for _ in range(3):
circle(random.randint(0, W), random.randint(0, H), random.randint(1, 3))
textAlign(LEFT)
fill(0, 230, 180)
textSize(16)
text(u"СЧЕТ: " + str(sc), 20, 30)
fill(255, 255, 0)
text(u"ВРЕМЯ: " + str(et) + u" сек", 140, 30)
if sh:
fill(0, 150, 255)
text(u"ЩИТ: АКТИВЕН", 290, 30)
fill(255, 65, 100)
text(u"ЖИЗНИ: " + str(lv), W - 160, 30)
if frameCount % 6 < 3:
fill(255, 120, 0)
triangle(px - 10, py + 40, px + 10, py + 40, px, py + 55)
fill(255, 230, 0)
triangle(px - 5, py + 40, px + 5, py + 40, px, py + 48)
if sh:
fill(0, 150, 255, 60)
circle(px, py + 20, 75)
stroke(0, 150, 255)
strokeWeight(2)
noFill()
circle(px, py + 20, 70)
noStroke()
fill(0, 180, 255)
triangle(px - 25, py + 40, px, py + 15, px, py + 40)
triangle(px + 25, py + 40, px, py + 15, px, py + 40)
fill(0, 240, 255)
triangle(px, py, px - 12, py + 35, px + 12, py + 35)
fill(255, 255, 255, 200)
ellipse(px, py + 20, 8, 15)
if keyPressed:
if keyCode == LEFT and px > 30: px -= 6
if keyCode == RIGHT and px < W - 30: px += 6
fill(255, 40, 100)
for bl in b[:]:
bl[1] -= 12
rect(bl[0] - 2, bl[1], 4, 15, 2)
if bl[1] < 0:
b.remove(bl)
sc_c = 0.04 + (et * 0.002)
if random.random() < sc_c:
sz = random.randint(30, 55)
as_.append([random.randint(30, W - 30), -40, random.randint(3, 6), sz])
for a in as_[:]:
a[1] += a[2]
fill(90, 60, 70)
circle(a[0], a[1], a[3])
fill(120, 80, 90)
circle(a[0] - 2, a[1] - 2, a[3] - 4)
fill(255, 90, 0, 150)
circle(a[0] + a[3]//5, a[1] - a[3]//5, a[3]//4)
for bl in b[:]:
if dist(bl[0], bl[1], a[0], a[1]) < a[3] / 2:
a[3] -= 15
if bl in b: b.remove(bl)
if a[3] <= 15:
sc += 1
rn = random.random()
if rn < 0.12:
bf.append([a[0], a[1], 1])
elif rn < 0.22:
bf.append([a[0], a[1], 2])
elif rn < 0.30:
bf.append([a[0], a[1], 3])
elif rn < 0.35:
bf.append([a[0], a[1], 4])
elif rn < 0.40:
bf.append([a[0], a[1], 5])
if a in as_: as_.remove(a)
break
if a in as_ and dist(px, py + 20, a[0], a[1]) < (a[3] / 2 + 20):
if sh:
sh = False
else:
lv -= 1
as_.remove(a)
elif a in as_ and a[1] > H + 50:
as_.remove(a)
for f in bf[:]:
f[1] += 3
if f[2] == 1:
fill(255, 200, 0)
circle(f[0], f[1], 24)
fill(30)
triangle(f[0], f[1] - 8, f[0] - 7, f[1] + 6, f[0] + 7, f[1] + 6)
elif f[2] == 2:
fill(0, 255, 100)
circle(f[0], f[1], 24)
fill(30)
rect(f[0] - 3, f[1] - 8, 6, 16, 2)
rect(f[0] - 8, f[1] - 3, 16, 6, 2)
elif f[2] == 3:
fill(0, 150, 255)
circle(f[0], f[1], 24)
fill(30)
arc(f[0], f[1], 14, 14, 0, PI + QUARTER_PI, CHORD)
elif f[2] == 4:
fill(200, 100, 255)
circle(f[0], f[1], 24)
fill(30)
circle(f[0], f[1], 14)
fill(200, 100, 255)
rect(f[0] - 1, f[1] - 5, 2, 6)
rect(f[0] - 1, f[1] - 1, 5, 2)
elif f[2] == 5:
fill(255, 70, 70)
circle(f[0], f[1], 24)
fill(30)
circle(f[0], f[1], 12)
fill(255, 200, 0)
rect(f[0] - 1, f[1] - 10, 2, 5)
if dist(px, py + 20, f[0], f[1]) < 28:
if f[2] == 1:
ws = min(3, ws + 1)
elif f[2] == 2:
lv = min(5, lv + 1)
elif f[2] == 3:
sh = True
elif f[2] == 4:
for ast in as_:
ast[2] = max(1, ast[2] // 2)
elif f[2] == 5:
as_ = []
bf.remove(f)
elif f[1] > H + 20:
bf.remove(f)
if lv <= 0:
g = 2
draw_gemini_logo(W - 40, 25, 15)
elif g == 2:
background(40, 15, 15)
textAlign(CENTER)
fill(255, 50, 50)
textSize(36)
text(u"ИГРА ОКОНЧЕНА", W // 2, H // 2 - 20)
fill(255)
textSize(18)
text(u"ФИНАЛЬНЫЙ СЧЕТ: " + str(sc), W // 2, H // 2 + 20)
text(u"ВРЕМЯ В ПОЛЕТЕ: " + str(et) + u" сек", W // 2, H // 2 + 50)
text(u"НАЖМИТЕ ENTER ДЛЯ ВОЗВРАТА В МЕНЮ", W // 2, H // 2 + 90)
draw_gemini_logo(W - 40, 40, 15)
def keyPressed():
global b, ws, g, sc, lv, as_, bf, px, sh, st
if g == 0:
if key == ' ':
g = 1
st = millis()
elif g == 1:
if key == ' ':
if ws == 1:
b.append([px, py])
elif ws == 2:
b.append([px - 10, py + 10])
b.append([px + 10, py + 10])
elif ws == 3:
b.append([px, py])
b.append([px - 15, py + 15])
b.append([px + 15, py + 15])
elif g == 2:
if key == ENTER:
sc = 0
lv = 5
ws = 1
sh = False
as_ = []
b = []
bf = []
px = W // 2
g = 0