diff --git a/bla.py b/bla.py index a9e83ea..eb15ad4 100644 --- a/bla.py +++ b/bla.py @@ -7,8 +7,6 @@ SCREEN_WIDTH = 1920 SCREEN_HEIGHT = 1080 PLAYER_WIDTH = 100 PLAYER_HEIGHT = 150 -LOH_WIDTH = 300 -LOH_HEIGHT = 250 BULLET_SIZE = 20 FPS = 60 BULLET_SPEED = 6 @@ -18,9 +16,6 @@ FIRE_DELAY = 1000 # Задержка между выстрелами в мил WHITE = (255, 255, 255) BLACK = (0, 0, 0) -#Определение переменных -score = 0 - # Инициализация Pygame pygame.init() @@ -28,88 +23,15 @@ pygame.init() screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT), flags=pygame.FULLSCREEN) pygame.display.set_caption("Танчики") -# Загрузка и воспроизведение музыки -pygame.mixer.music.load('music.mp3') -pygame.mixer.music.play(-1) # Параметр -1 означает зацикливание музыки -shot_sound = pygame.mixer.Sound('shot.wav') -meme_sound = pygame.mixer.Sound("meme_sound.wav") -explosion_sound = pygame.mixer.Sound("explosion_sound.wav") -stoneexplosion_sound = pygame.mixer.Sound("stoneexplosion_sound.wav") - # Загрузка изображений background_image = pygame.transform.scale(pygame.image.load("travka_pol.jpeg"), (960, 540)) stena = pygame.transform.scale(pygame.image.load("stena.jpeg").convert(), (100, 100)) stenki = pygame.transform.scale(pygame.image.load("stena.jpeg").convert(), (200, 200)) tank_image = pygame.transform.scale(pygame.image.load("ntank-removebg-preview.png"), (PLAYER_WIDTH, PLAYER_HEIGHT)) -loh_image = pygame.transform.scale(pygame.image.load("loh.png"), (LOH_WIDTH, LOH_HEIGHT)) bullet_image = pygame.transform.scale(pygame.image.load("bullet.png"), (BULLET_SIZE, BULLET_SIZE)) -explosion_images = [pygame.image.load(f"explosion_{i}.png") for i in range(1, 48)] -stoneexplosion_images = [pygame.image.load(f"stoneexplosion_{i}.png") for i in range(1, 6)] - menu_background = pygame.transform.scale(pygame.image.load("menu_background.jpg"), (SCREEN_WIDTH, SCREEN_HEIGHT)) -class Explosion(pygame.sprite.Sprite): - def __init__(self, x, y): - super().__init__() - self.image = explosion_images[0] - self.rect = self.image.get_rect(center=(x, y)) - self.frame = 0 - self.last_update = pygame.time.get_ticks() - self.frame_rate = 50 - - def update(self): - now = pygame.time.get_ticks() - if now - self.last_update > self.frame_rate: - self.last_update = now - self.frame += 1 - if self.frame == 6: - self.kill() - else: - center = self.rect.center - self.image = explosion_images[self.frame] - self.rect = self.image.get_rect() - self.rect.center = center - - # Добавление класса для анимации удара о каменную стену -class StoneExplosion(pygame.sprite.Sprite): - def __init__(self, x, y): - super().__init__() - self.images = stoneexplosion_images - self.image = self.images[0] - self.rect = self.image.get_rect(center=(x, y)) - self.frame = 0 - self.last_update = pygame.time.get_ticks() - self.frame_rate = 50 - stoneexplosion_sound.play() # Воспроизведение звука удара о стену - - def update(self): - now = pygame.time.get_ticks() - if now - self.last_update > self.frame_rate: - self.last_update = now - self.frame += 1 - if self.frame == len(self.images): - self.kill() - else: - center = self.rect.center - self.image = self.images[self.frame] - self.rect = self.image.get_rect() - self.rect.center = center - - - def update(self): - now = pygame.time.get_ticks() - if now - self.last_update > self.frame_rate: - self.last_update = now - self.frame += 1 - if self.frame == len(self.images): - self.kill() - else: - center = self.rect.center - self.image = self.images[self.frame] - self.rect = self.image.get_rect() - self.rect.center = center - # Определение класса танка class Tank(pygame.sprite.Sprite): def __init__(self, x, y): @@ -120,8 +42,6 @@ class Tank(pygame.sprite.Sprite): self.angle = -90 # Поворот на 90 градусов против часовой стрелки self.TANK_SPEED = 2 self.last_fire_time = pygame.time.get_ticks() # Время последнего выстрела - self.boosted = False # Флаг, показывающий, активирован ли ускоритель - self.boost_multiplier = 2 # Множитель скорости ускорения def update(self): keys = pygame.key.get_pressed() @@ -131,15 +51,10 @@ class Tank(pygame.sprite.Sprite): self.angle = math.degrees(math.atan2(mouse_pos[1] - self.rect.centery, mouse_pos[0] - self.rect.centerx)) + 90 self.image = pygame.transform.rotate(self.original_image, -self.angle) self.rect = self.image.get_rect(center=self.rect.center) - - if keys[pygame.K_x]: - if not self.boosted: - self.TANK_SPEED *= self.boost_multiplier - self.boosted = True - else: - if self.boosted: - self.TANK_SPEED /= self.boost_multiplier - self.boosted = False + #if not screen.get_rect().colliderect(self.rect): + #self.TANK_SPEED = 0 + #if pygame.sprite.spritecollideany(self, walls): + #self.TANK_SPEED = 0 def move_forward(self): angle_rad = math.radians(self.angle + 270) @@ -149,7 +64,6 @@ class Tank(pygame.sprite.Sprite): def shoot(self): current_time = pygame.time.get_ticks() if current_time - self.last_fire_time > FIRE_DELAY: # Проверка задержки между выстрелами - shot_sound.play() # Воспроизведение звука выстрела # Коррекция угла вылета пули, чтобы она вылетала из дула танка offset_angle = -90 # Угол смещения для вылета пули из дула corrected_angle = self.angle + offset_angle @@ -162,14 +76,8 @@ class Tank(pygame.sprite.Sprite): bullets.add(bullet) self.last_fire_time = current_time # Обновление времени последнего выстрела - # Проверяем столкновение пули с каменными стенами - if pygame.sprite.spritecollideany(bullet, walls): - stoneexplosion_sound.play() # Воспроизведение звука столкновения с каменной стеной - explosion = StoneExplosion(bullet.rect.centerx, bullet.rect.centery) # Создание анимации удара о стену - all_sprites.add(explosion) # Добавлениkе анимацcии удара о стену в группу спрайтов - bullet.kill() # Удаление пули - +# Определение класса снаряда игрока class PlayerBullet(pygame.sprite.Sprite): def __init__(self, x, y, angle): super().__init__() @@ -184,8 +92,7 @@ class PlayerBullet(pygame.sprite.Sprite): if not screen.get_rect().colliderect(self.rect): self.kill() if pygame.sprite.spritecollideany(self, walls): - self.kill() # Удаляем снаряд, если он столкнулся со стеной - + self.kill() # Удаляем снаряд, если он столкнулся со стеной # Определение класса снаряда бота class BotBullet(pygame.sprite.Sprite): @@ -202,14 +109,13 @@ class BotBullet(pygame.sprite.Sprite): if not screen.get_rect().colliderect(self.rect): self.kill() if pygame.sprite.spritecollideany(self, walls): - self.kill() # Удаляем снаряд, если он столкнулся со стеной - + self.kill() # Удаляем снаряд, если он столкнулся со стеной # Определение класса для бота class Bot(pygame.sprite.Sprite): def __init__(self, x, y): super().__init__() - self.original_image = loh_image + self.original_image = tank_image self.image = self.original_image self.rect = self.image.get_rect(center=(x, y)) self.angle = random.randint(0, 360) # Случайный начальный угол поворота @@ -221,7 +127,7 @@ class Bot(pygame.sprite.Sprite): self.move_random() self.rotate_random() self.check_bounds() - # self.shoot_random() + #self.shoot_random() def move_random(self): # Движение вперёд в направлении текущего угла поворота @@ -248,14 +154,15 @@ class Bot(pygame.sprite.Sprite): elif self.rect.bottom > SCREEN_HEIGHT: self.rect.bottom = SCREEN_HEIGHT - # def shoot_random(self): - # Выстрел в направлении дула - # current_time = pygame.time.get_ticks() - # if current_time - self.last_fire_time > random.randint(1000, 5000): - # bullet = BotBullet(self.rect.centerx, self.rect.centery, self.angle + 90) # Стрельба в направлении дула - # all_sprites.add(bullet) - # bullets.add(bullet) - # self.last_fire_time = current_time + #def shoot_random(self): + # Выстрел в направлении дула + #current_time = pygame.time.get_ticks() + #if current_time - self.last_fire_time > random.randint(1000, 5000): + #bullet = BotBullet(self.rect.centerx, self.rect.centery, self.angle + 90) # Стрельба в направлении дула + #all_sprites.add(bullet) + #bullets.add(bullet) + #self.last_fire_time = current_time + class Wall(pygame.sprite.Sprite): @@ -271,6 +178,7 @@ tanks = pygame.sprite.Group() bullets = pygame.sprite.Group() walls = pygame.sprite.Group() # Группа для всех стен + # Создание стен wall_positions = [ (360, 40), (460, 730), (460, 830), (460, 930), @@ -305,6 +213,9 @@ for pos in wall_stenki_positions: all_sprites.add(wall_stenki) walls.add(wall_stenki) + + + # Создание групп спрайтов all_sprites = pygame.sprite.Group() tanks = pygame.sprite.Group() @@ -319,13 +230,6 @@ bot = Bot(3 * SCREEN_WIDTH // 4, SCREEN_HEIGHT // 2) all_sprites.add(bot) tanks.add(bot) -bot = Bot(3 * SCREEN_WIDTH // 4, SCREEN_HEIGHT // 2) -all_sprites.add(bot) -tanks.add(bot) - -bot = Bot(3 * SCREEN_WIDTH // 4, SCREEN_HEIGHT // 2) -all_sprites.add(bot) -tanks.add(bot) def draw_menu(): @@ -353,9 +257,6 @@ def respawn_bot(): tanks.add(new_bot) -last_meme_time = 0 -meme_delay = 2000 # Задержка в миллисекундах (2 секунды) - # Главный цикл программы menu_active = True while menu_active: @@ -369,55 +270,44 @@ while menu_active: else: menu_active = False # Нажата кнопка "Старт" + + # Основной игровой цикл clock = pygame.time.Clock() running = True -paused = False # Track pause state + while running: - # Handle events + player_bullets = [] + bot_bullets = [] + for event in pygame.event.get(): if event.type == pygame.QUIT: running = False - elif event.type == pygame.MOUSEBUTTONDOWN and event.button == 1: - # Handle left mouse button click - if not paused: - player.shoot() - elif event.type == pygame.KEYDOWN: - if event.key == pygame.K_k: - # Handle 'k' key press for meme sound - if current_time - last_meme_time > meme_delay: - meme_sound.play() - last_meme_time = current_time - elif event.key == pygame.K_ESCAPE: - # Toggle pause state when escape key is pressed - paused = not paused + elif event.type == pygame.MOUSEBUTTONDOWN and event.button == 1: # Обработка левой кнопки мыши + player.shoot() - if not paused: # If not paused, update game state - # Update sprites - all_sprites.update() + # Обновление всех спрайтов + all_sprites.update() - # Проверка столкновений пуль с танками + # Проверка столкновений пуль с танками for bullet in bullets: if isinstance(bullet, PlayerBullet): tank_hit = pygame.sprite.spritecollideany(bullet, tanks, pygame.sprite.collide_mask) if tank_hit and isinstance(tank_hit, Bot): - explosion_sound.play() # Воспроизведение звука взрыва - explosion = Explosion(tank_hit.rect.centerx, tank_hit.rect.centery) # Создание взрыва - all_sprites.add(explosion) # Добавление взрыва в группу спрайтов + tank_hit.kill() # Удаляем бота, если попал игрок bullet.kill() # Удаляем пулю - tank_hit.kill() # Удаляем бота - respawn_bot() # Создаем нового бота - score += 1 - elif isinstance(bullet, BotBullet): - # Проверяем столкновение пули бота с стенами - if pygame.sprite.spritecollideany(bullet, walls): - stoneexplosion_sound.play() # Воспроизведение звука взрыва камня - explosion = Explosion(bullet.rect.centerx, bullet.rect.centery) # Создание взрыва камня - all_sprites.add(explosion) # Добавление взрыва камня в группу спрайтов - bullet.kill() # Удаляем пулю бота + tank_hit = pygame.sprite.spritecollideany(bullet, tanks, pygame.sprite.collide_mask) + if tank_hit and isinstance(tank_hit, Tank): + tank_hit.kill() # Удаляем игрока, если попал бот + bullet.kill() # Удаляем пулю + if tank_hit and isinstance(tank_hit, Bot): + tank_hit.kill() # Удаляем бота, если попал игрок + bullet.kill() # Удаляем пулю + respawn_bot() # Пересоздаем бота в случайном месте карты + bullet.update() # Отрисовка фона for i in range(2): @@ -503,10 +393,11 @@ while running: screen.blit(stenki, (1600, 1030)) screen.blit(stenki, (1800, 1030)) + pygame.display.flip() + clock.tick(FPS) - - font = pygame.font.Font(None, 36) - score_text = font.render(f'Score: {score}', True, WHITE) +# Завершение работы Pygame +pygame.quit() screen.blit(score_text, (10, 10)) score_rect = score_text.get_rect(topleft=(10, 10)) pygame.draw.rect(screen, (0, 255, 0), (score_rect.topleft, (score_rect.width, score_rect.height))) # Draw a green rectangle behind the score