Инопланетяне не появятся в инопланетном вторжении после устранения.

Вопрос или проблема

Я работаю над игрой, в которой игроки могут уничтожать пришельцев, но я столкнулся с проблемой. После того как я уничтожаю всех пришельцев, новые больше не появляются, что сильно влияет на игровой процесс.

Я пытался самостоятельно решить эту проблему и даже обращался за помощью к ChatGPT, но все равно застрял. Если кто-то сталкивался с похожей ситуацией или имеет предложения о том, как это исправить, я был бы очень благодарен за ваши идеи!

Заранее спасибо за вашу помощь!

`-alien_invasion.py

     import sys
     from time import sleep
     import pygame
     from settings import Settings
     from game_stats import GameStats
     from button import Button
     from ship import Ship
     from bullet import Bullet
     from alien import Alien

class AlienInvasion:

    def __init__(self):
        pygame.init()

        # Начать игру в активном состоянии
        self.game_active = False
        self.clock = pygame.time.Clock()
        self.settings = Settings()

        self.screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN)
        self.settings.screen_width = self.screen.get_rect().width
        self.settings.screen_height = self.screen.get_rect().height
        
        # Создать кнопку игры
        self.play_button = Button(self, "Играть")
        
        pygame.display.set_caption("Нападение пришельцев")
        # Создать экземпляр для хранения статистики игры
        self.stats = GameStats(self)

        self.ship = Ship(self)
        self.ship.rect.y = self.settings.screen_height - self.ship.rect.height  # Установить вертикальное положение корабля

        self.bullets = pygame.sprite.Group()
        self.aliens = pygame.sprite.Group()

        self._create_fleet()
    
    def _create_fleet(self):
        # Создать пришельца
        alien = Alien(self)
        alien_width, alien_height = alien.rect.size

        current_x, current_y = alien_width, alien_height
        while current_y < (self.settings.screen_height - 3 * alien_height):
            while current_x < (self.settings.screen_width - 2 * alien_width):
                self._create_alien(current_x, current_y)
                print(f"Создание пришельца на ({current_x}, {current_y})")
                current_x += 2 * alien_width
            # Завершить ряд
            current_x = alien_width
            current_y += 2 * alien_height

    def _create_alien(self, x_position, y_position):
        # Создать пришельца            
        new_alien = Alien(self)
        new_alien.x = x_position
        new_alien.rect.x = x_position
        new_alien.rect.y = y_position
        self.aliens.add(new_alien)
    
    def _check_fleet_edges(self):
        # Соответствующим образом реагировать на пришельцев, достигших края
        for alien in self.aliens.sprites():
            if alien.check_edges():
                self._change_fleet_direction()
                break
    
    def _change_fleet_direction(self):
        # Опустить весь флот и изменить направление
        for alien in self.aliens.sprites():
            alien.rect.y += self.settings.fleet_drop_speed
        self.settings.fleet_direction *= -1    

    def run_game(self):
        while True:
            self._check_events()

            if self.game_active:
                self.ship.update()
                self._update_bullets()
                self._update_aliens()


            self._update_screen()
            self.clock.tick(60)

    def _check_events(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
            elif event.type == pygame.MOUSEBUTTONDOWN:
                mouse_pos = pygame.mouse.get_pos()
                self._check_play_button(mouse_pos)
            elif event.type == pygame.KEYDOWN:
                self._check_keydown_events(event)
            elif event.type == pygame.KEYUP:
                self._check_keyup_events(event)
    
    def _check_play_button(self, mouse_pos):
        button_clicked = self.play_button.rect.collidepoint(mouse_pos)
        if button_clicked and not self.game_active:
            # Сбросить настройки игры
            self.settings.initialize_dynamic_settings()
            
            # Скрыть курсор мыши
            pygame.mouse.set_visible(False)

            # Сбросить статистику игры:
            self.stats.reset_stats()
            self.game_active = True

            # Избавиться от оставшихся пуль и пришельцев
            self.bullets.empty()
            self.aliens.empty()

            # Создать новый флот и центрировать корабль
            self._create_fleet()
            self.ship.center_ship()

    def _check_keydown_events(self, event):
        # Реагировать на нажатие клавиш
        if event.key == pygame.K_RIGHT:
            self.ship.moving_right = True
        elif event.key == pygame.K_LEFT:
            self.ship.moving_left = True
        if event.key == pygame.K_UP:
            self.ship.moving_up = True
        elif event.key == pygame.K_DOWN:
            self.ship.moving_down = True
        elif event.key == pygame.K_q:
            sys.exit() 
        elif event.key == pygame.K_SPACE:
            self._fire_bullet()

    def _check_keyup_events(self, event):
        # Реагировать на отпускание клавиш
        if event.key == pygame.K_RIGHT:
            self.ship.moving_right = False
        elif event.key == pygame.K_LEFT:
            self.ship.moving_left = False
        if event.key == pygame.K_UP:
            self.ship.moving_up = False
        elif event.key == pygame.K_DOWN:
            self.ship.moving_down = False

    def _update_aliens(self):
        self.aliens.update()
        self._check_fleet_edges()

        # Проверить на столкновение пришельца с кораблем
        if pygame.sprite.spritecollideany(self.ship, self.aliens):
            self._ship_hit()

        # Проверить, достигли ли пришельцы дна
        self._check_aliens_bottom()

    def _fire_bullet(self):
        if len(self.bullets) < self.settings.bullets_allowed:
            new_bullet = Bullet(self)
            self.bullets.add(new_bullet)
    
    def _update_bullets(self):
        """Обновить положение пуль и избавиться от старых пуль."""
        # Обновить положения пуль.
        self.bullets.update()
        for bullet in self.bullets.copy():
            if bullet.rect.bottom <= 0:
                self.bullets.remove(bullet)

        self._check_bullet_alien_collisions()
    
    def _check_bullet_alien_collisions(self):
        # Проверить, попали ли пули в пришельцев
        collisions = pygame.sprite.groupcollide(
                self.bullets, self.aliens, True, True) 

    def _update_screen(self):
        self.screen.fill(self.settings.bg_color)
        for bullet in self.bullets.sprites():
            bullet.draw_bullet()
        self.ship.blitme()
        self.aliens.draw(self.screen)

        # Нарисовать кнопку игры, если игра не активна
        if not self.game_active:
            self.play_button.draw_button()

        pygame.display.flip()

    def _ship_hit(self):
        # Реагировать на удар по кораблю
        if self.stats.ships_left > 0:
            # Уменьшить количество оставшихся кораблей
            self.stats.ships_left -= 1

            # Избавиться от любых пуль 
            self.bullets.empty()
            self.aliens.empty()

            # Создать новый флот
            self._create_fleet()

            self.ship.rect.y = self.settings.screen_height - self.ship.rect.height  # Держите корабль внизу

            # Пауза
            sleep(0.5)
        else:
            self.game_active = False
            pygame.mouse.set_visible(True)

    def _check_aliens_bottom(self):
        # Проверить, достиг ли какой-либо пришелец дна
        for alien in self.aliens.sprites():
            if alien.rect.bottom >= self.settings.screen_height:
                # Считать это как удар по кораблю
                self._ship_hit()
                break

if __name__ == "__main__":
    ai = AlienInvasion()
    ai.run_game()`

