diff --git a/main.py b/main.py index aee1d21..c64f77b 100644 --- a/main.py +++ b/main.py @@ -10,6 +10,7 @@ BULLET_SIZE = 20 FPS = 60 BULLET_SPEED = 6 TANK_SPEED = 2 +BOT_SPEED = 2 FIRE_DELAY = 500 # Задержка между выстрелами в миллисекундах WHITE = (255, 255, 255) BLACK = (0, 0, 0) @@ -56,14 +57,21 @@ class Tank(pygame.sprite.Sprite): def shoot(self): current_time = pygame.time.get_ticks() if current_time - self.last_fire_time > FIRE_DELAY: # Проверка задержки между выстрелами - bullet = Bullet(self.rect.centerx, self.rect.centery, self.angle + 270) # Изменено на 90 градусов влево + # Коррекция угла вылета пули, чтобы она вылетала из дула танка + offset_angle = -90 # Угол смещения для вылета пули из дула + corrected_angle = self.angle + offset_angle + + # Вычисляем координаты дула танка + offset_x = 70 * math.cos(math.radians(corrected_angle)) + offset_y = 70 * math.sin(math.radians(corrected_angle)) + bullet = PlayerBullet(self.rect.centerx + offset_x, self.rect.centery + offset_y, self.angle + 270) all_sprites.add(bullet) bullets.add(bullet) self.last_fire_time = current_time # Обновление времени последнего выстрела -# Определение класса снаряда -class Bullet(pygame.sprite.Sprite): +# Определение класса снаряда игрока +class PlayerBullet(pygame.sprite.Sprite): def __init__(self, x, y, angle): super().__init__() self.original_image = bullet_image @@ -78,6 +86,75 @@ class Bullet(pygame.sprite.Sprite): self.kill() +# Определение класса снаряда бота +class BotBullet(pygame.sprite.Sprite): + def __init__(self, x, y, angle): + super().__init__() + self.original_image = bullet_image + self.image = self.original_image + self.rect = self.image.get_rect(center=(x, y)) + self.angle = angle + + def update(self): + self.rect.x += BULLET_SPEED * math.cos(math.radians(self.angle)) + self.rect.y += BULLET_SPEED * math.sin(math.radians(self.angle)) + if not screen.get_rect().colliderect(self.rect): + self.kill() + + +# Определение класса для бота +class Bot(pygame.sprite.Sprite): + def __init__(self, x, y): + super().__init__() + 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) # Случайный начальный угол поворота + self.last_fire_time = pygame.time.get_ticks() # Время последнего выстрела + self.rotate_delay = random.randint(100, 500) # Начальная задержка перед поворотом + self.rotate_timer = 0 + + def update(self): + self.move_random() + self.rotate_random() + self.check_bounds() + #self.shoot_random() + + def move_random(self): + # Движение вперёд в направлении текущего угла поворота + angle_rad = math.radians(self.angle + 270) + self.rect.x += BOT_SPEED * math.cos(angle_rad) + self.rect.y += BOT_SPEED * math.sin(angle_rad) + + def rotate_random(self): + # Случайный поворот бота + self.rotate_timer += 1 + if self.rotate_timer >= self.rotate_delay: + self.angle += random.randint(-10, 10) # Случайный поворот + self.rotate_delay = random.randint(100, 500) # Новая случайная задержка перед поворотом + self.rotate_timer = 0 + + def check_bounds(self): + # Проверка выхода за границы экрана + if self.rect.left < 0: + self.rect.left = 0 + elif self.rect.right > SCREEN_WIDTH: + self.rect.right = SCREEN_WIDTH + if self.rect.top < 0: + self.rect.top = 0 + 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 + + # Создание групп спрайтов all_sprites = pygame.sprite.Group() tanks = pygame.sprite.Group() @@ -88,11 +165,18 @@ player = Tank(SCREEN_WIDTH // 4, SCREEN_HEIGHT // 2) all_sprites.add(player) tanks.add(player) +bot = Bot(3 * SCREEN_WIDTH // 4, SCREEN_HEIGHT // 2) +all_sprites.add(bot) +tanks.add(bot) + # Основной игровой цикл clock = pygame.time.Clock() running = True while running: + player_bullets = [] + bot_bullets = [] + for event in pygame.event.get(): if event.type == pygame.QUIT: running = False @@ -102,6 +186,20 @@ while running: # Обновление всех спрайтов 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): + tank_hit.kill() # Удаляем бота, если попал игрок + bullet.kill() # Удаляем пулю + elif isinstance(bullet, BotBullet): + tank_hit = pygame.sprite.spritecollideany(bullet, tanks, pygame.sprite.collide_mask) + if tank_hit and isinstance(tank_hit, Tank): + tank_hit.kill() # Удаляем игрока, если попал бот + bullet.kill() # Удаляем пулю + bullet.update() + # Отрисовка фона for i in range(2): for j in range(2):