борат сагдиев
Гуру
(2879)
2 месяца назад
Конечно! Ниже приведен пример того, как можно реализовать босс-файт в игре "Змейка" на Python с использованием Pygame. Этот код продолжает вашу игру, добавляя механики босса, о которых вы упомянули. Вы можете интегрировать этот фрагмент в уже существующий код змейки.
import pygame
import random
import time
# Инициализация Pygame
pygame.init()
# Константы
SCREEN_WIDTH = 600
SCREEN_HEIGHT = 400
CELL_SIZE = 20
FPS = 15
# Классы и функции здесь
class Boss:
def __init__(self):
self.x = SCREEN_WIDTH // 2
self.y = 50
self.hp = 50
self.hitbox = [(self.x + dx, self.y + dy) for dx in range(5) for dy in range(5)]
self.direction = 1 # 1 - вправо, -1 - влево
self.meteorites = []
self.attack_time = pygame.time.get_ticks()
self.can_attack = True
def move(self):
self.x += self.direction * 5
# Изменяем направление, когда босс достигает границ
if self.x <= 0 or self.x >= SCREEN_WIDTH - 100:
self.direction *= -1
def cast_meteorite(self):
shadow_x = random.randint(0, SCREEN_WIDTH - CELL_SIZE)
meteorite = (shadow_x, 0)
self.meteorites.append((meteorite, time.time()))
def draw(self, screen):
pygame.draw.rect(screen, (255, 0, 0), (self.x, self.y, 100, 100)) # Босс
for meteorite, spawn_time in self.meteorites:
drop_y = int((time.time() - spawn_time) * 100) # скорость падения
if drop_y * CELL_SIZE < SCREEN_HEIGHT:
pygame.draw.rect(screen, (0, 0, 255), (meteorite[0], drop_y * CELL_SIZE, CELL_SIZE, CELL_SIZE))
def update_meteorites(self, snake_positions):
for meteorite, spawn_time in list(self.meteorites):
drop_y = int((time.time() - spawn_time) * 100) # скорость падения
if (drop_y * CELL_SIZE) >= SCREEN_HEIGHT:
self.meteorites.remove((meteorite, spawn_time))
if meteorite[1] == drop_y * CELL_SIZE: # Проверка на столкновение
if meteorite[0] in snake_positions:
return True # Змея проиграла
return False
# Основной игровой цикл
def main():
screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
clock = pygame.time.Clock()
score = 0
boss_spawned = False
boss = Boss()
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE: # Стрельба по боссу
apple_x, apple_y = snake.get_head_position() # Позиция головы змеи
if boss.x <= apple_x <= boss.x + 100 and boss.y <= apple_y <= boss.y + 100:
boss.hp -= 1
score += 1
if boss.hp <= 0:
print("Вы выиграли!")
running = False
# Проверка на наличие босса
if score >= 10 and not boss_spawned:
time.sleep(2)
boss_spawned = True
if boss_spawned:
boss.move()
if boss.can_attack and (pygame.time.get_ticks() - boss.attack_time > 3000):
boss.cast_meteorite()
boss.attack_time = pygame.time.get_tick
борат сагдиевГуру (2879)
2 месяца назад
s()
if boss.update_meteorites(snake_positions): # Проверка на столкновение метеорита со змеей
print("Вы проиграли!")
running = False
screen.fill((0, 0, 0)) # Очистка экрана
boss.draw(screen)
pygame.display.flip() # Обновление экрана
clock.tick(FPS)
pygame.quit()
if __name__ == "__main__":
main()
По достижении счета 10, змейка больше не растет. После этого экран замирает на 2 секунды, а затем появляется "босс-яблоко".
Описание босса:
Босс перемещается по горизонтали туда-сюда.
Когда он достигает середины по оси X дисплея, он останавливается и начинает кастовать яблочные метеориты.
Механика метеоритов от босса:
Метеорит сначала оставляет тень в случайной точке экрана.
Через 3 секунды он падает в указанную точку.
Размер метеорита — 3 на 3 клетки.
Если метеорит падает на змею, игрок проигрывает.
Механика атаки и яблок:
Игрок может стрелять по боссу, используя кнопку Space.
Яблоки вылетают из головы змеи и летят вверх.
Если яблоко врезается в босс или стену, оно исчезает, а новое яблоко появляется в случайной точке экрана.
Если яблоко попадает в босс, он теряет одно хп из общего количества 50.
Хитбокс босса:
Хитбокс реализуется в виде списка из 25 элементов (позиций квадрата 5 на 5 клеток).
Если яблоко попадает в одну из этих позиций, боссу наносится урон.
Дополнительные условия:
В начале босса-файта змейке повышается счет за попадание по боссу.
Игроку нужно стрелять по боссу, но при этом избегать попадания под метеориты, которые босс кастует.
Победа и проигрыш:
Если игрок успешно наносит урон и убивает босса, игрок выигрывает.
Если метеорит попадает в змею, игрок проигрывает.
ниже будет прикреплен уже готовая часть кода, её нужно будет дополнить босс-файтом.
Предупреждаю! Опытные программисты скорее всего будут в ужасе от этого кода.
https://drive.google.com/file/d/1UabprAJByA5rOq2b6ltRj61TI0BQNVlZ/view?usp=sharing