From bd49cf7e1f1af9476df497921149111adb818bad Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ri=C4=8Dards=20Dzirvinskis?= Date: Mon, 16 Mar 2026 06:10:51 +0000 Subject: [PATCH] Upload files to "/" --- kotleta.png | Bin 0 -> 574 bytes main.py | 316 +++++++++++++++++++++++++++++++++++++++++++++++++ pizza.png | Bin 0 -> 1035 bytes pizza_kick.png | Bin 0 -> 811 bytes player1.jpg | Bin 0 -> 12207 bytes 5 files changed, 316 insertions(+) create mode 100644 kotleta.png create mode 100644 main.py create mode 100644 pizza.png create mode 100644 pizza_kick.png create mode 100644 player1.jpg diff --git a/kotleta.png b/kotleta.png new file mode 100644 index 0000000000000000000000000000000000000000..3ea11e3597b65df50a11f6dac75efa37a80c7164 GIT binary patch literal 574 zcmeAS@N?(olHy`uVBq!ia0vp^3qY8I4M=vMPuB%fjKx9jP7LeL$-D%ze|Wk$hE&XX zdv~L+tfPp-#h+puRm~kbI8NMcJ-yIi)kcm?hEBExjO^z>J+S^YM|geN|C(6e4gR}# zivdkS19Kj2`rXoRFMm({_}{wP+qEwj-~In%-`AR}|G$6vvuW$hd~1KUdhdoMEFNB{ z#H+Nb2PKCN&JUg3eOGu!X}R^Q1S`Xh%#(x^G#Sx}U2o 1500: + self.lane = random.randint(0, 2); self.timer = pygame.time.get_ticks() + self.rect.centery = lane_centers[self.lane] + if self.rect.right < 0: self.kill() + +class Projectile(pygame.sprite.Sprite): + def __init__(self, img, lane, speed, kickable=False): + super().__init__() + self.image = img + self.target_y = lane_centers[lane] + self.rect = self.image.get_rect(center=(SCREEN_WIDTH - 250, self.target_y - 40)) + self.speed = speed + self.kickable = kickable + self.returned = False + self.held = False + self.v_speed = -4 + def update(self): + if self.held: return + if self.returned: + self.rect.x += 25 + else: + self.rect.x -= self.speed + if self.rect.centery < self.target_y: + self.rect.centery += self.v_speed; self.v_speed += 0.25 + else: self.rect.centery = self.target_y + if self.rect.right < 0 or self.rect.left > SCREEN_WIDTH: self.kill() + +class Boss(pygame.sprite.Sprite): + def __init__(self): + super().__init__() + self.base_image = demon_img + self.image = self.base_image + self.lives = 15 + self.lane = 1 + self.rect = self.image.get_rect(center=(SCREEN_WIDTH - 200, lane_centers[self.lane])) + self.dir = 1 + self.move_timer = pygame.time.get_ticks() + self.state = "NORMAL" + self.move_delay = 2000 # Начальная задержка движения + self.fire_rate_mod = 1.0 + self.grow_start = 0 + + def update(self): + now = pygame.time.get_ticks() + + if self.state == "NORMAL": + # Проверка таймера перемещения + if now - self.move_timer > self.move_delay: + self.lane += self.dir + if self.lane < 0 or self.lane > 2: + self.dir *= -1 + self.lane += self.dir * 2 + self.move_timer = now + + # Строгое центрирование маленького босса + self.image = self.base_image + self.rect = self.image.get_rect(center=(SCREEN_WIDTH - 200, lane_centers[self.lane])) + + elif self.state == "GROWING": + # Состояние увеличения + self.image = pygame.transform.scale(self.base_image, (250, 250)) + self.rect = self.image.get_rect(center=(SCREEN_WIDTH - 200, lane_centers[self.lane])) + if now - self.grow_start > 2000: + self.state = "NORMAL" + # Ускоряем движение в зависимости от HP при выходе из фазы роста + if self.lives <= 5: + self.move_delay = 600 + elif self.lives <= 10: + self.move_delay = 1100 + + self.fire_rate_mod = max(0.5, self.fire_rate_mod - 0.15) + self.rect = self.base_image.get_rect(center=(SCREEN_WIDTH - 200, lane_centers[self.lane])) + + elif self.state == "DEAD": + self.image = pygame.transform.scale(self.base_image, (450, 450)) + self.rect.x += 12; self.rect.y -= 12 + if self.rect.bottom < 0: self.kill() + +# --- Инициализация объектов --- +player = Player() +enemies = pygame.sprite.Group() +projectiles = pygame.sprite.Group() +kotleta_group = pygame.sprite.GroupSingle() +boss_group = pygame.sprite.GroupSingle() +victory_pizza = pygame.sprite.GroupSingle() + +score, speed, game_over, win = 0, 10, False, False +spawn_timer = pygame.time.get_ticks() +p_timer = 0 +k_timer = 0 +font = pygame.font.Font(None, 40) + +def reset(): + global score, speed, game_over, win, spawn_timer + score, speed, game_over, win = 0, 10, False, False + spawn_timer = pygame.time.get_ticks() + player.lives, player.lane = 1, 1 + enemies.empty(); projectiles.empty(); kotleta_group.empty(); boss_group.empty(); victory_pizza.empty() + +# --- Игровой цикл --- +running = True +while running: + now = pygame.time.get_ticks() + + for event in pygame.event.get(): + if event.type == QUIT: + running = False + if event.type == KEYDOWN: + if not game_over and not win: + if event.key == K_UP: player.lane = max(0, player.lane - 1) + if event.key == K_DOWN: player.lane = min(2, player.lane + 1) + t_lane = -1 + if event.key == K_1: t_lane = 0 + if event.key == K_2: t_lane = 1 + if event.key == K_3: t_lane = 2 + if t_lane != -1: + for p in projectiles: + if p.held: + p.held = False; p.returned = True + p.target_y = lane_centers[t_lane]; p.rect.centery = p.target_y + else: + if event.key == K_r: reset() + if event.key == K_q: running = False + + if not game_over and not win: + # Спавн обычных врагов + if not boss_group and score < 50: + delay = random.randint(1100, 1700) if score > 15 else 1500 + if now - spawn_timer > delay: + lanes = random.sample(range(3), 2) if score > 15 else [random.randint(0, 2)] + for i, l in enumerate(lanes): + enemies.add(Enemy(speed, l, x_offset=i*random.randint(300, 500))) + spawn_timer = now + + # Повариха с котлетой + if (25 <= score <= 29 or score == 42) and not kotleta_group: + kotleta_group.add(Kotleta()) + + # Появление босса + if score >= 50 and not boss_group and not win: + boss_group.add(Boss()) + enemies.empty(); kotleta_group.empty() + + if boss_group: + b = boss_group.sprite + if b.state == "NORMAL": + if now - p_timer > 1400 * b.fire_rate_mod: + projectiles.add(Projectile(pizza_img, random.randint(0, 2), 12)) + p_timer = now + if now - k_timer > 2800 * b.fire_rate_mod: + projectiles.add(Projectile(pizza_kick_img, random.randint(0, 2), 9, True)) + k_timer = now + + # Урон боссу + for p in projectiles: + if p.returned and b.rect.colliderect(p.rect): + b.lives -= 1; p.kill() + if b.lives in [10, 5]: + b.state = "GROWING" + b.grow_start = now + projectiles.empty() + if b.lives <= 0: + b.state = "DEAD"; projectiles.empty() + + # Проверка победы + if boss_group and boss_group.sprite.state == "DEAD": + pass # Ждем пока улетит + elif score >= 50 and not boss_group and not win: + win = True + vp = pygame.sprite.Sprite() + vp.image = load_s('pizza.png', (450, 450)) + vp.rect = vp.image.get_rect(center=(SCREEN_WIDTH//2, SCREEN_HEIGHT//2)) + victory_pizza.add(vp) + + # Обновление всех объектов + player.update() + enemies.update() + projectiles.update() + kotleta_group.update() + boss_group.update() + victory_pizza.update() + + # Коллизии + if pygame.sprite.spritecollide(player, enemies, True): player.lives -= 1 + if pygame.sprite.spritecollide(player, kotleta_group, True): player.lives += 1 + + for p in projectiles: + if player.rect.colliderect(p.rect) and not p.returned: + if p.kickable: + p.held = True; p.rect.center = player.rect.center + else: + player.lives -= 1; p.kill() + elif p.held and not player.rect.colliderect(p.rect): + p.kill() # Снаряд исчезает, если игрок ушел с линии не кинув его + + # Начисление очков + for e in enemies: + if not e.passed and e.rect.right < player.rect.left: + e.passed = True; score += 1 + if score % 5 == 0 and speed < 35: speed += 1 + + if player.lives <= 0: game_over = True + + # --- Отрисовка --- + screen.blit(background_img, (0, 0)) + + # Рисуем линии дорожек + for i in range(4): + pygame.draw.rect(screen, (0, 0, 0), (0, start_y + i*(lane_height+line_thickness), SCREEN_WIDTH, line_thickness)) + + if kotleta_group: + screen.blit(povar_img, (SCREEN_WIDTH // 2 - 75, start_y - 145)) + + enemies.draw(screen) + projectiles.draw(screen) + kotleta_group.draw(screen) + boss_group.draw(screen) + victory_pizza.draw(screen) + screen.blit(player.image, player.rect) + + # Интерфейс + screen.blit(font.render(f"Score: {score}", True, (0,0,0)), (130, 20)) + screen.blit(font.render(f"Speed: {speed}", True, (0,0,0)), (450, 20)) + screen.blit(font.render(f"Lives: {player.lives}", True, (0,0,0)), (850, 20)) + if boss_group: + b = boss_group.sprite + screen.blit(font.render(f"BOSS HP: {b.lives}", True, (0,0,0)), (SCREEN_WIDTH - 300, 20)) + + # Экраны окончания + if game_over: + overlay = pygame.Surface((SCREEN_WIDTH, SCREEN_HEIGHT), pygame.SRCALPHA) + overlay.fill((0, 0, 0, 200)); screen.blit(overlay, (0,0)) + screen.blit(end_img, (SCREEN_WIDTH//2 - 150, 50)) + msg = pygame.font.Font(None, 100).render("ИГРА ОКОНЧЕНА", True, (255, 50, 50)) + screen.blit(msg, msg.get_rect(center=(SCREEN_WIDTH//2, 400))) + + if win: + msg = pygame.font.Font(None, 100).render("ПОБЕДА! СУПЕР ПИЦЦА ТВОЯ!", True, (255, 200, 0)) + screen.blit(msg, msg.get_rect(center=(SCREEN_WIDTH//2, 100))) + + pygame.display.flip() + clock.tick(60) + +pygame.quit() \ No newline at end of file diff --git a/pizza.png b/pizza.png new file mode 100644 index 0000000000000000000000000000000000000000..174b7b8efe93ee50b05731010ec07f59fb09b5ea GIT binary patch literal 1035 zcmeAS@N?(olHy`uVBq!ia0vp^3qY8I4M=vMPuB%fjKx9jP7LeL$-HD>U_R>U;uumf z=k48%*-R z4xaTWDdb%0+`h|l%A}=wc|o)MWOvagnA`?`3`m_^qAUdsOZe)LPr<8P<+7nSzs%gXM3_vOeDK5TkeJg#Q#GMHQ7^ZUu^ z;}>`3zpIs4Tm9*9=k`Bt`DyAg+yDJczqm_&y8Yr(>1zGOr7w@D*xsJx=ko?(D~eOr z`uJO1+AQ~c-`RH;?5n?Bj;>o=@2##@zQ0azt#zf*oR~T1)x=lMPOp>xyXVVyIU5V} zs#t3@Z@>)vICDaI?V*pap9bGN^pMl(m$liqO`V>vo^8#Etzvuj>fgqUyJbJ#&z@(v zks0KBm^MU^i26HS;&j)t^)CE&>+>7tc6FJRUwTe%YT2*+2r5$-vG4tj3`X%Wq)1H3MxccS0_xx?8rT?$KD80;i?O^kp&$xo(=;R46mq*rC zY0fn{Gix5tmU{>6azDS&e|YNV@|v5B7?B5dewVu9%gBZsA6%4dl{fA!Px-QI#?^&C zvwe1L^7N>Bb{tniICXgK*25_e|8B1DiL3Zs@;t{a`_ROF4{heYSR%aq%X=H!gS(0! zKA)O0R~DM!(1Lu`NAqRzHJ<{veJCkAmJ*eH=;EbW1xs*+&)RkQZ~N}u{P((`^W2O# zE%T?_?ahAvEAL0Ay!+~?e5d*IVwPOuyf*jY>svSiOKNV@o<8k|M^d8x#7&v>MKk5& s&Dj^exag#^BWDV@8(F}4tKt8V`@C-3{kZ*K)PMv$UHx3vIVCg!01H#sZ~y=R literal 0 HcmV?d00001 diff --git a/pizza_kick.png b/pizza_kick.png new file mode 100644 index 0000000000000000000000000000000000000000..cd65b77b6d91b4a060ebc572d4f1d26591587676 GIT binary patch literal 811 zcmeAS@N?(olHy`uVBq!ia0vp^3qY8I4M=vMPuB%fjKx9jP7LeL$-HD>V0!B5;uumf z=j~lXKhZ#uhKC1l+}g~%M&}NL+J(RkJk?AX;AUv-14Ey-EG%IkL7#a6{? zD`+xK5<(|dE_R+-U{mwg#469qF`~Bq_rCPhU)9U^C+|9r%bGnK6TW`eUbRyMYbKXLs1`a13UR8}m;GpU%?_3VG2-#BZQpWd$RUT0(O zo&6{O``^(@9R7VOEw$=>)tlc>lB_&u#ckiU|K;=x%hzB;7dZB&`8$34n;UqQCGlVD z=d|}{UvVD)`R-dr(HtD^uE^Q=%k$^UtDk|9yRGU_p~f=dK203%Sn9uZd+zPLvUL5` z=Pe6s3ip4hxmq3=w)$I@PbBVC5#}3qZ`M_urb3eCp04}HD_Y+t9s5=V67Y2Ob6Mw< G&;$Up#8I9A literal 0 HcmV?d00001 diff --git a/player1.jpg b/player1.jpg new file mode 100644 index 0000000000000000000000000000000000000000..6076eb109872d6392beffec8b35156e22af00ccb GIT binary patch literal 12207 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