From 8c4941d7ed8391e66b35da22f50970bc2159a72b Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Arsenijs=20=C4=BBu?= <alu.e@rkg.lv>
Date: Sun, 3 Mar 2024 16:08:08 +0000
Subject: [PATCH] Update bla.py

---
 bla.py | 203 +++++++++++++--------------------------------------------
 1 file changed, 47 insertions(+), 156 deletions(-)

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