alien.py

from typing import Any
import pygame
from pygame.sprite import Sprite

class Alien(Sprite):

    def __init__(self, ai_game):
        #инициализировать пришельца
        super().__init__()
        self.screen = ai_game.screen
        self.settings =ai_game.settings

        #загрузить изображение пришельца
        try:

            self.image = pygame.image.load(r'C:\Users\ianwo\OneDrive\Documentos\Vscode\alien_invasion\images\alien.png')
            self.rect = self.image.get_rect(50,50)
        except pygame.error as e:
            print(f" не удалось загрузить {e}")

        #начать каждого нового пришельца
        self.rect.x =self.rect.width
        self.rect.y =self.rect.height

        #сохранить точное положение пришельца
        self.x =float(self.rect.x)

    def check_edges(self):
        #возвращает true, если пришелец на краю
        screen_rect = self.screen.get_rect()
        return (self.rect.right >= screen_rect.right) or (self.rect.left <= 0)

    def update(self):
        #двигать пришельца вправо
        self.x += self.settings.alien_speed *self.settings.fleet_direction
        self.rect.x = self.x`

Ответ или решение

Ваша проблема заключается в том, что новые пришельцы не появляются после того, как все были уничтожены. Это может сильно повлиять на игровой процесс, и важно решить эту проблему, чтобы повысить удовольствие от игры. Ниже приведены ключевые моменты, которые следует рассмотреть для решения данной проблемы.

Анализ проблемы

  1. Проверка условий появления пришельцев: В коде не указано условие, при котором новые пришельцы должны создаваться после того, как предыдущие были уничтожены. Нужно убедиться, что логика создания пришельцев учитывает, когда текущие пришельцы уничтожены.

  2. Инициализация игры: Когда вся основной логики игры касается состояния игры (self.game_active), убедитесь, что состояние перезапуска игры последовательно создает новую флотилию пришельцев.

Рекомендации по улучшению кода

  1. Добавление метода для создания новой флотилии: Вам нужно вызвать метод создания флотилии после того, как все пришельцы будут уничтожены. Вы можете это сделать, добавив проверку в методе, где вы управляете обновлением врагов.

  2. Использование событий: Если у вас есть система, которая отслеживает, сколько пришельцев осталось живых, вы можете добавить логику, которая создает алиенов при условии, что их не осталось. Например:

    if not self.aliens:
       self._create_fleet()
  3. Вызов создания флотилии после проигрыша или после уничтожения всех пришельцев: В вашей основной логике игры, в методе _update_aliens, добавьте условие, которое будет проверять наличие пришельцев. Если их нет, вызовите метод для их создания:

    def _update_aliens(self):
       self.aliens.update()
       self._check_fleet_edges()
    
       if pygame.sprite.spritecollideany(self.ship, self.aliens):
           self._ship_hit()
    
       self._check_aliens_bottom()
    
       if not self.aliens:  # Если пришельцев не осталось
           self._create_fleet()  # Создайте новую флотилию

Проверка кода

  • Убедитесь, что в ваших настройках (в классе Settings) заданы правильные значения для создания флотилии. Проверьте, правильно ли определяется количество пришельцев.
  • Проверьте, что в методе _create_fleet() созданные пришельцы добавляются в группу self.aliens.

Заключение

После внесения этих изменений игра должна правильно создавать новых пришельцев после их уничтожения. Также убедитесь, что все изменения задокументированы и протестированы, чтобы максимально улучшить игровой процесс. Эти рекомендации помогут не только решить текущую проблему, но и сделают ваш код более читаемым и поддерживаемым. Удачи в разработке игры!

Оцените материал
Добавить комментарий

Капча загружается...