Ejemplo n.º 1
0
def run_game():
    FPS = 60

    # Initialize game, settings and create a screen object.
    pygame.init()
    fps_clock = pygame.time.Clock()
    ai_settings = Settings()

    # FOR THE DQN #

    agent = DQNAgent()
    counter_games = 0
    score_plot = []
    counter_plot = []
    record = 0

    # FOR THE DQN #

    while counter_games < 150:

        # Create statistics.
        stats = GameStats(ai_settings)

        # Create game items.
        game_items = GameItems(ai_settings, stats)

        # Create a fleet of aliens.
        gf.create_fleet(ai_settings, game_items)
        played = False

        gf.start_new_game(ai_settings, stats, game_items)

        # Start the main loop for the game.
        while stats.game_active:
            stats.time_passed = fps_clock.tick(FPS) / 1000  # Time in seconds since previous loop.

            gf.check_events(ai_settings, stats, game_items)

            if stats.game_active:
                game_items.ship.update(stats)
                gf.update_bullets(ai_settings, stats, game_items)
                gf.update_aliens(ai_settings, stats, game_items)
                # FOR THE DQN #
                agent.epsilon = 80 - counter_games
                state_old = gf.get_state(ai_settings, stats, game_items)
                if randint(0, 200) < agent.epsilon:
                    final_move = to_categorical(randint(0, 3), num_classes=4)
                else:
                    # predict action based on the old state
                    prediction = agent.model.predict(state_old.reshape((1, 3536)))
                    final_move = to_categorical(np.argmax(prediction[0]), num_classes=4)

                # FOR THE DQN #

                # DQN #
                # perform new move and get new state
                gf.do_move(final_move, ai_settings, stats, game_items)


                state_new = gf.get_state(ai_settings, stats, game_items)

                # set reward for the new state
                reward = agent.set_reward(stats.score, stats.ships_left)

                # train short memory base on the new action and state
                agent.train_short_memory(state_old, final_move, reward, state_new, stats.game_active)

                # store the new data into a long term memory
                # TO:DO  agent.remember(state_old, final_move, reward, state_new, game.crash)
                # Get value of played game
                # TO:DO record = get_record(game.score, record)
                # DQN #
                
                
                played = True
            elif played:
                user = ask(game_items.screen)
                if len(user) > 0:
                    coll = connect_and_collect()
                    add_score(user , stats.score, coll)
                played = False

            # gf.update_screen(ai_settings, stats, game_items)


        # FOR THE DQN #
        agent.replay_new(agent.memory)
        counter_games += 1
        print('Game', counter_games, '      Score:', stats.score)
        score_plot.append(stats.score)
        counter_plot.append(counter_games)
    agent.model.save_weights('weights.hdf5')
    plot_seaborn(counter_plot, score_plot)
class AlienInvasion:
    """Overall class to manage game assets and behavior."""
    def __init__(self):
        """Initialize the game, and create game resources."""
        pygame.init()  #初始化所有Pygame模块,主要为了安全
        self.settings = Settings()  #创建一个Settings类的实例,这样在程序中就可以引用Settings中的属性了

        # self.screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN) # display 是一个模块,set_mode 是该模块内部的功能,创建了Pygame.Surface该类的实例,并返回该实例。
        self.screen = pygame.display.set_mode((1200, 800))
        self.settings.screen_width = self.screen.get_rect().width
        self.settings.screen_height = self.screen.get_rect().height

        pygame.display.set_caption("Alien Invasion")  # 创建窗口的标题栏

        # Create an instance to store game statistics and create a scoreboard.
        self.stats = GameStats(self)
        self.sb = Scoreboard(self)
        self.ship = Ship(self)  #创建战舰这个类的实例
        self.bullets = pygame.sprite.Group()
        self.aliens = pygame.sprite.Group()
        self._create_fleet()

        # Make the play button.
        self.play_button = Button(self, "Play")

    def _ship_hit(self):
        """Respond to the ship being hit by an alien."""
        if self.stats.ships_left > 0:
            # Decrement ship_left.
            self.stats.ships_left -= 1
            self.aliens.empty()
            self.bullets.empty()

            self._create_fleet()
            self.ship.center_ship()
            sleep(0.5)
        else:
            self.stats.game_active = False
            pygame.mouse.set_visible(True)

    def _create_fleet(self):
        """Create the fleet of aliens."""
        # Create an alien and find the number of aliens in a row.
        # Spacing between each alien is equal to one alien width.
        alien = Alien(self)
        alien_width, alien_height = alien.rect.size
        available_space_x = self.settings.screen_width - (2 * alien_width)
        number_aliens_x = available_space_x // (2 * alien_width)

        # Determine the number of rows of aliens that fit on the screen.
        ship_height = self.ship.rect.height
        available_space_y = (self.settings.screen_height - (3 * alien_height) -
                             ship_height)
        number_rows = available_space_y // (2 * alien_height)

        # Create the full fleet of aliens.
        for row_number in range(number_rows):
            for alien_number in range(number_aliens_x):
                self._create_alien(alien_number, row_number)

    def _create_alien(self, alien_number, row_number):
        """Create an alien and place it in the row."""
        alien = Alien(self)
        alien_width, alien_height = alien.rect.size
        alien.x = alien_width + 2 * alien_width * alien_number
        alien.rect.x = alien.x
        alien.rect.y = alien.rect.height + 2 * alien.rect.height * row_number
        self.aliens.add(alien)

    def run_game(self):
        """Start the main loop for the game"""
        while True:
            self._check_events()

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

    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_aliens_bottom(self):
        """Check if any aliens have reached the bottom of the screen."""
        screen_rect = self.screen.get_rect()
        for alien in self.aliens.sprites():
            if alien.rect.bottom >= screen_rect.bottom:
                self._ship_hit()
                break

    def _check_bullet_alien_collisions(self):
        """ Respond to bullet-alien collision."""
        #Remove any bullets and aliens that have collided.
        collisions = pygame.sprite.groupcollide(self.bullets, self.aliens,
                                                True, True)
        if collisions:
            for aliens in collisions.values():
                self.stats.score += self.settings.alien_points * len(aliens)
            self.sb.prep_score()
            self.sb.check_high_score()
        if not self.aliens:
            self.bullets.empty()
            self._create_fleet()
            self.settings.increase_speed()

    def _update_aliens(self):
        """Update the positions of all aliens in the fleet."""
        self._check_fleet_edges()
        self.aliens.update()
        # Look for alien-ship collisions.
        if pygame.sprite.spritecollideany(self.ship, self.aliens):
            self._ship_hit()
        self._check_aliens_bottom()

    def _check_fleet_edges(self):
        """Respond appropriately if any aliens have reched an edge."""
        for alien in self.aliens.sprites():
            if alien.check_edges():
                self._change_fleet_directions()
                break

    def _change_fleet_directions(self):
        """Drop the entire fleet and change the fleet's direction."""
        for alien in self.aliens.sprites():
            alien.rect.y += self.settings.fleet_drop_speed
        self.settings.fleet_direction *= -1

    def _check_events(self):
        # Watch for keyboard and mouse events.
        for event in pygame.event.get():  # pygame.event.get()返回事件的列表
            if event.type == pygame.QUIT:
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                self._check_keydown_events(event)
            elif event.type == pygame.KEYUP:
                self._check_keyup_events(event)
            elif event.type == pygame.MOUSEBUTTONDOWN:
                mouse_pos = pygame.mouse.get_pos()
                self._check_play_button(mouse_pos)

    def _check_play_button(self, mouse_pos):
        """Start a new game when the player clicks Play."""
        button_clicked = self.play_button.rect.collidepoint(mouse_pos)
        if button_clicked and not self.stats.game_active:
            # Reset the game settings.
            self.settings.initialize_dynamic_settings()
            self.stats.reset_stats()
            self.stats.game_active = True
            self.sb.prep_score()
            # Hide the mouse cursor.
            pygame.mouse.set_visible(False)

            # Get rid of any remaining aliens and bullets.
            self.aliens.empty()
            self.bullets.empty()

            # Create a new fleet and center the ship.
            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
        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

    def _fire_bullet(self):
        """Creat a new bullet and add it to the bullets group."""
        if len(self.bullets) < self.settings.bullets_allowed:
            new_bullet = Bullet(self)
            self.bullets.add(new_bullet)

    def _update_screen(self):
        # Redraw the screen during each pass through the loop.
        self.screen.fill(self.settings.bg_color)
        self.ship.blitme()
        for bullet in self.bullets.sprites():
            bullet.draw_bullet()
        self.aliens.draw(self.screen)
        # Draw the score information
        self.sb.show_score()
        # Draw the play button if the game is inactive.
        if not self.stats.game_active:
            self.play_button.draw_button()
        # Make the most recently drawn screen visible.
        pygame.display.flip()
Ejemplo n.º 3
0
class AlienInvasion:
    """Overall class to manage game assets and behavior."""
    def __init__(self):
        """Initialize the game and create game resources."""
        pygame.init()
        self.count = 0
        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
        pygame.display.set_caption("Alien Invasion (press 'CTRL + x' to quit)")

        # Create an instance to store game statistics and create a scoreboard.
        self.stats = GameStats(self)
        self.sb = Scoreboard(self)

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

        # Make the Play button.
        self.play_button = Button(self, "Play")

    def run_game(self):
        """Start the main loop for the game."""
        pygame.mixer.Sound.play(self.settings.welcome)
        while True:
            self._check_events()  # Calls helper method

            if self.stats.game_active:
                self.ship.update(
                )  # Updates ship's position based on user events
                self._update_bullets(
                )  # Updates the bullet's position when fired
                self._update_aliens()  # Updates the alien fleet

            self._update_screen()  # Calls helper method

    def _check_events(self):
        """Listen and respond to key presses and mouse events."""
        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):
        """Start a new game when the player clicks Play button."""
        button_clicked = self.play_button.rect.collidepoint(mouse_pos)
        if button_clicked and not self.stats.game_active:
            # Reset the game settings.
            self.settings.initialize_dynamic_settings()
            self.stats.reset_stats()
            self.stats.game_active = True
            self.sb.prep_score()
            self.sb.prep_level()
            self.sb.prep_ships()

            # Get rid of any remaining aliens and bullets.
            self.aliens.empty()
            self.bullets.empty()

            # Create a new fleet and center the ship.
            self._create_fleet()
            self.ship.center_ship()

            # Hide mouse cursor.
            pygame.mouse.set_visible(False)

    def _check_keydown_events(self, event):
        """Respond to key press down events."""
        if event.key == pygame.K_d:
            self.ship.moving_right = True
        elif event.key == pygame.K_a:
            self.ship.moving_left = True
        elif event.key == pygame.K_w:
            self.ship.moving_up = True
        elif event.key == pygame.K_s:
            self.ship.moving_down = True
        elif event.key == (pygame.key.get_mods() & pygame.KMOD_CTRL
                           and pygame.K_x):
            sys.exit()
        elif event.key == pygame.K_SPACE:
            self._fire_bullet()

    def _check_keyup_events(self, event):
        """Respond to key up events."""
        if event.key == pygame.K_d:
            self.ship.moving_right = False
        elif event.key == pygame.K_a:
            self.ship.moving_left = False
        elif event.key == pygame.K_w:
            self.ship.moving_up = False
        elif event.key == pygame.K_s:
            self.ship.moving_down = False

    def _fire_bullet(self):
        """Create a new bullet and add it to the bullets group."""
        pygame.mixer.Sound.play(self.settings.shoot_sound)
        if len(self.bullets) < self.settings.bullets_allowed:
            new_bullet = Bullet(self)
            self.bullets.add(new_bullet)

    def _update_bullets(self):
        """Update position of bullets and get rid of old bullets."""
        # Update bullet positions.
        self.bullets.update()  # Updates the bullet's position

        # Get rid of bullets that have disappeared.
        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):
        """Respond to bullet-alien collisions."""
        # Remove any bullets and aliens that have collided.
        collisions = pygame.sprite.groupcollide(self.bullets, self.aliens,
                                                True, True)
        if collisions:
            pygame.mixer.Sound.play(self.settings.hit)
            for aliens in collisions.values():
                self.stats.score += self.settings.alien_points * len(aliens)
            self.sb.prep_score()
            self.sb.check_high_score()

        if not self.aliens:
            # Destroy existing bullets and create new fleet.
            self.bullets.empty()
            self._create_fleet()
            self.settings.increase_difficulty()

            # Increase level.
            self.stats.level += 1
            self.sb.prep_level()

    def _ship_hit(self):
        """Respond to the ship being hit by an alien."""
        if self.stats.ships_left > 0:
            # Decrement ships_left and update scoreboard.
            self.stats.ships_left -= 1
            self.sb.prep_ships()

            # Get rid of any remaining aliens and bullets.
            self.aliens.empty()
            self.bullets.empty()

            # Create a new fleet and center the ship.
            self._create_fleet()
            self.ship.center_ship()

            # Pause.
            sleep(0.5)
        else:
            self.stats.game_active = False
            pygame.mouse.set_visible(True)
            self.count = 0
            pygame.mixer.Sound.play(self.settings.game_over)

    def _check_aliens_bottom(self):
        """Check if any aliens have reached the bottom of the screen."""
        screen_rect = self.screen.get_rect()
        for alien in self.aliens.sprites():
            if alien.rect.bottom >= screen_rect.bottom:
                # Treat this the same as if the ship got hit.
                self._ship_hit()
                pygame.mixer.Sound.play(self.settings.ship_explode)
                break

    def _update_aliens(self):
        """
        Check if the fleet is at the edge then update the positions in the
        fleet.
        """
        self._check_fleet_edges()
        self.aliens.update()

        # Look for alien-ship collisions.
        if pygame.sprite.spritecollideany(self.ship, self.aliens):
            pygame.mixer.Sound.play(self.settings.ship_explode)
            self.count -= 1
            self._ship_hit()

        # Look for aliens hitting the bottom of the screen.
        self._check_aliens_bottom()

    def _create_fleet(self):
        """Create the fleet of aliens."""
        self.count += 1
        if self.count == 1 and self.stats.game_active:
            pygame.mixer.Sound.play(self.settings.round_one)
            sleep(1.5)
        elif self.count == 2:
            pygame.mixer.Sound.play(self.settings.round_two)
        elif self.count == 3:
            pygame.mixer.Sound.play(self.settings.round_three)
        elif self.count > 3:
            pygame.mixer.Sound.play(self.settings.haha)
        # Create an alien and find the number of aliens in a row.
        # Spacing between each alien is equal to one alien width.
        alien = Alien(self)
        alien_width, alien_height = alien.rect.size
        available_space_x = self.settings.screen_width - (2 * alien_width)
        number_aliens_x = available_space_x // (2 * alien_width)

        # Determine the number of rows of aliens that fit on the screen.
        ship_height = self.ship.rect.height
        available_space_y = (self.settings.screen_height - (4 * alien_height) -
                             ship_height)
        number_rows = available_space_y // (2 * alien_height)

        # Create the full fleet of aliens
        for row_number in range(number_rows):
            for alien_number in range(number_aliens_x):
                self._create_alien(alien_number, row_number)

    def _create_alien(self, alien_number, row_number):
        """Create an alien and place it in the row."""
        alien = Alien(self)
        alien_width, alien_height = alien.rect.size
        alien.x = alien_width + 2 * alien_width * alien_number
        alien.rect.x = alien.x
        alien.rect.y = alien.rect.height + 2 * alien.rect.height * row_number
        self.aliens.add(alien)

    def _check_fleet_edges(self):
        """Respond appropriately if any aliens have reached an edge."""
        for alien in self.aliens.sprites():
            if alien.check_edges():
                self._change_fleet_direction()
                break

    def _change_fleet_direction(self):
        """Drop the entire fleet and change the fleet's direct."""
        for alien in self.aliens.sprites():
            alien.rect.y += self.settings.fleet_drop_speed
        self.settings.fleet_direction *= -1

    def _update_screen(self):
        """Update images on screen and flip to show newest screen."""
        self.screen.fill(self.settings.bg_color)
        self.ship.blitme()
        for bullet in self.bullets.sprites():
            bullet.draw_bullet()
        self.aliens.draw(self.screen)

        # Draw the score information.
        self.sb.show_score()

        # Draw the play button if the game is inactive.
        if not self.stats.game_active:
            self.play_button.draw_button()

        # Make the most recently drawn screen visible.
        pygame.display.flip()
Ejemplo n.º 4
0
class AlienInvasion:
    def __init__(self):
        pygame.init()
        self.settings = Settings()
        self.screen = pygame.display.set_mode(
            (self.settings.screen_width, self.settings.screen_height))
        pygame.display.set_caption('Alien Invasion')
        self.stats = GameStats(self)
        self.sb = Scoreboard(self)
        self.ship = Ship(self)
        self.bullets = pygame.sprite.Group()
        self.aliens = pygame.sprite.Group()
        self._create_fleet()
        self.play_button = Button(self, "Play")

    def run_game(self):
        while True:
            self._check_events()
            if self.stats.game_active:
                self.ship.update()
                self._update_bullets()
                self._update_aliens()
            self._update_screen()

    def _check_events(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                self._check_keydown_events(event)
            elif event.type == pygame.KEYUP:
                self._check_keyup_events(event)
            elif event.type == pygame.MOUSEBUTTONDOWN:
                mouse_pos = pygame.mouse.get_pos()
                self._check_play_button(mouse_pos)

    def _check_play_button(self, mouse_pos):
        button_clicked = self.play_button.rect.collidepoint(mouse_pos)
        if button_clicked and not self.stats.game_active:
            self.stats.reset_stats()
            self.stats.game_active = True
            self.sb.prep_score()
            self.sb.prep_level()
            self.sb.prep_ships()

            self.aliens.empty()
            self.bullets.empty()

            self._create_fleet()
            self.ship.center_ship()

            pygame.mouse.set_visible(False)
            self.settings.initialize_dynamic_settings()

    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
        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

    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)
        if collisions:
            for aliens in collisions.values():
                self.stats.score += self.settings.alien_points * len(aliens)
                self.sb.prep_score()
                self.sb.check_high_score()
        if not self.aliens:
            self.bullets.empty()
            self._create_fleet()
            self.settings.increase_speed()
            self.stats.level += 1
            self.sb.prep_level()

    def _create_fleet(self):
        alien = Alien(self)
        alien_width, alien_height = alien.rect.size
        available_space_x = self.settings.screen_width - (2 * alien_width)
        number_aliens_x = available_space_x // (2 * alien_width)

        ship_height = self.ship.rect.height
        available_space_y = (self.settings.screen_height - (5 * alien_height) -
                             ship_height)
        number_rows = available_space_y // (2 * alien_height)
        for row_number in range(number_rows):
            for alien_number in range(number_aliens_x):
                self._create_alien(alien_number, row_number)

    def _create_alien(self, alien_number, row_number):
        alien = Alien(self)
        alien_width, alien_height = alien.rect.size
        alien.x = alien_width + 2 * alien_width * alien_number
        alien.rect.x = alien.x
        alien.rect.y = alien.rect.height + 2 * alien.rect.height * row_number
        self.aliens.add(alien)

    def _update_aliens(self):
        self._check_fleet_edges()
        self.aliens.update()
        if pygame.sprite.spritecollideany(self.ship, self.aliens):
            self._ship_hit()
        self._check_aliens_bottom()

    def _check_fleet_edges(self):
        for alien in self.aliens.sprites():
            if alien.check_edges():
                self._change_fleet_direction()
                break

    def _check_aliens_bottom(self):
        screen_rect = self.screen.get_rect()
        for alien in self.aliens.sprites():
            if alien.rect.bottom >= screen_rect.bottom:
                self._ship_hit()
                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 _ship_hit(self):
        if self.stats.ships_left > 0:
            self.stats.ships_left -= 1
            self.sb.prep_ships()
            self.aliens.empty()
            self.bullets.empty()
            self._create_fleet()
            self.ship.center_ship()
            sleep(0.5)
        else:
            self.stats.game_active = False
            pygame.mouse.set_visible(True)

    def _update_screen(self):
        self.screen.fill(self.settings.bg_color)
        self.ship.blitme()
        for bullet in self.bullets.sprites():
            bullet.draw_bullet()
        self.aliens.draw(self.screen)
        if not self.stats.game_active:
            self.play_button.draw_button()
        self.sb.show_score()
        pygame.display.flip()
Ejemplo n.º 5
0
def run_game():
    pygame.init()
    ai_settings = Settings()
    #pygame.display.set_mode返回一个surface对象
    screen = pygame.display.set_mode(
        (ai_settings.screen_width, ai_settings.screen_height))
    bullet_sound = pygame.mixer.Sound('sound/bullet.wav')
    bullet_sound.set_volume(0.3)
    pygame.mixer.music.load('sound/game_music.wav')
    pygame.mixer.music.play(-1, 0.0)
    pygame.mixer.music.set_volume(0.25)
    enemy1_down_sound = pygame.mixer.Sound("sound/enemy1_down.wav")
    enemy2_down_sound = pygame.mixer.Sound("sound/enemy2_down.wav")
    enemy3_down_sound = pygame.mixer.Sound("sound/enemy3_down.wav")
    game_over_sound = pygame.mixer.Sound('sound/game_over.wav')
    enemy1_down_sound.set_volume(0.3)
    enemy2_down_sound.set_volume(0.4)
    enemy3_down_sound.set_volume(0.5)
    game_over_sound.set_volume(0.3)
    shoot_frequency = 0
    enemy_frequency = 0
    background = pygame.image.load("images\\background_1.png").convert()
    _game_over = pygame.image.load('images/gameover.png')
    game_over = pygame.transform.scale(_game_over, (320, 568))
    pygame.display.set_caption("plane_war")
    play_button = Button(ai_settings, screen, "play")
    stats = GameStats(ai_settings)
    s = Score(ai_settings, screen, stats)
    plane = Plane(ai_settings, screen)
    bullets = Group()
    framerate = pygame.time.Clock()
    Heroplane = Mysprite(screen)
    Heroplane.load("images//hero_plane_1.png", 66, 80, 2)
    group = pygame.sprite.Group()
    group.add(Heroplane)
    enemys = Group()
    middle = Group()
    middle_frequency = 0
    enemies_down = pygame.sprite.Group()
    breakplane = Group()
    middle_down = pygame.sprite.Group()
    bosses = Group()
    break_boss = Group()
    delay = 0
    delay_1 = 0
    delay_2 = 0
    delay_3 = 0
    while True:
        framerate.tick(60)
        #blit用于在screen上绘制图像
        screen.blit(background, (0, 0))
        gf.check_events(ai_settings, screen, stats, play_button, plane, enemys,
                        bullets, bullet_sound, s)
        if stats.game_active and not stats.boss_state:
            plane.update()
            middle.update()
            gf.update_bullets(ai_settings, screen, plane, enemys, bullets,
                              stats, s, shoot_frequency, enemies_down,
                              enemy1_down_sound, middle, middle_down,
                              enemy2_down_sound, bosses, break_boss,
                              enemy3_down_sound)
            gf.update_enemys(ai_settings, stats, screen, plane, enemys,
                             bullets, s, play_button, breakplane,
                             game_over_sound, enemies_down, middle,
                             middle_down, bosses)
            if enemy_frequency % 60 == 0 and len(
                    enemys) < ai_settings.min_enemy_number:
                gf.create_fleet(ai_settings, screen, plane, enemys)
            else:
                enemy_frequency += 1
            if middle_frequency % 100 == 0 and len(
                    middle) < ai_settings.min_middle_number:
                gf.create_middle_enemys(ai_settings, screen, middle)
            else:
                middle_frequency += 1
        if stats.game_active and stats.boss_state:
            plane.update()
            gf.update_bullets(ai_settings, screen, plane, enemys, bullets,
                              stats, s, shoot_frequency, enemies_down,
                              enemy1_down_sound, middle, middle_down,
                              enemy2_down_sound, bosses, break_boss,
                              enemy3_down_sound)
            gf.update_bosses(ai_settings, plane, breakplane, stats, s,
                             game_over_sound, play_button, bosses)
            if (len(bosses) <= 0):
                gf.create_boss(ai_settings, screen, bosses)
            bosses.update()
        if not stats.game_active and stats.game_state:
            enemys.empty()
            bullets.empty()
            screen.blit(game_over, (0, 0))
        for planes in breakplane:
            if delay < 10:
                planes.image = pygame.image.load("images\\hero_break1.png")
                delay += 1
            elif delay < 20:
                planes.image = pygame.image.load("images\\hero_break2.png")
                delay += 1
            elif delay < 30:
                planes.image = pygame.image.load("images\\hero_break3.png")
                delay += 1
            elif delay < 40:
                planes.image = pygame.image.load("images\\hero_break4.png")
                delay += 1
            screen.blit(planes.image, plane.rect)
            if delay >= 40:
                delay = 0
                breakplane.remove(plane)
        for enemy_down in enemies_down:
            if delay_1 < 10:
                enemy_down.image = pygame.image.load("images\\enemy1_1.png")
                delay_1 += 1
            elif delay_1 < 20:
                enemy_down.image = pygame.image.load("images\\enemy1_2.png")
                delay_1 += 1
            elif delay_1 < 30:
                enemy_down.image = pygame.image.load("images\\enemy1_3.png")
                delay_1 += 1
            elif delay_1 < 40:
                enemy_down.image = pygame.image.load("images\\enemy1_4.png")
                delay_1 += 1

            screen.blit(enemy_down.image, enemy_down.rect)
            if delay_1 >= 40:
                delay_1 = 0
                enemies_down.remove(enemy_down)
        for mi_down in middle_down:
            if delay_2 < 10:
                mi_down.image = pygame.image.load("images\\middle_1.png")
                delay_2 += 1
            elif delay_2 < 20:
                mi_down.image = pygame.image.load("images\\middle_2.png")
                delay_2 += 1
            elif delay_2 < 30:
                mi_down.image = pygame.image.load("images\\middle_3.png")
                delay_2 += 1
            elif delay_2 < 40:
                mi_down.image = pygame.image.load("images\\middle_4.png")
                delay_2 += 1

            screen.blit(mi_down.image, mi_down.rect)
            if delay_2 >= 40:
                delay_2 = 0
                middle_down.remove(mi_down)
        for boss_down in break_boss:
            if delay_3 < 10:
                boss_down.image = pygame.image.load("images\\boss_1.png")
                delay_3 += 1
            elif delay_3 < 20:
                boss_down.image = pygame.image.load("images\\boss_2.png")
                delay_3 += 1
            elif delay_3 < 30:
                boss_down.image = pygame.image.load("images\\boss_3.png")
                delay_3 += 1
            elif delay_3 < 40:
                boss_down.image = pygame.image.load("images\\boss_4.png")
                delay_3 += 1
            elif delay_3 < 50:
                boss_down.image = pygame.image.load("images\\boss_4.png")
                delay_3 += 1
            elif delay_3 < 60:
                boss_down.image = pygame.image.load("images\\boss_4.png")
                delay_3 += 1

            screen.blit(boss_down.image, boss_down.rect)
            if delay_3 >= 60:
                delay_3 = 0
                break_boss.remove(boss_down)
        gf.update_screen(ai_settings, screen, stats, plane, enemys, bullets,
                         play_button, s, middle, bosses)

        pygame.display.update()
Ejemplo n.º 6
0
def run_game():
    # Initializes background setting needed to run properly
    pygame.init()

    # Initializes settings
    ai_settings = Settings()

    # Creates a display window where all of the game's graphic elements are drawn
    # The numbers represent the dimensions of the window
    screen = pygame.display.set_mode(
        (ai_settings.screen_width, ai_settings.screen_height))
    pygame.display.set_caption("Alien Invasion")

    # Delay time
    delay = 0
    timer = random.randint(400, 1001)

    # Create an instance to store game statistics amd create a scoreboard
    stats = GameStats(ai_settings)
    sb = Scoreboard(ai_settings, screen, stats)

    # Makes a ship, group of bullets, alien bullets, group of aliens, and ufos
    ship = Ship(ai_settings, screen, stats)
    bunkers = Group()
    bullets = Group()
    aliens_1 = Group()
    aliens_2 = Group()
    aliens_3 = Group()
    alien_bullets = Group()
    ufo = Group()

    # Make the play button that also contains the startup screen
    play_button = Button(screen, "Play", ai_settings, alien_bullets, stats)
    score_button = ScoreButton(screen, "High Scores", ai_settings)
    back_button = ScoreButton(screen, "Back (B)", ai_settings)

    # Starts the main loop for the game
    while True:
        # Checks for any type of event
        gf.check_events(ai_settings, screen, stats, sb, play_button, score_button, ship, aliens_1,
                        aliens_2, aliens_3, ufo, bullets, alien_bullets, bunkers)

        # Creates a new UFO at a random interval
        # Delay to prevent too many from spawning at once
        if delay == timer:
            gf.create_ufo(ai_settings, screen, ufo, alien_bullets, stats)
            # plays ufo sound
            ai_settings.ufo_sound.play()
            delay = 0
            timer = random.randint(700, 1001)
        else:
            delay += 1

        # Runs the game is active
        if stats.game_active:
            ship.update()

            gf.update_bullets(ai_settings, screen, stats, sb, ship, aliens_1, aliens_2, aliens_3,
                              ufo, bullets, alien_bullets, bunkers)
            gf.update_aliens(ai_settings, screen, stats, sb, ship, aliens_1, aliens_2, aliens_3,
                             ufo, bullets, alien_bullets, bunkers)
            gf.update_ufo(ai_settings, screen, stats, sb, ship, aliens_1, aliens_2, aliens_3,
                          ufo, bullets, alien_bullets, bunkers)
        # Manages the screen updates
        gf.update_screen(ai_settings, screen, stats, sb, ship, aliens_1, aliens_2, aliens_3, ufo,
                         bullets, alien_bullets, bunkers, play_button, score_button, back_button)
Ejemplo n.º 7
0
class AlienInvasion:
    """Overall class to manage game assets and behavior."""
    def __init__(self):
        """Initialize the game, and create game resources."""
        pygame.init()
        self.settings = Settings()

        # Window mode
        # self.screen = pygame.display.set_mode(
        #     (self.settings.screen_width, self.settings.screen_height))

        # Full screen mode
        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
        pygame.display.set_caption("Alien Invasion")

        #Create instances to store statistics and results pane.
        self.stats = GameStats(self)
        self.sb = Scoreboard(self)

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

        self._create_fleet()

        # Create a Play button.
        self.play_button = Button(self, "Play")

    def run_game(self):
        """Start the main loop for the game."""
        while True:
            self._check_events()

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

            self._update_screen()

    def _check_events(self):
        # Watch for keyboard and mouse events.
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                self._check_keydown_events(event)
            elif event.type == pygame.KEYUP:
                self._check_keyup_event(event)
            elif event.type == pygame.MOUSEBUTTONDOWN:
                mouse_pos = pygame.mouse.get_pos()
                self._check_play_button(mouse_pos)

    def _check_play_button(self, mouse_pos):
        """Launches a new game when the Play button is pressed."""
        button_clicked = self.play_button.rect.collidepoint(mouse_pos)
        if button_clicked and not self.stats.game_active:
            # Reset game settings.
            self.settings.initialize_dynamic_settings()

            # Reset game statistics.
            self.stats.reset_stats()
            self.stats.game_active = True
            self.sb.prep_score()
            self.sb.prep_level()
            self.sb.prep_ships()

            # Clearing the lists of aliens and projectiles.
            self.aliens.empty()
            self.bullets.empty()

            # Create a new fleet and place the ship in the center.
            self._create_fleet()
            self.ship.center_ship()

            # The mouse pointer is hidden.
            pygame.mouse.set_visible(False)

    def _check_keydown_events(self, event):
        """Reacts to keystrokes."""
        if event.key == pygame.K_RIGHT:
            self.ship.moving_right = True
        elif event.key == pygame.K_LEFT:
            self.ship.moving_left = True
        elif event.key == pygame.K_SPACE:
            self._fire_bullet()
        elif event.key == pygame.K_q:
            sys.exit()

    def _fire_bullet(self):
        """Create a new bullet and add to bullets group"""
        if len(self.bullets) < self.settings.bullets_allowed:
            new_bullet = Bullet(self)
            self.bullets.add(new_bullet)

    def _check_keyup_event(self, event):
        """Reacts when keys are released."""
        if event.key == pygame.K_RIGHT:
            self.ship.moving_right = False
        elif event.key == pygame.K_LEFT:
            self.ship.moving_left = False

    def _create_fleet(self):
        """Create alien fleet."""
        # Create alien and calculating the number of aliens in a row
        # The spacing between adjacent aliens is equal to the alien's width.
        alien = Alien(self)
        alien_width, alien_height = alien.rect.size
        available_space_x = self.settings.screen_width - (2 * alien_width)
        number_aliens_x = available_space_x // (2 * alien_width)
        """Determines the number of rows that fit on the screen."""
        ship_height = self.ship.rect.height
        available_space_y = (self.settings.screen_height - (3 * alien_height) -
                             ship_height)
        number_rows = available_space_y // (2 * alien_height)

        # Create alien fleet
        for row_number in range(number_rows):
            for alien_number in range(number_aliens_x):
                self._create_alien(alien_number, row_number)

    def _create_alien(self, alien_number, row_number):
        """Create alien and place in row."""
        alien = Alien(self)
        alien_width, alien_height = alien.rect.size
        alien_width = alien.rect.width
        alien.x = alien_width + 2 * alien_width * alien_number
        alien.rect.x = alien.x
        alien.rect.y = alien.rect.height + 2 * alien.rect.height * row_number
        self.aliens.add(alien)

    def _check_fleet_edges(self):
        """Reacts when an alien reaches the edge of the screen."""
        for alien in self.aliens.sprites():
            if alien.check_edges():
                self._change_fleet_direction()
                break

    def _change_fleet_direction(self):
        """Drops the entire fleet and changes the direction of the fleet."""
        for alien in self.aliens.sprites():
            alien.rect.y += self.settings.fleet_drop_speed
        self.settings.fleet_direction *= -1

    def _update_bullets(self):
        """Refresh bullets position and remove the old bullets"""
        # Refresh bullets position
        self.bullets.update()

        # Delete bullets, that went off-screen
        for bullet in self.bullets.copy():
            if bullet.rect.bottom <= 0:
                self.bullets.remove(bullet)

        self._check_bullet_alien_collisions()

    def _update_aliens(self):
        """Checks if the fleet has reached the edge of the screen, and then updates the position of all aliens in the fleet.."""
        self._check_fleet_edges()
        self.aliens.update()

        # Checking collisions "alien - ship".
        if pygame.sprite.spritecollideany(self.ship, self.aliens):
            self._ship_hit()

        # Check if the aliens have reached the bottom edge of the screen.
        self._check_aliens_bottom()

    def _check_bullet_alien_collisions(self):
        """Handling collisions between bullets and aliens."""
        # Removal of projectiles and aliens involved in collisions.
        collisions = pygame.sprite.groupcollide(self.bullets, self.aliens,
                                                True, True)

        if collisions:
            for aliens in collisions.values():
                self.stats.score += self.settings.alien_points * len(aliens)
            self.sb.prep_score()
            self.sb.check_high_score()

        if not self.aliens:
            # Destruction of existing shells and creation of a new fleet.
            self.bullets.empty()
            self._create_fleet()
            self.settings.increase_speed()

            # level up.
            self.stats.level += 1
            self.sb.prep_level()

    def _ship_hit(self):
        """Handles a collision between a ship and an alien."""
        if self.stats.ships_left > 0:
            # Decrease ships_left and update scoreboard.
            self.stats.ships_left -= 1
            self.sb.prep_ships()

            # Clearing the lists of aliens and bullets.
            self.aliens.empty()
            self.bullets.empty()

            # Create a new fleet and place the ship in the center.
            self._create_fleet()
            self.ship.center_ship()

            # Pause.
            sleep(0.5)
        else:
            self.stats.game_active = False
            pygame.mouse.set_visible(True)

    def _check_aliens_bottom(self):
        """Checks if the aliens have made it to the bottom of the screen."""
        screen_rect = self.screen.get_rect()
        for alien in self.aliens.sprites():
            if alien.rect.bottom >= screen_rect.bottom:
                # What happens is the same as in a collision with a ship.
                self._ship_hit()
                break

    def _update_screen(self):
        # Redraw the screen during each pass through the loop.
        self.screen.fill(self.settings.bg_color)
        self.ship.blitme()
        for bullet in self.bullets.sprites():
            bullet.draw_bullet()
        self.aliens.draw(self.screen)

        # Displaying information about the account.
        self.sb.show_score()

        # The Play button is displayed if the game is inactive.
        if not self.stats.game_active:
            self.play_button.draw_button()

        # Make the most recently drawn screen visible.
        pygame.display.flip()

        # Framerate
        clock.tick(30)
Ejemplo n.º 8
0
def run_game():
    # initialize pygame, clock, settings, and screen objects
    pygame.init()
    clock = pygame.time.Clock()
    p_settings = Settings()
    screen = pygame.display.set_mode(
        (p_settings.screen_width, p_settings.screen_height))
    screen_rect = screen.get_rect()
    pygame.display.set_caption("Pong")

    # create the game over message
    play_button = Button(screen, "Play")

    # Create an instance to store game statistics, and a scoreboard.
    stats = GameStats(p_settings)
    sb = Scoreboard(p_settings, screen, stats)

    # set the background color
    bg_color = (230, 230, 230)

    # make a paddle
    paddle_right = Paddle(p_settings, screen, 'right', 'vert')
    paddle_left = Paddle(p_settings, screen, 'left', 'vert')
    paddle_tr = Paddle(p_settings, screen, 'tr', 'hor')
    paddle_tl = Paddle(p_settings, screen, 'tl', 'hor')
    paddle_br = Paddle(p_settings, screen, 'br', 'hor')
    paddle_bl = Paddle(p_settings, screen, 'bl', 'hor')

    # make a ball
    ball = Ball(p_settings, screen)
    balls = Group(ball)

    # make a group of paddles
    paddles = Group(paddle_right, paddle_left, paddle_tr, paddle_tl, paddle_br,
                    paddle_bl)

    # start screen
    gi.Game_Intro(p_settings, screen, stats, sb, play_button, paddles, ball,
                  paddle_right, paddle_tr, paddle_br, clock)

    # start the main loop for the game
    while True:

        gf.check_events(p_settings, screen, stats, sb, play_button, paddles,
                        ball, paddle_right, paddle_tr, paddle_br)

        if stats.game_active:
            gf.track_ball(ball, paddle_left, paddle_tl, paddle_bl)

            paddle_right.update()
            paddle_tr.update()
            paddle_br.update()
            paddle_left.update()
            paddle_tl.update()
            paddle_bl.update()
            paddles.update()
            ball.update()
            # print ("game active")
            gf.check_ball_paddle_collisions(p_settings, screen, ball,
                                            paddle_right, paddle_left,
                                            paddle_tr, paddle_tl, paddle_br,
                                            paddle_bl)

        # print("player score " + str(stats.p_score))
        # print("ai score " + str(stats.ai_score))

        gf.update_screen(p_settings, screen, paddles, ball, sb, stats,
                         play_button, paddle_right, paddle_left, paddle_tr,
                         paddle_tl, paddle_br, paddle_bl)

        gf.check_ball_out(p_settings, screen, screen_rect, stats, sb, paddles,
                          ball, paddle_right, paddle_left, paddle_tr,
                          paddle_tl, paddle_br, paddle_bl)

        # checks if score limit has been reached
        if stats.ai_score == 5 or stats.p_score == 5:
            # game over screen
            go.Game_Over(p_settings, screen, stats, sb, play_button, paddles,
                         ball, paddle_right, paddle_tr, paddle_br, clock)
            stats.reset_stats()
            sb.prep_p_score()
            sb.prep_ai_score()

        # set the game fps
        clock.tick(60)
Ejemplo n.º 9
0
def check_high_score(stats: GameStats, game_items: GameItems):
    """Check if high score is achieved."""
    if stats.score > stats.high_score:
        stats.high_score = stats.score
        game_items.sb.prep_high_score()
Ejemplo n.º 10
0
class AlienInvasion:
    """Overall class to manage game assets and behavior."""
    def __init__(self):
        """Initialize the game, and create game resources."""
        pygame.init(
        )  # initilizes the background setting that pygame needs to work properly
        self.settings = Settings(
        )  # asign instance of settings to self.settings

        self.screen = pygame.display.set_mode(
            (0, 0), pygame.FULLSCREEN
        )  # tells pygame to figure out a window size taht will fill screen
        self.settings.screen_width = self.screen.get_rect().width
        self.settings.screen_height = self.screen.get_rect().height
        pygame.display.set_caption(
            "Alien Invasion"
        )  # self.screen is a SUFRACE, each element can be returned by display.set_mode
        # create an instance to store game statistics and create a scoreboard
        self.stats = GameStats(self)
        self.sb = Scoreboard(self)

        self.ship = Ship(
            self)  # make an instance of Ship after the screen had been created
        self.bullets = pygame.sprite.Group()  # storing bullets in a group

        self.aliens = pygame.sprite.Group()  # storing aliens in a group

        self._create_fleet()

        # make the Play Button
        self.play_button = Button(
            self, "Play"
        )  # creates an instance of the button but does not draw button to the screen

        # set the background color.
        self.bg_color = (
            230,
            230,
            230,
        )  # light grey = background equal amounts (red, green, blue)

    def run_game(self):
        """Start the main loop for the game."""
        while (
                True
        ):  # while loop that runs continually and includes event loop (for loop)
            # watche for keyboard and mouse events. #EVENT: an action that the user performs while playing the game ( pressing key or moving the mouse)
            self._check_events(
            )  # even if game is inactive, still need to call _check_events

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

            self._update_screen(
            )  # must continually update the screen, while waiting to see the player choose to start a new game

            # redraw the screen during the pass thorugh the loop.

    def _check_events(self):  # make new check events method
        """Rspond to keypresses and mouse events."""
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                self._check_keydown_events(event)
            elif event.type == pygame.KEYUP:
                self._check_keyup_events(event)
            elif event.type == pygame.MOUSEBUTTONDOWN:
                mouse_pos = pygame.mouse.get_pos()
                self._check_play_button(mouse_pos)

    def _check_play_button(self, mouse_pos):
        """Start a new game when the player clicks Play."""
        button_clicked = self.play_button.rect.collidepoint(
            mouse_pos)  # button_clicked stores T/F
        if (
                button_clicked and not self.stats.game_active
        ):  # game will only restart in Play is clicked AND the game is not currently active
            # reset the game settings.
            self.settings.initialize_dynamic_settings()
            # reset the game statistics
            self.stats.reset_stats()
            self.stats.game_active = True
            self.sb.prep_score()

            # get rid of any remaining aliens and bullets
            self.aliens.empty()
            self.bullets.empty()

            # create a new fleet and center the ship
            self._create_fleet()
            self.ship.center_ship()

            # hide the mouse cursor.
            pygame.mouse.set_visible(False)

    def _check_keydown_events(self, event):
        """respond to keypress"""
        if event.key == pygame.K_RIGHT:
            self.ship.moving_right = True
        elif event.key == pygame.K_LEFT:
            self.ship.moving_left = True
        elif event.key == pygame.K_q:  # exit out of screen by pressing "q"
            sys.exit()
        elif event.key == pygame.K_SPACE:  # call  _fire_bullet whith the space bar
            self._fire_bullet()

    def _check_keyup_events(self, event):
        """respond to keyreleases"""
        if event.key == pygame.K_RIGHT:
            self.ship.moving_right = False
        elif event.key == pygame.K_LEFT:
            self.ship.moving_left = False

    def _fire_bullet(self):
        """create a new bullet and add it to the bullets group."""
        if len(self.bullets) < self.settings.bullets_allowed:
            # if the number of bullets still available to the player then....
            new_bullet = Bullet(self)  # make an instance of Bullet
            self.bullets.add(
                new_bullet)  # add it to the bullet group using add()

    def _update_bullets(self):
        # update bullet position
        self.bullets.update()  # storign bullets in a group

        # get rid oof bullets that have disappeared.
        for (bullet) in (
                self.bullets.copy()
        ):  # copy() method in the for loop allows us to modify bullets inside the loop
            if (bullet.rect.bottom <=
                    0):  # check to see if each bullet has moved off the screen
                self.bullets.remove(
                    bullet
                )  # remove the bullets if they are no longer on the screen
        self._check_bullet_aliens_collisions()

    def _check_bullet_aliens_collisions(self):
        """Respond to bullet-alien collisions."""
        # check for any bullets that have hit aliens.
        # if so, get rid of the bullet and the alien.
        collisions = pygame.sprite.groupcollide(self.bullets, self.aliens,
                                                True, True)
        if collisions:
            for aliens in collisions.values():
                self.stats.score += self.settings.alien_points * len(aliens)
            self.sb.prep_score()

        if not self.aliens:  # check is alien group is empty
            # destroy existing bullets and create a new fleet
            self.bullets.empty()
            self._create_fleet()
            self.settings.increase_speed()

    def _update_aliens(self):
        """check if the fleet is at an edge"""
        self._check_fleet_edges()
        """Update the positions of all aliens in the fleet."""
        self.aliens.update()
        # look for alien-ship collisions.
        # spritecollideany() takes two arguments, a sprite and a group, in this case loops through the group aliens

        if pygame.sprite.spritecollideany(self.ship, self.aliens):
            self._ship_hit()  # calling _ship_hit when an alien hits a ship
        # look for aliens hitting the bottom of the screen.
        self._check_aliens_bottom()

    def _create_fleet(self):
        """Create the fleet of aliens."""
        # creating an alien and find the number of aliens in a row
        # spacing between each alien is equal to one alien width
        alien = Alien(self)
        alien_width, alien_height = alien.rect.size
        available_space_x = self.settings.screen_width - (2 * alien_width)
        number_aliens_x = available_space_x // (2 * alien_width)

        # determine the number of rows of aliens that fit on the screen.
        ship_height = self.ship.rect.height
        available_space_y = (self.settings.screen_height - (3 * alien_height) -
                             ship_height)
        number_rows = available_space_y // (2 * alien_height)

        # create the full fleet of aliens
        for row_number in range(number_rows):
            for alien_number in range(number_aliens_x):
                self._create_alien(alien_number, row_number)

    def _create_alien(self, alien_number, row_number):
        """create an alien and place it in the row"""
        alien = Alien(self)
        alien_width, alien_height = alien.rect.size
        alien.x = alien_width + 2 * alien_width * alien_number
        alien.rect.x = alien.x
        alien.rect.y = alien.rect.height + 2 * alien.rect.height * row_number
        self.aliens.add(alien)

    def _check_fleet_edges(self):
        """Respond appropriately if any aliens have reached an edge."""
        for (alien) in (self.aliens.sprites(
        )):  # loop thorugh alien and call check_edges on each alien
            if alien.check_edges():
                self._change_fleet_direction(
                )  # if check_edges returns true, the fleet changes direction
                break

    def _change_fleet_direction(self):
        """Drop the entire fleet and change the fleet's direction."""
        for alien in self.aliens.sprites():
            alien.rect.y += (
                self.settings.fleet_drop_speed
            )  # loop through all aliens, a drop each one using the fleet_drop _speed
        self.settings.fleet_direction *= -1

    def _ship_hit(self):
        """Respond to the ship being hit by an alien."""
        # the following tests to be sure that the player has atleast one ship remaining, if they do not, game_active is set to false
        if self.stats.ships_left > 0:
            # Decrement ships_left.
            self.stats.ships_left -= 1  # number of ships left is reduced by 1
            # get rid of any remaining aliens and bullets.
            self.aliens.empty()
            self.bullets.empty()
            # create a new fleet and center the ship
            self._create_fleet()
            self.ship.center_ship()
            # pause
            sleep(
                0.5
            )  # so the play can see that they have been hit for half a second
        else:
            self.stats.game_active = False
            pygame.mouse.set_visible(True)

    def _check_aliens_bottom(self):
        """check if any aliens have reached the bottome of the screen."""
        screen_rect = self.screen.get_rect()
        for alien in self.aliens.sprites():
            if alien.rect.bottom >= screen_rect.bottom:
                # treat this the same as if the ship got hit
                self._ship_hit()
                break

    def _update_screen(self):
        """update images on the screen, and flip to the new screen."""
        self.screen.fill(
            self.settings.bg_color
        )  # Fill method, acts on the surface and take one argument a color
        self.ship.blitme(
        )  # after filling background, this draw ships to appear on top of back ground
        for (bullet) in (
                self.bullets.sprites()
        ):  # sprite method returns a list of all sprites in the group bullets, loop through the sprites
            bullet.draw_bullet()  # and call draw_bullet on each one
        self.aliens.draw(self.screen)
        # draw the score information
        self.sb.show_score()
        # draw the play button if the game is inactive
        if not self.stats.game_active:
            self.play_button.draw_button()
        # make the most recently drawn screen visible.
        pygame.display.flip(
        )  # tells pygame to make the most recently drawn screen visible, continually updates to show the
Ejemplo n.º 11
0
class AlienInvasion:
    """Overall class to manage game assets and behavior."""
    def __init__(self):
        """Initialize the game, and create game resources."""
        pygame.init()
        self.settings = Settings()

        # self.screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN)
        self.screen = pygame.display.set_mode((1200, 800))
        # self.settings.screen_width = self.screen.get_rect().width
        # self.settings.screen_height = self.screen.get_rect().height
        # # A part of the screen where a game can be displayed.
        self.screen = pygame.display.set_mode(
            (self.settings.screen_width, self.settings.screen_height))
        pygame.display.set_caption("Alien Invasion")

        # Create an instance to store game statistics.
        self.stats = GameStats(self)

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

        self._create_fleet()
        # Set the background color:
        self.bg_color = (230, 230, 230)

        # Make the play button:
        self.play_button = Button(self, "Play")

        # Create an instance to store game statistics, and
        # create scoreboard.
        self.stats = GameStats(self)
        self.sb = Scoreboard(self)

    def run_game(self):
        """ Start the main loop for the game. """
        while True:
            self._check_events()
            if self.stats.game_active:
                self.ship.update()
                self.bullets.update()
                self._update_aliens()
                self._delete_old_bullets()
            self._update_screen()

    def _update_aliens(self):
        """ Update the positions of all aliens in the fleet."""
        """
            Check if the fleet is at an edge,
            then update the positions of all aliens in the fleet.
        """
        self._check_fleet_edges()
        self.aliens.update()

        # Look for alien-ship collisions
        if pygame.sprite.spritecollideany(self.ship, self.aliens):
            self._ship_hit()

        # Look for aliens hitting the bottom of the screen.
        self._check_aliens_bottom()

    def _delete_old_bullets(self):
        """ Update position of bullets and get rid of old bullets."""

        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):
        """Respond to bullet-alien collisions."""
        # Remove any bullets and aliens that have collided.
        # # Check for any bullets that have it aliens.
        # If so, get rid of the bullet and the alien.
        collisions = pygame.sprite.groupcollide(self.bullets, self.aliens,
                                                True, True)

        if collisions:
            # self.stats.score += self.settings.alien_points
            for aliens in collisions.values():
                self.stats.score += self.settings.alien_points + len(aliens)
            self.sb.prep_score()
            self.sb.check_high_score()

        if not self.aliens:
            # Destroy existing bullets and create new fleet.
            self.bullets.empty()
            self._create_fleet()
            self.settings.increase_speed()

            # Increase level.
            self.stats.level += 1
            self.sb.prep_level()

    def _check_events(self):
        # Watch for the keyboard and mouse events.
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                self._check_keydown_events(event)
            elif event.type == pygame.KEYUP:
                self._check_keyup_events(event)
            elif event.type == pygame.MOUSEBUTTONDOWN:
                mouse_pos = pygame.mouse.get_pos()
                self._check_play_button(mouse_pos)

    def _check_play_button(self, mouse_pos):
        """ Start a new game when the player clicks Play. """
        button_clicked = self.play_button.rect.collidepoint(mouse_pos)
        if button_clicked and self.play_button.rect.collidepoint(mouse_pos):
            # Reset the game settings:
            self.settings.initialize_dynamic_settings()
            # Reset the game statistics.
            self.stats.reset_stats()
            self.stats.game_active = True
            self.sb.prep_score()
            self.sb.prep_level()
            self.sb.prep_ships()

            # Get rid of any remaining aliens and bullets.
            self.aliens.empty()
            self.bullets.empty()

            # Create a new fleet and center the ship.
            self._create_fleet()
            self.ship.center_ship()

            # Hide the mouse cursor.
            pygame.mouse.set_visible(False)

    def _update_screen(self):
        # Redraw the screen during each pass through the loop.
        self.screen.fill(self.settings.bg_color)
        self.ship.blitme()

        for bullet in self.bullets.sprites():
            bullet.draw_bullet()

        self.aliens.draw(self.screen)

        # Draw the score informtion.
        self.sb.show_score()

        # Draw the play button if the game is inactive.
        if not self.stats.game_active:
            self.play_button.draw_button()

        # Make the most recently drawn screen visible.
        pygame.display.flip()

    def _check_keydown_events(self, event):
        if event.key == pygame.K_RIGHT:
            # Move the ship to the right:
            self.ship.moving_right = True
        elif event.key == pygame.K_LEFT:
            self.ship.moving_left = True
        elif event.key == pygame.K_q:
            print("Bye ...")
            sys.exit(0)
        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

    def _fire_bullet(self):
        if len(self.bullets) < self.settings.bullets_allowed:
            """ Create a new bullet and add it to the bullets group """
            new_bullet = Bullet(self)
            self.bullets.add(new_bullet)

    def _create_fleet(self):
        """ Create the fleet of aliens. """
        # Make an alien:
        alien = Alien(self)
        # alien_width = alien.rect.width
        alien_width, alien_height = alien.rect.size
        available_space_x = self.settings.screen_width - (2 * alien_width)
        number_aliens_x = available_space_x // (2 * alien_width)

        # Determine the number of rows of aliens that fit on the screen.
        ship_height = self.ship.rect.height
        available_space_y = (self.settings.screen_height - (3 * alien_height) -
                             ship_height)
        number_rows = available_space_y // (2 * alien_height)

        # Create the full fleet of aliens
        for row_number in range(number_rows):
            for alien_number in range(number_aliens_x):
                self._create_alien(alien_number, row_number)

    def _create_alien(self, alien_number, row_number):
        """ Create an alien and place it in a row """
        # Create an alien and place it in a row:
        alien = Alien(self)
        #alien_width = alien.rect.width
        alien_width, alien_height = alien.rect.size
        alien.x = alien_width + 2 * (alien_width * alien_number)
        alien.rect.x = alien.x
        alien.rect.y = alien.rect.height + 2 * alien.rect.height * row_number
        self.aliens.add(alien)

    def _check_fleet_edges(self):
        """ Respond appropiately if any aliens have reached an edge. """
        for alien in self.aliens.sprites():
            if alien.check_edges():
                self._change_fleet_direction()
                break

    def _change_fleet_direction(self):
        """ Drop the entire fleet and change the fleet's direction """
        for alien in self.aliens.sprites():
            alien.rect.y += self.settings.fleet_drop_speed
        self.settings.fleet_direction *= -1

    def _ship_hit(self):
        # Decrement ships_left, and update scoreboard.
        if self.stats.ships_left > 0:
            # Decrement ships_left.
            self.stats.ships_left -= 1
            self.sb.prep_ships()

            # Get rid of any remaining aliens and bullets.
            self.aliens.empty()
            self.bullets.empty()

            # Create a new fleet and center the ship.
            self._create_fleet()
            self.ship.center_ship()

            # Pause.
            sleep(0.5)
        else:
            self.stats.game_active = False
            pygame.mouse.set_visible(True)

    def _check_aliens_bottom(self):
        """Check if any aliens have reached the bottom of the screen."""
        screen_rect = self.screen.get_rect()
        for alien in self.aliens.sprites():
            if alien.rect.bottom >= screen_rect.bottom:
                # Treat this the same as if the ship got hit.
                self._ship_hit()
                break
Ejemplo n.º 12
0
class AlienInvasion:
    """Overall Class"""
    def __init__(self):
        """Initialize the game, and create game resources"""
        pygame.init()
        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.screen = pygame.display.set_mode(
        #     (self.settings.screen_width, self.settings.screen_height)
        # )

        # self.screen = pygame.display.set_mode((1200,800))
        pygame.display.set_caption("Alien Invasion")

        # Create an instance to stats, and create a scoreboard
        self.stats = GameStats(self)
        self.sb = Scoreboard(self)

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

        self._create_fleet()

        # Create the Button
        self.play_button = Button(self, "Play")

    def run_game(self):
        """Begin game loop"""
        while True:
            self._check_events()

            if self.stats.game_active:
                # These functions will only run when the game is active
                self.ship.update()
                self._update_bullets()
                self._update_aliens()

            self._update_screen()

    def _check_events(self):
        """Respond to keypresses and mouse events"""
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()

            elif event.type == pygame.KEYDOWN:
                self._check_keydown_events(event)
            elif event.type == pygame.KEYUP:
                self._check_keyup_events(event)

            elif event.type == pygame.MOUSEBUTTONDOWN:
                mouse_pos = pygame.mouse.get_pos()
                self._check_play_button(mouse_pos)

    def _check_play_button(self, mouse_pos):
        """Start a new game when the player clicks play"""
        button_clicked = self.play_button.rect.collidepoint(mouse_pos)
        if button_clicked and not self.stats.game_active:

            # Reset the game settings
            self.settings.initialize_dynamic_settings()

            # Reset the game stats
            self.stats.reset_stats()
            self.stats.game_active = True
            self.sb.prep_score()
            self.sb.prep_level()
            self.sb.prep_ships()

            # remove any remaining aliens and bullets
            self.aliens.empty()
            self.bullets.empty()

            # Create a new fleet and center the ship
            self._create_fleet()
            self.ship.center_ship()

            # Hide the mouse cursor
            pygame.mouse.set_visible(False)

    # Keydown functions
    def _check_keydown_events(self, event):
        """When a key is pressed down"""
        if event.key == pygame.K_RIGHT:
            self.ship.moving_right = True
        if event.key == pygame.K_LEFT:
            self.ship.moving_left = True
        elif event.key == pygame.K_q:
            sys.exit()
        elif event.key == pygame.K_SPACE:
            self._fire_bullet()

    # Key Up functions
    def _check_keyup_events(self, event):
        """When a key is released"""
        if event.key == pygame.K_RIGHT:
            self.ship.moving_right = False
        if event.key == pygame.K_LEFT:
            self.ship.moving_left = False

    # Firing Bullets
    def _fire_bullet(self):
        """Create a new bullet and add it to the bullets group"""
        if len(self.bullets) < self.settings.bullets_allowed:
            new_bullet = Bullet(self)
            self.bullets.add(new_bullet)

    def _update_bullets(self):
        """Update position of bullets and get rid of old bullets"""
        # update bullet positions
        self.bullets.update()

        # Remove bullets once they get off screen to save memory
        for bullet in self.bullets.copy():
            if bullet.rect.bottom <= 0:
                self.bullets.remove(bullet)

        self._check_bullet_alien_collision()

    def _check_bullet_alien_collision(self):
        """Respond to bullet alien collision"""
        # Remove any bullets and aliens that collided
        collisions = pygame.sprite.groupcollide(self.bullets, self.aliens,
                                                True, True)

        if collisions:
            for aliens in collisions.values():
                self.stats.score += self.settings.alien_points * len(aliens)
            self.sb.prep_score()
            self.sb.check_high_score()

        if not self.aliens:
            # Remove existing bullets and create a new fleet
            self.bullets.empty()
            self._create_fleet()
            self.settings.increase_speed()

            # Increase the level
            self.stats.level += 1
            self.sb.prep_level()

    def _update_aliens(self):
        """check if alien is at the edge, then update the positions of all aliens"""
        self._check_fleet_edges()
        self.aliens.update()

        # alien and ship collision
        if pygame.sprite.spritecollideany(self.ship, self.aliens):
            self._ship_hit()

        # Look for any aliens that hit the bottom of the screen
        self._check_aliens_bottom()

    def _check_aliens_bottom(self):
        """ When an alien reaches the bottom of the screen"""
        screen_rect = self.screen.get_rect()
        for alien in self.aliens.sprites():
            if alien.rect.bottom >= screen_rect.bottom:
                # reset fleet and decrease lives by 1
                self._ship_hit()
                break

    def _ship_hit(self):
        """Respond to the ship being hit by an alien"""
        if self.stats.ships_left > 0:

            # Decrease the amount of ships left, and update scoreboard
            self.stats.ships_left -= 1
            self.sb.prep_ships()

            # remove all remaining ships and bullets
            self.aliens.empty()
            self.bullets.empty()

            # Create a new fleet and center the ship
            self._create_fleet()
            self.ship.center_ship()

            # Pause the game for player to realize the collision
            sleep(0.5)

        else:
            self.stats.game_active = False
            pygame.mouse.set_visible(True)

    def _create_fleet(self):
        """Create the alien fleet"""
        alien = Alien(self)

        # Figure out how many aliens can fit in one row
        alien_width, alien_height = alien.rect.size
        available_space_x = self.settings.screen_width - (2 * alien_width)
        number_aliens_x = available_space_x // (2 * alien_width)

        # Create the number of rows that would fit on one screen
        ship_height = self.ship.rect.height
        available_space_y = (self.settings.screen_height - (9 * alien_height) -
                             ship_height)
        number_rows = available_space_y // (2 * alien_height)

        # Create the alien fleet
        for row_number in range(number_rows):
            for alien_number in range(number_aliens_x):
                self._create_alien(alien_number, row_number)

    def _create_alien(self, alien_number, row_number):
        """Create an alien and place it in the row"""
        # Make the aliens
        alien = Alien(self)
        alien_width, alien_height = alien.rect.size
        alien.x = alien_width + 2 * alien_width * alien_number
        alien.rect.x = alien.x
        alien.rect.y = alien.rect.height + 2 * alien.rect.height * row_number
        self.aliens.add(alien)

    def _check_fleet_edges(self):
        """Respond if alien reaches the edge of the screen"""
        for alien in self.aliens.sprites():
            if alien.check_edges():
                self._change_fleet_direction()
                break

    def _change_fleet_direction(self):
        """Drop the fleet and change directions"""
        for alien in self.aliens.sprites():
            alien.rect.y += self.settings.fleet_drop_speed
        self.settings.fleet_direction *= -1

    def _update_screen(self):
        """Update images and flip to a new screen"""
        self.screen.fill(self.settings.bg_color)
        self.ship.blitme()
        for bullet in self.bullets.sprites():
            bullet.draw_bullet()

        self.aliens.draw(self.screen)

        # Draw the score information
        self.sb.show_score()

        # Draw the play button if the game is inactive
        if not self.stats.game_active:
            self.play_button.draw_button()

        pygame.display.flip()
Ejemplo n.º 13
0
def run_game():
    # 初始化游戏并创建一个屏幕对象
    pygame.init()  #初始化背景设置
    gf.music_run()  #开启音乐
    ai_settings = Settings()  #创建设置类对象
    screen = pygame.display.set_mode(
        (ai_settings.screen_width, ai_settings.screen_height))  #设置分辨率
    pygame.display.set_caption("thunder plane")  #设置标题

    background = pygame.image.load('images/timg.jpg').convert()  # 设置背景图片

    # 创建Play按钮
    play_button = Button(ai_settings, screen, "Play")

    #创建一个用于存储游戏统计信息的实例,并创建记分牌
    stats = GameStats(ai_settings)
    sb = Scoreboard(ai_settings, screen, stats)

    #创建一艘飞船,一个子弹编组和一个外星人编组
    ship = Ship(ai_settings, screen)
    bullets = Group()
    aliens = Group()
    bbulets = Group()
    boss = Boss(ai_settings, screen)

    # 标志信息0,1,5为提示框提示开关
    # 标志信息2为大招2不加点数开关
    # 标志信息3是给boss血量初始化开关
    # 标志信息4是boss每隔几秒发射子弹开关
    flag = [1, 1, 1, 1, 1, 1]

    #创建外星人群
    gf.create_fleet(ai_settings, screen, ship, aliens)

    #开始游戏主循环
    while True:

        #监视键盘和鼠标事件
        gf.check_events(ai_settings, screen, stats, sb, play_button, ship,
                        aliens, bullets, flag, bbulets)

        #检查提示框是否触发
        gf.check_message(stats, flag, ai_settings)

        if stats.game_active and stats.level < ai_settings.boss_level:
            #根据移动标志调整飞船的位置
            ship.update()
            #更新子弹位置,并删除已经消失的子弹
            gf.update_bullets(ai_settings, screen, stats, sb, ship, aliens,
                              bullets, flag)
            gf.update_aliens(ai_settings, stats, sb, screen, ship, aliens,
                             bullets)

        #如果到达相应的级别触发boss站
        if stats.game_active and stats.level == ai_settings.boss_level:
            aliens.empty()
            #根据移动标志调整飞船的位置
            ship.update()
            #更新子弹位置,并删除已经消失的子弹
            if flag[3]:
                stats.boss_blood = 10000  #重新给boss赋值
                flag[3] = 0
            gb.update_bullets(ai_settings, screen, stats, sb, ship, boss,
                              bullets, play_button, bbulets)
            gb.update_boss(ai_settings, stats, sb, screen, ship, boss, bullets,
                           bbulets, flag)

        #更新屏幕上的图像,并切换到新屏幕
        gf.update_screen(ai_settings, screen, stats, sb, ship, aliens, bullets,
                         play_button, background, boss, bbulets)
Ejemplo n.º 14
0
class AlienInvasion:
    """Overall class to manage game assets and behavior."""

    def __init__(self):
        """Initialize the game, and create game resources."""
        pygame.init()
        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
        pygame.display.set_caption("Alien Invasion")

        # Create an instance to store game statistics.
        self.stats = GameStats(self)

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

        self._create_fleet()

        self.score = Score(self)

        self.score.scoring()

    def run_game(self):
        """Start the main loop for the game."""
        while True:
            self._check_events()

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

            self._update_screen()

    def _check_events(self):
        """Respond to keypresses and mouse events."""
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                self._check_keydown_events(event)
            elif event.type == pygame.KEYUP:
                self._check_keyup_events(event)

    def _check_keydown_events(self, event):
        """Respond to keypresses."""
        if event.key == pygame.K_RIGHT:
            self.ship.moving_right = True
        elif event.key == pygame.K_LEFT:
            self.ship.moving_left = True
        elif event.key == pygame.K_q:
            sys.exit()
        elif event.key == pygame.K_SPACE:
            self._fire_bullet()

    def _check_keyup_events(self, event):
        """Respond to key releases."""
        if event.key == pygame.K_RIGHT:
            self.ship.moving_right = False
        elif event.key == pygame.K_LEFT:
            self.ship.moving_left = False

    def _fire_bullet(self):
        """Create a new bullet and add it to the bullets group."""
        if len(self.bullets) < self.settings.bullets_allowed:
            new_bullet = Bullet(self)
            self.bullets.add(new_bullet)

    def _update_bullets(self):
        """Update position of bullets and get rid of old bullets."""
        # Update bullet positions.
        self.bullets.update()

        # Get rid of bullets that have disappeared.
        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):
        """Respond to bullet-alien collisions."""
        # Remove any bullets and aliens that have collided.
        collisions = pygame.sprite.groupcollide(
                self.bullets, self.aliens, True, True)

        if collisions:
            for aliens in collisions.values():
                self.stats.score += self.settings.alien_points * len(aliens)
            self.score.scoring() 

        if not self.aliens:
            # Destroy existing bullets and create new fleet.
            self.bullets.empty()
            self._create_fleet()

    def _update_aliens(self):
        """
        Check if the fleet is at an edge,
          then update the positions of all aliens in the fleet.
        """
        self._check_fleet_edges()
        self.aliens.update()

        # Look for alien-ship collisions.
        if pygame.sprite.spritecollideany(self.ship, self.aliens):
            self._ship_hit()

        # Look for aliens hitting the bottom of the screen.
        self._check_aliens_bottom()

    def _check_aliens_bottom(self):
        """Check if any aliens have reached the bottom of the screen."""
        screen_rect = self.screen.get_rect()
        for alien in self.aliens.sprites():
            if alien.rect.bottom >= screen_rect.bottom:
                # Treat this the same as if the ship got hit.
                self._ship_hit()
                break

    def _ship_hit(self):
        """Respond to the ship being hit by an alien."""
        if self.stats.ships_left > 0:

            savescore = self.stats.score

            with open('score_history.txt', 'a', encoding = 'utf-8') as file:
                file.write(f'Score: {savescore}\n')  

            self.stats.reset_stats()
            
            # Decrement ships_left.
            self.stats.ships_left -= 1
            
            # Get rid of any remaining aliens and bullets.
            self.aliens.empty()
            self.bullets.empty()
            
            # Create a new fleet and center the ship.
            self._create_fleet()
            self.ship.center_ship()
            
            # Pause.
            sleep(0.5)
        else:
            self.stats.game_active = False

    def _create_fleet(self):
        """Create the fleet of aliens."""
        # Create an alien and find the number of aliens in a row.
        # Spacing between each alien is equal to one alien width.
        alien = Alien(self)
        alien_width, alien_height = alien.rect.size
        available_space_x = self.settings.screen_width - (2 * alien_width)
        number_aliens_x = available_space_x // (2 * alien_width)
        
        # Determine the number of rows of aliens that fit on the screen.
        ship_height = self.ship.rect.height
        available_space_y = (self.settings.screen_height - (3 * alien_height) - ship_height)
        number_rows = available_space_y // (2 * alien_height)
        
        # Create the full fleet of aliens.
        for row_number in range(number_rows):
            result = row_number % 2
            if result != 0:
                image = pygame.image.load('images/alien1.png')
                for alien_number in range(number_aliens_x):
                    self._create_alien(alien_number, row_number,image)
            elif result == 0:
                image = pygame.image.load('images/alien2.png')
                for alien_number in range(number_aliens_x):
                    self._create_alien(alien_number, row_number,image)

    def _create_alien(self, alien_number, row_number, image):
            """Create an alien and place it in the row."""
            alien = Alien(self)
            alien.image = image
            alien_width, alien_height = alien.rect.size
            alien.x = alien_width + 2 * alien_width * alien_number
            alien.rect.x = alien.x
            alien.rect.y = alien.rect.height + 2 * alien.rect.height * row_number
            self.aliens.add(alien)

    def _check_fleet_edges(self):
        """Respond appropriately if any aliens have reached an edge."""
        for alien in self.aliens.sprites():
            if alien.check_edges():
                self._change_fleet_direction()
                break
            
    def _change_fleet_direction(self):
        """Drop the entire fleet and change the fleet's direction."""
        for alien in self.aliens.sprites():
            alien.rect.y += self.settings.fleet_drop_speed
        self.settings.fleet_direction *= -1

    def _update_screen(self):
        """Update images on the screen, and flip to the new screen."""
        self.screen.fill(self.settings.bg_color)
        self.ship.blitme()
        for bullet in self.bullets.sprites():
            bullet.draw_bullet()
        self.aliens.draw(self.screen)

        self.score.display_score()

        pygame.display.flip()
Ejemplo n.º 15
0
class AlienInvasion:
    """Класс для управления ресурсами и поведением игры."""

    def __init__(self):
        """Инициализирует игру и создает игровые ресурсы."""
        global ai
        pygame.init()
        self.settings = Settings()

        if self.settings.fullscreen:
            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
        else:
            self.screen = pygame.display.set_mode((self.settings.screen_width,
                                                   self.settings.screen_height))

        pygame.display.set_caption("Alien Invasion")
        # Создание экземпляра для хранения игровой статистики.
        self.stats = GameStats(self)
        self.sb = Scoreboard(self)

        self.ship = Ship(self)
        self.hero = Hero(self.screen)
        self.bullets = pygame.sprite.Group()
        self.aliens = pygame.sprite.Group()
        self._create_fleet()
        self.play_button = Button(self, "Play")

    def run_game(self):
        """Запуск основного цикла игры."""
        while True:
            self._check_events()
            if self.stats.game_active:
                self.ship.update()
                self._update_bullets()
                self._update_aliens()
            self._update_screen()

    def _check_keydown_enents(self, event):
        if event.key == pygame.K_RIGHT:
            # Переместить корабль вправо.
            self.ship.moving_right = True
        elif event.key == pygame.K_LEFT:
            # Переместить корабль вправо.
            self.ship.moving_left = True
        elif event.key == pygame.K_q:
            sys.exit()
        elif event.key == pygame.K_SPACE:
            self._fire_bullet()

    def _check_keyup_enents(self, event):
        if event.key == pygame.K_RIGHT:
            # Переместить корабль вправо.
            self.ship.moving_right = False
        elif event.key == pygame.K_LEFT:
            # Переместить корабль вправо.
            self.ship.moving_left = False

    def _check_events(self):
        """Отслеживание событий клавиатуры и мыши."""
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                self._check_keydown_enents(event)
            elif event.type == pygame.KEYUP:
                self._check_keyup_enents(event)
            elif event.type == pygame.MOUSEBUTTONDOWN:
                mouse_pos = pygame.mouse.get_pos()
                self._check_play_button(mouse_pos)

    def _check_play_button(self, mouse_pos):
        """Запускает новую игру при нажатии кнопки Play."""

        button_clicked = self.play_button.rect.collidepoint(mouse_pos)

        if button_clicked and not self.stats.game_active:
            # Сброс игровых настроек.
            self.settings.initialize_dynamic_settings()

            # Сброс игровой статистики.

            self.stats.reset_stats()
            self.stats.game_active = True
            self.sb.prep_score()
            self.sb.prep_level()
            self.sb.prep_ships()

            # Очистка списков пришельцев и снарядов.
            self.aliens.empty()
            self.bullets.empty()

            # Создание нового флота и размещение корабля в центре.
            self._create_fleet()
            self.ship.center_ship()

            # Указатель мыши скрывается.
            pygame.mouse.set_visible(False)

    def _fire_bullet(self):
        """Создание нового снаряда и включение его в группу bullets."""
        if len(self.bullets) < self.settings.bullets_allowed:
            new_bullet = Bullet(self)
            self.bullets.add(new_bullet)

    def _create_fleet(self):
        """Создание флота вторжения."""
        # Создание пришельца и вычисление количества пришельцев в ряду
        # Интервал между соседними пришельцами равен ширине пришельца.

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

        available_space_x = self.settings.screen_width - (2 * alien_width)
        number_aliens_x = available_space_x // (2 * alien_width)

        """Определяет количество рядов, помещающихся на экране."""
        ship_height = self.ship.rect.height

        available_space_y = (self.settings.screen_height -
                           (3 * alien_height) - ship_height)
        number_rows = available_space_y // (2 * alien_height)

        # Создание флота вторжения.
        for row_number in range(number_rows):
            for alien_number in range(number_aliens_x):
                self._create_alien(alien_number, row_number)

    def _create_alien(self, alien_number, row_number):
        """ Создание пришельца и размещение его в ряду."""
        alien = Alien(self)
        alien_width, alien_height = alien.rect.size
        alien.x = alien_width + 2 * alien_width * alien_number
        alien.rect.x = alien.x
        alien.rect.y = alien.rect.height + 2 * alien.rect.height * row_number
        self.aliens.add(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 _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)

        if collisions:
            for aliens in collisions.values():
                self.stats.score += self.settings.alien_points * len(aliens)
            self.sb.prep_score()
            self.sb.check_high_score()

        if not self.aliens:
            # Уничтожение существующих снарядов и создание нового флота.
            self.bullets.empty()
            self._create_fleet()
            self.settings.increase_speed()

            # Увеличение уровня.
            self.stats.level += 1
            self.sb.prep_level()

    def _update_aliens(self):
        """Обновляет позиции всех пришельцев во флоте."""
        self._check_fleet_edges()
        self.aliens.update()

        # Проверка коллизий "пришелец — корабль".
        if pygame.sprite.spritecollideany(self.ship, self.aliens):
            self._ship_hit()

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

    def _check_aliens_bottom(self):
        """Проверяет, добрались ли пришельцы до нижнего края экрана."""
        screen_rect = self.screen.get_rect()
        for alien in self.aliens.sprites():
            if alien.rect.bottom >= screen_rect.bottom:
                # Происходит то же, что при столкновении с кораблем.
                self._ship_hit()
                break

    def _ship_hit(self):
        """Обрабатывает столкновение корабля с пришельцем."""
        if self.stats.ships_left > 0:
            # Уменьшение ships_left.
            self.stats.ships_left -= 1
            self.sb.prep_ships()

            # Отчистка списков прищельцев и снарядов.
            self.aliens.empty()
            self.bullets.empty()

            # Создание нового флота и размещение коробля в центре
            self._create_fleet()
            self.ship.center_ship()

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

    def _update_screen(self):
        """Отображение последнего прорисованного экрана."""
        self.screen.fill(self.settings.bg_color)
        self.ship.blitme()
        self.hero.blitme()

        for bullet in self.bullets.sprites():
            bullet.draw_bullet()

        self.aliens.draw(self.screen)

        self.sb.show_score()

        # Кнопка Play отображается в том случае, если игра неактивна.
        if not self.stats.game_active:
            self.play_button.draw_button()

        pygame.display.flip()
Ejemplo n.º 16
0
class AlienInvasion:
    """Overall class to manage game assets and behavior."""
    def __init__(self):
        """Initialize the game, and creat game resources."""

        # Initializes the background settings that Pygame
        # needs to work properly.
        pygame.init()

        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

        # If you prefer run game in window mode, comment the above three lines,
        # and uncomment the following code.
        # self.screen = pygame.display.set_mode((self.settings.screen_width,
        #     self.settings.screen_height))

        pygame.display.set_caption("Alien Invasion")

        # Create an instance to store game statistics and create a scoreboard.
        self.stats = GameStats(self)
        self.sb = Scoreboard(self)

        # Make the Start Game button.
        self.play_button = Button(self, "Start Game")

        self.ship = Ship(self)
        # 'self' here is the argument that refers to the parameter 'ai_game'
        # in the Ship class. Indicating the current instance of AlienInvasion.

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

        self._create_fleet()

    def run_game(self):
        """Start the main loop for the game."""
        while True:
            self._check_events()

            # The parts that only run when the game is active.
            if self.stats.game_active:
                self.ship.update()
                self._update_bullets()
                self._update_aliens()

            self._update_screen()

    def _check_events(self):
        """Respond to key and mouse events."""
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()  # Here is the place using the sys module
            elif event.type == pygame.KEYDOWN:
                self._check_keydown_events(event)
            elif event.type == pygame.KEYUP:
                self._check_keyup_events(event)
            elif event.type == pygame.MOUSEBUTTONDOWN:
                mouse_pos = pygame.mouse.get_pos()
                self._check_play_button(mouse_pos)

    def _check_keydown_events(self, event):
        """Respond to keypresses."""
        if event.key == pygame.K_RIGHT:
            self.ship.moving_right = True
        elif event.key == pygame.K_LEFT:
            self.ship.moving_left = True
        elif event.key == pygame.K_ESCAPE:
            sys.exit()
        elif event.key == pygame.K_SPACE:
            self._fire_bullet()

    def _check_keyup_events(self, event):
        """Respond to key releases."""
        if event.key == pygame.K_RIGHT:
            self.ship.moving_right = False
        elif event.key == pygame.K_LEFT:
            self.ship.moving_left = False

    def _check_play_button(self, mouse_pos):
        """
        Start a new game only when the player clicks the Start Game button.
        """
        button_clicked = self.play_button.rect.collidepoint(mouse_pos)
        if button_clicked and not self.stats.game_active:

            # Reset the game settings.
            self.settings.initialize_dynamic_settings()

            # Reset the game statistics.
            self.stats.reset_stats()
            self.stats.game_active = True
            self.sb.prep_score()
            self.sb.prep_level()
            self.sb.prep_ships()

            # Get rid of any remaining aliens and bullets.
            self.aliens.empty()
            self.bullets.empty()

            # Create a new fleet and center the ship.
            self._create_fleet()
            self.ship.center_ship()

            # Hide the mouse cursor.
            pygame.mouse.set_visible(False)

    def _fire_bullet(self):
        """Create a new bullet and add it to the bullets group."""
        if len(self.bullets) < self.settings.bullets_allowed:
            new_bullet = Bullet(self)
            self.bullets.add(new_bullet)

    def _update_bullets(self):
        """Update position of bullets and get rid of old bullets."""
        # Update bullet positions.
        self.bullets.update()

        # Get rid of bullets that have disappeared.
        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):
        """Respond to bullet-alien collisions."""

        # Remove any bullets and aliens that have collided.
        collisions = pygame.sprite.groupcollide(self.bullets, self.aliens,
                                                True, True)

        if collisions:
            for aliens in collisions.values():
                self.stats.score += self.settings.alien_points * len(aliens)
            self.sb.prep_score()
            self.sb.check_high_score()

        if not self.aliens:
            # Destroy existing bullets and create new fleet.
            self.bullets.empty()
            self._create_fleet()
            self.settings.increase_speed()

            # Increase level.
            self.stats.level += 1
            self.sb.prep_level()

    def _create_fleet(self):
        """Create the fleet of aliens."""
        # Create an alien and find the number of aliens in a row.
        # Spacing between each aliens is equal to one alien width.
        # This alien is created for calculations, won't be added to the Group.
        alien = Alien(self)

        alien_width, alien_height = alien.rect.size

        # Determine the number of aliens that fit in one row.
        available_space_x = self.settings.screen_width - (4 * alien_width)
        number_aliens_x = available_space_x // (2 * alien_width)

        # Determine the number of rows of aliens that fit on the screen.
        ship_height = self.ship.rect.height
        available_space_y = (self.settings.screen_height - (6 * alien_height) -
                             ship_height)
        number_rows = available_space_y // (2 * alien_height)

        # Create the full fleet of aliens.
        for row_number in range(number_rows):
            for alien_number in range(number_aliens_x):
                self._create_alien(alien_number, row_number)

    def _create_alien(self, alien_number, row_number):
        """Create an alien and place it in the row"""
        alien = Alien(self)
        alien_width, alien_height = alien.rect.size
        alien.x = alien_width + 2 * alien_width * alien_number
        alien.rect.x = alien.x
        alien.y = alien_height + 2 * alien_height * row_number
        alien.rect.y = alien.y
        self.aliens.add(alien)

    def _check_fleet_edges(self):
        """Respond appropriately if any aliens have reached an edge"""
        for alien in self.aliens.sprites():
            if alien.check_edges():
                self._change_fleet_direction()
                break

    def _change_fleet_direction(self):
        """Drop the entire fleet and change the fleet's direction."""
        for alien in self.aliens.sprites():
            alien.rect.y += self.settings.fleet_drop_speed
        self.settings.fleet_direction *= -1

    def _check_aliens_bottom(self):
        """Check if any alien has reached the bottom of the screen"""
        screen_rect = self.screen.get_rect()
        for alien in self.aliens.sprites():
            if alien.rect.bottom >= screen_rect.bottom:
                # Treat this the same as if the ship got hit.
                self._ship_hit()
                break

    def _update_aliens(self):
        """
        Check if the fleet is at an edge,
        then update the positions of all aliens in the fleet
        """
        self._check_fleet_edges()
        self.aliens.update()

        # Look for alien-ship collisions.
        if pygame.sprite.spritecollideany(self.ship, self.aliens):
            self._ship_hit()

        # Look for aliens hitting the bottom of the screen.
        self._check_aliens_bottom()

    def _ship_hit(self):
        """Respond to the ship being hit by an alien"""
        if self.stats.ships_remains > 0:
            # Decrement ships_remains, and update scoreboard.
            self.stats.ships_remains -= 1
            self.sb.prep_ships()

            # Get rid of any remaining aliens and bullets.
            self.aliens.empty()
            self.bullets.empty()

            # Create a new fleet and center the ship.
            self._create_fleet()
            self.ship.center_ship()

            # Pause game before a new round starts.
            sleep(1)
        else:
            self.stats.game_active = False
            pygame.mouse.set_visible(True)

    def _update_screen(self):
        """Update (redraw) images on the screen, and flip to the new screen."""

        # Redraw the screen each pass through the loop,
        # not needed if a background image exists
        # self.screen.fill(self.settings.bg_color)

        self.screen.blit(self.settings.bg_image, self.settings.bg_rect)
        self.ship.blitme()

        for bullet in self.bullets.sprites():
            bullet.draw_bullet()

        self.aliens.draw(self.screen)

        # Draw the score information.
        self.sb.show_score()

        # Draw the play button if the game is inactive.
        if not self.stats.game_active:
            self.play_button.draw_button()

        # Make the most recently drawn screen visible.
        pygame.display.flip()
Ejemplo n.º 17
0
class AlienInvasion:
    def __init__(self):
        pygame.init()

        self.settings = Settings()
        self.screen = pygame.display.set_mode(
            (self.settings.screen_width, self.settings.screen_height))
        pygame.display.set_caption("Alien Invasion")
        #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

        # Create an instance to store game statistics, and creat a scoreboard
        self.stats = GameStats(self)
        self.sb = Scoreboard(self)

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

        #self._create_AlienGrid()
        self._create_AlienBoss()
        self.play_button = Button(self, "Play")

    def run_game(self):
        while True:
            self._check_events()
            if self.stats.game_active:
                self.ship.update()
                self._update_bullets()
                self._update_aliens()

            self._update_screen()

    def _check_events(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit(0)
            elif event.type == pygame.KEYDOWN:
                self._check_keydown_events(event)
            elif event.type == pygame.KEYUP:
                self._check_keyup_events(event)
            elif event.type == pygame.MOUSEBUTTONDOWN:
                mouse_pos = pygame.mouse.get_pos()
                self._check_play_button(mouse_pos)

    def _check_play_button(self, mouse_pos):
        """Start a new game when the player clicks Play."""
        button_clicked = self.play_button.rect.collidepoint(mouse_pos)
        if button_clicked and not self.stats.game_active:
            # Rese the game statistices.
            self.settings.initialize_dynamic_settings()
            self.stats.reset_stats()
            self.stats.game_active = True
            self.sb.prep_score()

            # Hide the mouse cursor.
            pygame.mouse.set_visible(False)

            # Get rid of any remaining aliens and bullets.
            self.aliens.empty()
            self.bullets.empty()

            # Create a new fleet and center the ship
            self._create_AlienBoss
            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
        elif event.key == pygame.K_q:
            sys.exit(0)
        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

    def _fire_bullet(self):
        if len(self.bullets) < self.settings.bullets_allowed:
            new_bullet = Bullet(self)
            self.bullets.add(new_bullet)

    def _create_AlienGrid(self):
        alien = Alien(self, False)
        alien_width, alien_height = alien.rect.size
        available_space_x = self.settings.screen_width - (2 * alien_width)
        number_aliens_x = available_space_x // (2 * alien_width)

        ship_height = self.ship.rect.height
        available_space_y = (self.settings.screen_height - (3 * alien_height) -
                             ship_height)
        number_rows = available_space_y // (2 * alien_height)

        for row_number in range(number_rows):
            for alien_number in range(number_aliens_x):
                self._create_alien(alien_number, row_number)

    def _create_AlienBoss(self):
        self._create_alien(20, 80)
        self._create_alien(780, 200)

    def _create_alien(self, xlocation, ylocation):
        alien = Alien(self)
        alien.x = xlocation
        alien.rect.x = alien.x
        alien.y = ylocation
        alien.rect.y = alien.y
        self.aliens.add(alien)

    def _update_bullets(self):
        self.bullets.update()
        collisons = pygame.sprite.groupcollide(self.bullets, self.aliens, True,
                                               True)

        for bullet in self.bullets.copy():
            if bullet.rect.bottom <= 0:
                self.bullets.remove(bullet)
        print(len(self.bullets))
        self._check_bullet_alien_collisions()

    def _check_bullet_alien_collisions(self):
        collisions = pygame.sprite.groupcollide(self.bullets, self.aliens,
                                                True, True)
        if collisions:
            for aliens in collisions.values():
                self.stats.score += self.settings.alien_points * len(AlienBoss)
            self.sb.prep_score()
        if not self.aliens:
            self.bullets.empty()
            #self._create_AlienGrid()
            self._create_AlienBoss()
            self.settings.increase_speed()

    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 _ship_hit(self):
        if self.stats.ships_left > 0:
            self.stats.ships_left -= 1
            self.aliens.empty()
            self.bullets.empty()
            #self._create_AlienGrid()
            self._create_AlienBoss()
            self.ship.center_ship()
            sleep(0.5)
        else:
            self.stats.game_active = False
            pygame.mouse.set_visible(Ture)

    def _check_aliens_bottom(self):
        screen_rect = self.screen.get_rect()
        for alien in self.aliens.sprites():
            if alien.rect.bottom >= screen_rect.bottom:
                self._ship_hit()
                break

    def _update_aliens(self):
        self._check_fleet_edges()
        self.aliens.update()
        if pygame.sprite.spritecollideany(self.ship, self.aliens):
            self._ship_hit()
            print("Ship Hit!!!")
        self._check_aliens_bottom()

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

        # Draw teh score information.
        self.sb.show_score()

        # Draw the play button if the game is inactive.
        if not self.stats.game_active:
            self.play_button.draw_button()

        pygame.display.flip()
Ejemplo n.º 18
0
class AlienInvasion:
    '''Класс для управления ресурсами и поведением игры'''
    def __init__(self):
        '''Инициализирует игру и создает игровые ресурсы'''
        # pygame.init() - эта строчка есть в книге, но не влияет на запуск кода
        self.settings = Settings()
        self.screen = pygame.display.set_mode(
            (self.settings.screen_width, self.settings.screen_height))
        pygame.display.set_caption('Alien Invasion. Meow')

        self.stats = GameStats(self)
        self.sb = Scoreboard(self)
        self.ship = Ship(self)
        self.bullet = pygame.sprite.Group()
        self.aliens = pygame.sprite.Group()

        self._create_fleet()

        # Создание кнопки Play
        self.play_button = Button(self, 'Play')

    def run_game(self):
        '''Запуск основного цикла игры'''
        while True:
            self._check_events()

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

            self._update_screen()

    def _check_events(self):
        # Отслеживает события клавиатуры и мыши
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                self._check_keydown_events(event)
            elif event.type == pygame.KEYUP:
                self._check_keyup_events(event)
            elif event.type == pygame.MOUSEBUTTONDOWN:
                mouse_pos = pygame.mouse.get_pos()
                self._check_play_button(mouse_pos)

    def _check_play_button(self, mouse_pos):
        ''' Запускает новую игру по нажатию кнопки Play '''
        button_clicked = self.play_button.rect.collidepoint(mouse_pos)
        if button_clicked and not self.stats.game_active:
            # Сброс игровой статистики и настроек
            self.stats.reset_stats()
            self.stats.game_active = True
            self.settings.initialize_dynamic_settings()
            self.sb.prep_level()
            self.sb.prep_ships()

            # Очистка списка пришельцев и снарядов
            self.aliens.empty()
            self.bullet.empty()

            # Создание нового флота и размещение корабля в центре
            self._create_fleet()
            self.ship.center_ship()

            # Указатель мыши скрывается
            pygame.mouse.set_visible(False)

    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
        # 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

    def _fire_bullet(self):
        '''Создание нового снаряда и вкл. его в группу bullets'''
        if len(self.bullet) < self.settings.bullet_allowed:
            new_bullet = Bullet(self)
            self.bullet.add(new_bullet)

    def _update_bullets(self):
        '''Обновляет позиции снарядов и уничтожает старые снаряды'''
        # Обновляет позиции снарядов
        self.bullet.update()

        # Удаление снарядов, вышедших за экран
        for bullet in self.bullet.copy():
            if bullet.rect.bottom <= 0:
                self.bullet.remove(bullet)

        self._check_bullet_alien_collisions()

    def _check_bullet_alien_collisions(self):
        ''' Обработка коллизий снарядов с пришельцами '''
        if not self.aliens:
            # Уничтожение текужих сарядов и создание нового флота
            self.bullet.empty()
            self._create_fleet()
            self.settings.increase_speed()
            self.stats.level += 1
            self.sb.prep_level()

        # проверка попадания в пришельцев
        # При обнаружени попадания удалить снаряд и пришельца
        collisions = pygame.sprite.groupcollide(self.bullet, self.aliens, True,
                                                True)

        if collisions:
            for alien in collisions.values():
                self.stats.score += self.settings.alien_points * len(alien)
            self.sb.prep_score()
            #self.sb.check_high_score()

    def _create_alien(self, alien_number, row_number):
        # Создание пришельца и размещение его в ряду
        alien = Alien(self)
        alien_width, alien_height = alien.rect.size
        alien.x = alien_width + 2 * alien_width * alien_number
        alien.rect.x = alien.x
        alien.rect.y = alien.rect.height + 2 * alien.rect.height * row_number
        self.aliens.add(alien)

    def _create_fleet(self):
        ''' Создать флот'''
        # Создание пришельца
        alien = Alien(self)
        alien_width, alien_height = alien.rect.size
        avalibale_space_x = self.settings.screen_width - (2 * alien_width)
        number_aliens_x = avalibale_space_x // (2 * alien_width)
        self.aliens.add(alien)

        # определяет количество рядов, помещ. на экране
        ship_height = self.ship.rect.height
        available_spase_y = (self.settings.screen_height - (2 * alien_height) -
                             ship_height)
        number_rows = available_spase_y // (2 * alien_height)

        for row_number in range(number_rows):
            for alien_number in range(number_aliens_x):
                self._create_alien(alien_number, row_number)

    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 _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 _ship_hit(self):
        ''' Обрабатывает столкновение корабля с пришельцом '''
        # Уменьшает ship_left
        if self.stats.ship_left > 0:
            self.stats.ship_left -= 1
            self.sb.prep_ships()

            # Очистка пришельцев и снарядов
            self.aliens.empty()
            self.bullet.empty()

            # Создание нового флота и размещение корабля в центре
            self._create_fleet()
            self.ship.center_ship()

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

    def _check_aliens_bottom(self):
        ''' Проверяет, добрались ли пришельцы до края экрана '''
        screen_rect = self.screen.get_rect()
        for alien in self.aliens.sprites():
            if alien.rect.bottom >= screen_rect.bottom:
                self._ship_hit()
                break

    def _update_screen(self):
        # При каждом проходе цикла перерисовывается цвет экрана
        self.screen.fill(self.settings.bg_color)
        self.ship.blitme()
        for bullet in self.bullet.sprites():
            bullet.draw_bullet()
        self.aliens.draw(self.screen)

        # Выводит информацию о счёте
        self.sb.show_score()

        #Кнопка Play отображается только если игра неактивна
        if not self.stats.game_active:
            self.play_button.draw_buton()

        # Отображение последнего прорисованного экрана
        pygame.display.flip()
Ejemplo n.º 19
0
def run_game():

    # 初始化游戏并创建一个屏幕对象:初始化背景设置,让Pygame能够正确地工作

    pygame.init()

    # 初始化全部音频,并加载爆炸声音乐

    pygame.mixer.init()

    # 爆炸声

    explode_sound = pygame.mixer.Sound("sound\EXPLO6.wav")

    # 子弹射击的声音

    bullet_sound = pygame.mixer.Sound("sound\shot1.wav")

    pw_settings = Settings()
    """实参(1200, 800)是一个元组,指定了游戏窗口的尺寸。

            通过将这些尺寸值传递给pygame.display.set_mode()

            我们创建了一个宽1200像素、高800像素的游戏窗口"""
    """调用pygame.display.set_mode()来创建一个名为screen的显示窗口,

    这个游戏的所有图形元素都将在其中绘制。每个元素(如外星人或飞船)都是一个surface对象"""

    screen = pygame.display.set_mode(
        (pw_settings.screen_width, pw_settings.screen_height))

    # 窗口标题

    pygame.display.set_caption('Plane War')

    # 创建Play按钮

    play_button = Button(pw_settings, screen, "Play")

    # 创建一个用于存储游戏统计信息的实例,并创建记分牌

    stats = GameStats(pw_settings)

    sb = Scoreboard(pw_settings, screen, stats)

    # 创建一艘飞船、一个子弹编组和一个外星人编组

    # 创建一艘飞船

    ship = Ship(pw_settings, screen)

    # 创建一个用于存储子弹的编组,添加进去实例后对bullets调用 就能对bullets里面的每个bullet调用

    bullets = Group()

    # 创建一个外星人编组

    aliens = Group()

    # 创建外星人群

    gf.create_fleet(pw_settings, screen, aliens)

    timer = 1

    # 开始游戏的主循环

    while True:

        timer += 1

        gf.check_events(pw_settings, screen, stats, sb, play_button, ship,
                        aliens, bullets, bullet_sound)

        if stats.game_active:

            ship.update()

            gf.update_bullets(pw_settings, screen, stats, sb, ship, aliens,
                              bullets, explode_sound)

            gf.update_aliens(pw_settings, screen, stats, sb, ship, aliens,
                             bullets)

        gf.update_screen(pw_settings, screen, stats, sb, ship, aliens, bullets,
                         play_button)
Ejemplo n.º 20
0
class SpaceImpact:
    """Main class to manage game assets and behavior."""

    def __init__(self):
        """Initialize the game, and create game resources."""
        pygame.init()

        self.settings = Settings()
        self.screen = pygame.display.set_mode((self.settings.screen_width, self.settings.screen_height),
                                              HWSURFACE | DOUBLEBUF | RESIZABLE)
        pygame.display.set_caption("Space Impact")

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

        self._create_fleet_1()
        self._create_fleet_2()
        self._create_fleet_3()

        # Set the background image
        self.bg_image = self.settings.bg_image
        self.imageship = self.ship.image

        # Instance to store game statistic.
        self.stats = GameStats(self)
        # Draw the score information.
        self.scoreboard = Scoreboard(self)
        self.scoreboard.show_score()

        # Make the Play button.
        self.play_button = Button(self)

    def run_game(self):
        """Start the main loop for the game."""

        while True:
            # Watch for keyboard and mouse events.
            self._check_events()

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

            # Redraw the screen during each pass through the loop.
            self._update_screen()

    def _check_events(self):
        """Respond to keypress and mouse events."""
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                self._check_keydown_events(event)
            elif event.type == pygame.KEYUP:
                self._check_keyup_events(event)
            elif event.type == pygame.MOUSEBUTTONDOWN:
                mouse_pos = pygame.mouse.get_pos()
                self._check_play_button(mouse_pos)

    def _check_keydown_events(self, event):
        """Respond to keydown events."""
        if event.key == pygame.K_RIGHT:
            self.ship.moving_right = True
        elif event.key == pygame.K_LEFT:
            self.ship.moving_left = True
        elif 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):
        """Respond to keydown events."""
        if event.key == pygame.K_RIGHT:
            self.ship.moving_right = False
        elif event.key == pygame.K_LEFT:
            self.ship.moving_left = False
        elif event.key == pygame.K_UP:
            self.ship.moving_up = False
        elif event.key == pygame.K_DOWN:
            self.ship.moving_down = False

    def _check_play_button(self, mouse_pos):
        """Start a new game when the player clicks Play."""
        button_clicked = self.play_button.rect.collidepoint(mouse_pos)
        if button_clicked and not self.stats.game_active:
            self.stats.reset_stats()
            self.settings.initialize_dynamic_settings()
            self.stats.game_active = True
            self.scoreboard.prep_score()
            self.scoreboard.prep_level()
            self.scoreboard.prep_hearts()

            # Hide the mouse cursor.
            pygame.mouse.set_visible(False)
        # Get rid of any remaining aliens and bullets.
            self.aliens.empty()
            self.bullets.empty()
            self.ship.center_ship()
            self._create_fleet_1()
            self._create_fleet_2()
            self._create_fleet_3()

    def _fire_bullet(self):
        """Create a new bullet and add it to the bullets group."""
        new_bullet = Bullet(self)
        self.bullets.add(new_bullet)

    def _create_fleet_1(self):
        """Create the fleet of aliens."""
        # Make an alien.
        alien = Alien(self, self.settings)
        self.aliens.add(alien)
        alien = Alien(self, self.settings)
        self.aliens.add(alien)
        alien = Alien(self, self.settings)
        self.aliens.add(alien)

    def _create_fleet_2(self):
        """Create the fleet of aliens."""
        # Make an alien.
        alien_2 = Alien2(self, self.settings)
        self.aliens.add(alien_2)

    def _create_fleet_3(self):
        """Create the fleet of aliens."""
        # Make an alien.
        alien_3 = Alien3(self, self.settings)
        self.aliens.add(alien_3)

    def _ship_hit(self):
        """Respong to the ship being hit by an alien."""

        if self.stats.ships_left > 0:
            # Lower ships left.
            self.stats.ships_left -= 1
            self.scoreboard.prep_hearts()

            # Get rid of any remaining aliens and bullets.
            self.aliens.empty()
            self.bullets.empty()

            # Create a new fleet and center the ship.
            self.ship.center_ship()
            self._create_fleet_1()
            self._create_fleet_2()
            self._create_fleet_3()

            print(self.stats.ships_left)
            # Pause.
            sleep(1)
        else:
            self.stats.game_active = False
            pygame.mouse.set_visible(True)

    def _update_aliens(self):
        """Update the position of all liens in the fleet."""
        self.aliens.update()
        # Look for alien-ship collision.
        if pygame.sprite.spritecollideany(self.ship, self.aliens):
            self._ship_hit()

    def _update_bullets(self):
        # Check for any bullets that have hit aliens.
        # If so, get rid of the bullet and the alien.
        collisions = pygame.sprite.groupcollide(
            self.bullets, self.aliens, True, True)

        if collisions:
            for aliens in collisions.values():
                self.stats.score += self.settings.alien_points * len(aliens)
            self.scoreboard.prep_score()
            self.scoreboard.check_high_score()

        # Delete bullets that are off the screen
        for bullet in self.bullets.copy():
            if bullet.rect.right >= resolution_width * 1.1:
                self.bullets.remove(bullet)

        if not self.aliens:
            self.settings.increase_speed()
            self.stats.level += 1
            self.scoreboard.prep_level()

            self._create_fleet_1()
            self._create_fleet_2()
            self._create_fleet_3()

    def _update_screen(self):
        """Update images on the screen and flip to the new screen."""

        self.screen.blit(pygame.transform.scale
                         (self.bg_image, [self.settings.screen_width, self.settings.screen_height]), (0, 0))
        self.ship.blitme()
        for bullet in self.bullets.sprites():
            bullet.draw_bullet()

        self.aliens.draw(self.screen)

        self.scoreboard.show_score()
        # Delete aliens that are off the screen
        for alien in self.aliens.copy():
            if alien.rect.right < 0:
                self.aliens.remove(alien)

        # Lines of code to show FPS counter
        # font = pygame.font.Font(None, 30)
        # fps = font.render(str(int(clock.get_fps())), True, pygame.Color('white'))
        # self.screen.blit(fps, (50, 50))

        # Regulate speed of the game by limiting FPS count.
        clock.tick(60)

        # Draw the play button if the game is inactive.
        if not self.stats.game_active:
            self.play_button.draw_button()

        # Make the most recently draw screen visible.
        pygame.display.flip()
Ejemplo n.º 21
0
class AlienInvasion:
    def __init__(self):
        """ИНИЦИАЛИЗАЦИЯ ИГРЫ"""
        pygame.init()  #HERE IS EVERYTHING ALRIGHT
        self.settings = Settings()
        self.screen = pygame.display.set_mode(
            (self.settings.screen_width, self.settings.screen_height))  # 4
        self.screen_rect = self.screen.get_rect()
        # ЕС ХОТИТЕ СДЕЛАТЬ НА ФУЛ ЭКРАН - УБИРАЙТЕ # В 1 , 2 , 3 ПУНКТЕ И ПОСТАВЬТЕ # В 4 ПУНКТЕ
        # self.screen=pygame.display.set_mode((0,0), pygame.FULLSCREEN)  # 1
        # self.settings.screen_width=self.screen.get_rect().width        # 2
        # self.settings.screen_height=self.screen.get_rect().height      # 3
        pygame.display.set_caption("ALIEN INVASION")

        self.ship = Ship(self)
        self.bullets = pygame.sprite.Group()
        self.stats = GameStats(self)
        self.sb = Scoreboard(self)
        self.aliens = pygame.sprite.Group()  #объявление группы пришельцев
        #self.charecter=Character(self) # MB I WILL DO IT

        self._create_fleet()  #при первом вызыове
        self.play_button = Button(self, "LETS START")

        self.filename = "saved_data.json"

    def run_game(self):
        """ЗАПУСК ИГРЫ"""

        while True:  #ОТСЛЕЖИВАНИЕ ДЕЙСТВИЙ С КЛАВЫ
            self._check_events()
            if self.stats.game_active:
                self.ship.update()
                self._update_bullet()
                self._update_aliens()
            self._update_screen()

    def _update_screen(self):  #отвечает за то, что вообще на экране творится
        self.screen.fill(
            self.settings.bg_colour)  #Заполнить экран определенным цветом
        self.ship.blitme()  # Использовать метод показа корабля
        #self.charecter.blitme()  #MB I WILL DO IT
        for bullet in self.bullets.sprites():
            bullet.draw_bullet()
        self.aliens.draw(
            self.screen)  #показывает пришельцев на self.screen (общий экран)
        if not self.stats.game_active:
            self.play_button.draw_button()
        self.sb.show_score()  #Метод показа очков
        pygame.display.flip()  #обновление экрана

    def _check_events(self):  #общая проверка ивентов
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                self._check_keyDOWN(event)

            elif event.type == pygame.KEYUP:
                self._check_keyUP(event)
            elif event.type == pygame.MOUSEBUTTONDOWN:
                mouse_pos = pygame.mouse.get_pos()
                self._check_play_button(mouse_pos)

    def _check_keyDOWN(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_ESCAPE:  #стоп слово
            some_score = self.stats.high_score
            with open(self.filename, "w") as f:  #Открытие файла
                print("d")  #Лоигрование, что запись в файл идет
                json.dump(some_score, f)  #Сохранение результата
            sys.exit()

        elif event.key == pygame.K_SPACE:  #Вызов метода стрельбы пули
            self._fire_bullet()

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

    def _check_play_button(self, mouse_pos):
        button_clicked = self.play_button.rect.collidepoint(
            mouse_pos)  #проверка нажатия кнопки
        if button_clicked and not self.stats.game_active:  #если кнопка нажата и игра не запущена начинается игра
            self.settings.initialize_dynamic_settings()
            self.stats.reset_stats()
            self.stats.game_active = True
            self.sb.prep_score()
            self.sb.prep_level()
            self.sb.prep_ships()

            self.aliens.empty()
            self.bullets.empty()

            self._create_fleet()
            self.ship.center_ship()

            pygame.mouse.set_visible(False)  #Метод, чтобы мышка исчезла

    def _fire_bullet(self):  #отвечает за запуск пули
        if len(
                self.bullets
        ) < self.settings.bullet_allowed:  #Если длина меньше кол-во разрешенных пуль
            new_bullet = Bullet(self)
            self.bullets.add(new_bullet)

    def _update_bullet(
        self
    ):  #отвечает за устраниение пули, когда она достигнет определенной точки
        self.bullets.update()
        for bullet in self.bullets.copy():
            if bullet.rect.bottom <= 0:
                self.bullets.remove(bullet)
        #print (len(self.bullets))
        self._check_bullet()

    def _check_bullet(self):
        collisions = pygame.sprite.groupcollide(
            self.bullets, self.aliens, False,
            True)  #Проверка взаимодействия группы пули и группы пришельцев
        if collisions:  #Если есть коллизия
            for aliens in collisions.values():
                self.stats.score += self.settings.alien_score * len(aliens)
            self.sb.prep_score()
            self.sb.check_high_score()
        if not self.aliens:  #Если группа пришельцев пустая
            self.bullets.empty()
            self._create_fleet()
            self.settings.increase_speed()
            self.stats.level += 1
            self.sb.prep_level()

    def _ship_hit(self):  #Проверка был ли удра корабля
        if self.stats.ships_left >= 0:  #Если кол-во кораблей больше или равно нулю - продолжать действие
            self.stats.ships_left -= 1
            self.sb.prep_ships()

            self.aliens.empty()
            self.bullets.empty()

            self._create_fleet()
            self.ship.center_ship()

            sleep(0.5)  #Остановить игру на 0.5 сек
        else:
            self.stats.game_active = False
            pygame.mouse.set_visible(True)

    def _create_fleet(self):  #Создание флота пришельцев
        alien = Alien(self)
        alien_width, alien_height = alien.rect.size  #метод alien.rect.size возвращает ширину и длину пришельца
        ship_height = self.ship.rect.height  #высота корабля
        available_space_x = self.settings.screen_width - (
            2 * alien_width
        )  #настройки экрана - ширина пришельца * 2 (чтобы было место)
        available_space_y = self.settings.screen_height - (
            3 * alien_height
        ) - ship_height  #получаем настройки, чтобы узнать кол-во рядов, мы можем сделать
        number_rows = available_space_y // (
            2 * alien_height
        )  #считаем точное кол-во, чтобы у игрока был шанс нормально играть без проблем
        number_aliends = available_space_x // (2 * alien_width
                                               )  #кол-во пришельцев в ряду
        for row in range((number_rows - 2) // 2):  #допилить вариацию ряда
            for number in range(
                    number_aliends):  # вводим цикл для каждого пришельца
                self._create_alien(
                    number, row
                )  #для каждого нового пришельца, мы вызываем метод создания пришельца (указываем кол-во в ряду и кол-во рядом)
                self._create_alien_1(number, row + 1)

    def _create_alien(self, alien_number, row):  # создание пришельца
        alien = Alien(self)
        alien_width, alien_height = alien.rect.size  #Сначала идет ширина потом длина пришельца
        alien.x = alien_width + 2 * alien_width * alien_number  #определили расстояние между инепрешеленцами
        alien.rect.x = alien.x  #Расположение пришельца
        alien.rect.y = alien_height + 2 * alien_height * row
        self.aliens.add(alien)  #добавление пришельца в "список пришельцев"

    def _create_alien_1(self, alien_number, row):
        alien = Alien(self)
        alien_width, alien_height = alien.rect.size
        alien.x = alien_width + alien_width + 2 * alien_width * alien_number
        alien.rect.x = alien.x
        alien.rect.y = 2 * alien_height * row
        self.aliens.add(alien)

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

        if pygame.sprite.spritecollideany(self.ship, self.aliens):
            self._ship_hit()

        self._aliens_check_bottom()
        self._check_fleet()

    def _aliens_check_bottom(self):  #Проверка достиг ли пришелец дна
        for alien in self.aliens.sprites():
            if alien.rect.bottom >= self.screen_rect.bottom:
                self._ship_hit()
                break

    def _check_fleet(self):  #Проверка дошел ли пришелец до края
        for alien in self.aliens.sprites():
            if alien.check_edges():
                self._change_direction()
                break

    def _change_direction(self):  #Смена направления
        for alien in self.aliens.sprites(
        ):  #меняем направление каждого пришельца с помощью группы спрайт
            alien.rect.y += self.settings.fleet_drop_speed
        self.settings.fleet_direction *= -1
Ejemplo n.º 22
0
class TunnelEscape:
    """Overall class to manage game assets and behaivor"""

    def __init__(self):
        """ initialize the game, and create game resources"""
        pygame.init()
        self.settings = Settings()
        self.controlador = controlador()

        #lo uso para pruebas de terminal
        #self.screen = pygame.display.set_mode(
            #(self.settings.screen_width, self.settings.screen_height))
        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
        pygame.display.set_caption("Tunnel escape") 

        # Create an instance to store game statics,
        # And create a scoreboard
        self.stats = GameStats(self)
        self.sb = Scoreboard(self)

        # Crea una nueva nave a partir de la clase
        self.ship = Ship(self)
        self.bullets = pygame.sprite.Group()
        self.aliens = pygame.sprite.Group()

        self._create_fleet()

        # Make the play button.
        self.play_button = Button(self, "Play")

    def run_game(self):
        """start the main loop for the game"""
        while True:
            self._check_events()
            if self.stats.game_active:
                self.ship.update()
                self._update_bullets()
                self._update_aliens()

            self._update_screen()

    def _check_events(self):
        """check for new events"""
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                self._check_keydown_events(event)
            elif event.type == pygame.KEYUP:
                self._check_keyup_events(event)
            elif event.type == pygame.JOYAXISMOTION:
                self._check_axis_events(event)
            elif event.type == pygame.JOYBUTTONDOWN:
                self._check_buttonDown_events(event)
            elif event.type == pygame.JOYBUTTONUP:
                self._check_buttonUp_events(event)
            elif event.type == pygame.MOUSEBUTTONDOWN:
                mouse_pos = pygame.mouse.get_pos()
                self._check_play_button(mouse_pos)

    def _check_keydown_events(self,event):
        """ respond to keypresses"""
        if event.key == pygame.K_RIGHT:
            self.ship.moving_right = True
        elif event.key == pygame.K_LEFT:
            self.ship.moving_left = True
        elif event.key == pygame.K_q:
            sys.exit()
        elif event.key == pygame.K_SPACE:
            self._fire_bullet()

    def _check_keyup_events(self,event):
        """ respond to keyReleased"""
        if event.key == pygame.K_RIGHT:
            self.ship.moving_right = False
        elif event.key == pygame.K_LEFT:
            self.ship.moving_left = False

    def _check_axis_events(self,event):
        """ respond to analog stick events"""
        if event.axis == 1:
            if self.controlador.gamepad.get_axis(0) > 0.1:
                self.ship.moving_left = False
                self.ship.moving_right = True
            elif self.controlador.gamepad.get_axis(0) < -0.1:
                self.ship.moving_right = False
                self.ship.moving_left = True
            elif self.controlador.gamepad.get_axis(0) == 0:
                self.ship.moving_right = False
                self.ship.moving_left = False

    def _check_buttonDown_events(self,event):
        """ respond to buttonpresses gamepad events"""
        if event.button == 6:
            sys.exit()
        elif event.button == 0:
            self._fire_bullet()
        elif event.button == 7:

            # Reset the game settings.
            self.settings.initialize_dynamic_settings()
            
             # Reset the game statistics.
            self.stats.reset_stats()
            self.stats.game_active = True
            self.sb.prep_score()
            self.sb.prep_level()
            self.sb.prep_ships()

            # Get rid of any remaining aliens and bullets
            self.aliens.empty()
            self.bullets.empty()

            #create a new fllet and center
            self._create_fleet
            self.ship.center_ship()

            # hide the mouse cursor.
            pygame.mouse.set_visible(False)

    def _check_buttonUp_events(self,event):
        """ respond to buttonReleased gamepad events"""
    
    def _check_play_button(self,mouse_pos):
        """ Start a new game when the player clicks Play"""
        button_clicked = self.play_button.rect.collidepoint(mouse_pos)
        if button_clicked and not self.stats.game_active:

            # Reset the game settings.
            self.settings.initialize_dynamic_settings()

            # Reset the game statistics.
            self.stats.reset_stats()
            self.stats.game_active = True
            self.sb.prep_score()
            self.sb.prep_level()
            self.sb.prep_ships()

            # Get rid of any remaining aliens and bullets
            self.aliens.empty()
            self.bullets.empty()

            #create a new fllet and center
            self._create_fleet
            self.ship.center_ship()

            # hide the mouse cursor.
            pygame.mouse.set_visible(False)

    def _fire_bullet(self):
        """ Create a new bullet and add it to the bullets group."""
        if len(self.bullets) < self.settings.bullets_allowed:
            new_bullet = Bullet(self)
            self.bullets.add(new_bullet)

    def _update_bullets(self):
        """Update position of bullets and get rid of old bullets."""
        # update bullet positions.
        self.bullets.update()
        if not self.aliens:
            # Destroy existing bullets and create new fleet
            self.bullets.empty()
            self._create_fleet()

            # Get rid of bullets that have disappeared.
        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):
        """Respond to bullet-allien collisions."""
        # Remove any bullets and aliens that have collide
        collisions = pygame.sprite.groupcollide(self.bullets,self.aliens,
                                                True,True)
        if not self.aliens:
            # Destroy existing bullets and create new fleet.
            self.bullets.empty()
            self._create_fleet()
            self.settings.increase_speed()

            #increase level.
            self.stats.level += 1
            self.sb.prep_level()


        if collisions:
            for aliens in collisions.values():  
                self.stats.score += self.settings.alien_points * len(aliens) 
            self.sb.prep_score()
            self.sb.check_high_score()

    def _update_aliens(self):
        """ check if the fleet is at an edge, then update the position of
         aliens in the fleet"""
        self._check_fleet_edges()
        self.aliens.update()

        # Look for an alien-ship collisions.
        if pygame.sprite.spritecollideany(self.ship,self.aliens):
            self._ship_hit()
        
        # Look for aliens hiting the bottom of the screen.
        self._check_aliens_bottom()
    
    def _ship_hit(self):
        """Respond to the ship being hit by an alien"""
        if self.stats.ships_left > 0:
            # Decrement ships_left and update scoreboard
            self.stats.ships_left -=1
            self.sb.prep_ships()

            # Get rid of any remaining aliens and bullets.
            self.aliens.empty()
            self.bullets.empty()

            # Create a new fleet and center the ship.
            self._create_fleet()
            self.ship.center_ship()

            # Pause
            sleep(0.5)
        else:
            self.stats.game_active = False
            pygame.mouse.set_visible(True)

    def _check_aliens_bottom(self):
        """check if any aliens have reached the bottom of the screen."""
        screen_rect = self.screen.get_rect()
        for alien in self.aliens.sprites():
            if alien.rect.bottom >= screen_rect.bottom:
                #treat this the same as if the ship got hit.
                self._ship_hit()
                break

    def _create_fleet(self):
        """create the fleet of aliens"""
        alien = Alien(self)
        alien_width,alien_height = alien.rect.size

        # Determine the number of columns of aliens that fit in the screen.
        available_space_x = self.settings.screen_width - (2 * alien_width)
        number_aliens_x = available_space_x //(2 * alien_width)

        # Determine the number of rows of aliens that fit in the screen.
        ship_height = self.ship.rect.height
        avaiable_space_y = (self.settings.screen_height-(3*alien_height)
                            -ship_height)
        number_rows = avaiable_space_y//(2*alien_height)

        #create the full flate of aliens
        for row_number in range(number_rows):

        #create the first row of aliens.
            for alien_number in range(number_aliens_x):
                self._create_alien(alien_number,row_number)

    def _create_alien(self,alien_number,row_number):
        """ Create an alien and place it in the row"""        
        alien = Alien(self)
        alien_width,alien_height = alien.rect.size
        alien.x = alien_width + 2 * alien_width * alien_number
        alien.rect.x = alien.x
        alien.rect.y = alien_height + 2 * alien.rect.height * row_number
        self.aliens.add(alien)

    def _check_fleet_edges(self):
        """respond appropriately if any aliens have reached an edge"""
        for alien in self.aliens.sprites():
            if alien.check_edges():
                self._change_fleet_direction()
                break

    def _change_fleet_direction(self):
        """Drop the entire fleet and change the fleet direction"""
        for alien in self.aliens.sprites():
            alien.rect.y += self.settings.fleet_drop_speed
        self.settings.fleet_direction *= -1

    def _update_screen(self):
        """make the most recently drawn screen visible."""
        self.screen.fill(self.settings.bg_color)
        self.ship.blitme()
        for bullet in self.bullets.sprites():
            bullet.draw_bullet()
        self.aliens.draw(self.screen)

        # Draw the score information.
        self.sb.show_score()

        # Draw the play button if the game is inactive
        if not self.stats.game_active:
            self.play_button.draw_button()

        # make the most recently drawn screen visible
        pygame.display.flip()
Ejemplo n.º 23
0
class Game():
    def __init__(self):
        pygame.init()
        self.ai_settings = Settings()
        self.screen = pygame.display.set_mode(
            (self.ai_settings.screen_width, self.ai_settings.screen_height))
        pygame.display.set_caption("Inwazja obcych")

        # Utworzenie przycisku Gra
        self.play_button = Button(self.ai_settings, self.screen, 'Gra')

        # Utworzenie egzemplarza przenaczonego do przechowywania danych
        # statystycznych gry oraz utworzenie egzemplarza klasy Scoreboard
        self.stats = GameStats(self.ai_settings)
        self.sb = Scoreboard(self.ai_settings, self.screen, self.stats)

        #Utworzenie statku kosmicznego, grupy pocisków oraz grupy obcych
        self.ship = Ship(self.ai_settings, self.screen)
        self.bullets = Group()
        self.aliens = Group()

        # Utworzenie floty obcych
        self.create_fleet()

    def run(self):
        while True:
            self.check_events()
            if self.stats.game_active:
                self.ship.update()
                self.update_bullets()
                self.update_aliens()
            self.update_screen()

    def create_fleet(self):
        '''Utworzenie pełnej floty obcych.'''
        alien = Alien(self.ai_settings, self.screen)
        number_aliens_x = self.get_number_aliens_x(alien.rect.width)
        number_rows = self.get_number_rows(alien.rect.height)

        for row_number in range(number_rows):
            for alien_number in range(number_aliens_x):
                self.create_alien(alien_number, row_number)

    def get_number_aliens_x(self, alien_width):
        '''Ustalenie liczby obcych, którzy zmieszczą się w rzędzie.'''
        available_space_x = self.ai_settings.screen_width - 2 * alien_width
        number_aliens_x = int(available_space_x / (2 * alien_width))
        return number_aliens_x

    def get_number_rows(self, alien_height):
        '''Ustalenie ile rzędów obcych zmieści się na ekranie'''
        available_space_y = (self.ai_settings.screen_height -
                             3 * alien_height - self.ship.rect.height)
        number_rows = int(available_space_y / (2 * alien_height))
        return number_rows

    def create_alien(self, alien_number, row_number):
        '''Utwórz nowego obcego.'''
        alien = Alien(self.ai_settings, self.screen)
        alien_width = alien.rect.width
        alien.x = alien_width + 2 * alien_width * alien_number
        alien.rect.x = alien.x
        alien.rect.y = alien.rect.height + 2 * alien.rect.height * row_number
        self.aliens.add(alien)

    def check_events(self):
        '''Reakcja na zdarzenia generowane przez klawiaturę i mysz.'''
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                self.check_keydown_events(event)
            elif event.type == pygame.KEYUP:
                self.check_keyup_events(event)
            elif event.type == pygame.MOUSEBUTTONDOWN:
                mouse_x, mouse_y = pygame.mouse.get_pos()
                self.check_play_button(mouse_x, mouse_y)

    def check_keydown_events(self, event):
        '''Reakcja na naciśnięcie klawisza.'''
        if event.key == pygame.K_RIGHT:
            self.ship.moving_right = True
        elif event.key == pygame.K_LEFT:
            self.ship.moving_left = True
        elif event.key == pygame.K_SPACE:
            self.fire_bullet()
        elif event.key == pygame.K_g:
            self.start_game()
        elif event.key == pygame.K_q:
            sys.exit()

    def fire_bullet(self):
        # Utworzenie nowego pocisku i dodanie go do grupy pocisków
        if len(self.bullets) < self.ai_settings.bullets_allowed:
            new_bullet = Bullet(self.ai_settings, self.screen, self.ship)
            self.bullets.add(new_bullet)

    def start_game(self):
        '''Rozpoczęcie gry poprzez wywołanie domyślnych ustawień.'''
        if not self.stats.game_active:
            # Wyzerowanie ustawień dotyczących gry.
            self.ai_settings.initialize_dynamic_settings()
            # Ukrycie kursora myszy
            pygame.mouse.set_visible(False)
            # Wyzerowanie danych statystycznych gry
            self.stats.reset_stats()
            self.stats.game_active = True
            # Wyzerowanie obrazów tablicy wyników.
            self.sb.prep_score()
            self.sb.prep_high_score()
            self.sb.prep_level()
            # Usunięcie zawartości list aliens i bullets
            self.aliens.empty()
            self.bullets.empty()
            # Utworzenie nowej floty i wyśrodkowanie statku
            self.create_fleet()
            self.ship.center_ship()

    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

    def check_play_button(self, mouse_x, mouse_y):
        '''Rozpoczęcie nowej gry po kliknięciu przycisku Gra przez użytkownika'''
        button_clicked = play_button.rect.collidepoint(mouse_x, mouse_y)
        if button_clicked and not self.stats.game_active:
            self.start_game()

    def update_bullets(self):
        self.bullets.update()
        # Usunięcie pocisków, które znajdą się poza ekranem
        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):
        '''Reakcja na kolizję między pociskiem i obcym.'''
        collisions = pygame.sprite.groupcollide(self.bullets, self.aliens,
                                                True, True)
        if collisions:
            for aliens in collisions.values():
                self.stats.score += self.ai_settings.alien_points * len(aliens)
                self.sb.prep_score()
            self.check_high_score()
        if len(self.aliens) == 0:
            # Jeżeli cała flota została zniszczona, gracz przechodzi na kolejny poziom.
            self.bullets.empty()
            self.ai_settings.increase_speed()

            # Inkrementacja numeru poziomu.
            self.stats.level += 1
            self.sb.prep_level()

            self.create_fleet()

    def check_high_score(self):
        '''Sprawdzenie, czy mamy nowy najlpeszy wynik osiągnięty dotąd w grze.'''
        if self.stats.score > self.stats.high_score:
            self.stats.high_score = self.stats.score
            self.sb.prep_high_score()

    def update_aliens(self):
        '''Uaktualnienie położenia wszystkich obcych we flocie'''
        self.check_fleet_edges()
        self.aliens.update()
        # Wykrywanie kolizji między obcym i statkiem
        if pygame.sprite.spritecollideany(self.ship, self.aliens):
            self.ship_hit()
        # Wyszukiwanie obcych docierających do dolnej krawędzi ekranu
        self.check_aliens_bottom()

    def check_fleet_edges(self):
        '''Odpowiednia reakcja, gdy obcy dotrze do krawędzi ekranu.'''
        for alien in self.aliens.sprites():
            if alien.check_edges():
                self.change_fleet_direction()
                break

    def change_fleet_direction(self):
        '''Przesunięcie całej floty w dół i zmiana kierunku, w którym się ona porusza.'''
        for alien in self.aliens.sprites():
            alien.rect.y += self.ai_settings.fleet_drop_speed
        self.ai_settings.fleet_direction *= -1

    def ship_hit(self):
        '''Reakcja na uderzenie obcego w statek.'''
        if self.stats.ships_left > 0:
            # Zmniejszenie wartości przechowywanej w ships_left
            self.stats.ships_left -= 1
            # Uaktualnienie tablicy wyników.
            self.sb.prep_ships()
            # Usunięcie zawartości list aliens i bullets
            self.aliens.empty()
            self.bullets.empty()
            # Utworzenie nowej floty i wyśrodkowanie statku
            self.create_fleet()
            self.ship.center_ship()
            # Pauza
            sleep(0.5)
        else:
            self.stats.game_active = False
            pygame.mouse.set_visible(True)

    def check_aliens_bottom(self):
        '''Sprawdzenie, czy którykolwiek obcy dotarł do dolnej krawędzi ekranu'''
        screen_rect = self.screen.get_rect()
        for alien in self.aliens.sprites():
            if alien.rect.bottom >= screen_rect.bottom:
                self.ship_hit()
                break

    def update_screen(self):
        '''Uaktualnienie obrazów na ekranie i przejście do nowego ekranu.'''
        self.screen.fill(self.ai_settings.bg_color)
        # Ponowne wyświetlenie wszystkich pocisków pod warstwami statku kosmicznego i obcych
        for bullet in self.bullets.sprites():
            bullet.draw_bullet()
        self.ship.blitme()
        self.aliens.draw(self.screen)
        # Wyświetlenie informacji o punktacji.
        self.sb.show_score()
        # Wyświetlenie przycisku tylko wtedy, gdy gra jest nieaktywna
        if not self.stats.game_active:
            self.play_button.draw_button()

        pygame.display.flip()
Ejemplo n.º 24
0
class AlienInvasion:
    """overall class to manage game assets and behavior"""
    def __init__(self):
        """initialize the game and create game resources"""
        pygame.mixer.pre_init(44100, 16, 2, 4096)
        pygame.init()
        self.settings = Settings()

        self.screen = pygame.display.set_mode(
            (self.settings.screen_width, self.settings.screen_height))
        """
        # running the screen fullscreen
        self.screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN)
        self.settings.screen_width = self.screen.get_rect().width
        self.settings.sreen_height = self.screen.get_rect().height
        """

        pygame.display.set_caption("Alien Invasion")

        self.stats = GameStats(self)
        self.sb = Scoreboard(self)

        self.ship = Ship(self)
        self.bullets = pygame.sprite.Group()

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

        # make the play button
        self.play_button = Button(self, "Play")

        pygame.mixer.music.load("music/starwarstheme.mp3")
        pygame.mixer.music.set_volume(0.5)
        pygame.mixer.music.play(-1)

    def run_game(self):
        """start the main loop for the game"""
        while True:
            self._check_events()

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

            self._update_screen()

    def _check_events(self):
        """respond to keyboard and mouse events"""
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                self.save_high_score()
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                self._check_keydown_events(event)
            elif event.type == pygame.KEYUP:
                self._check_keyup_events(event)
            elif event.type == pygame.MOUSEBUTTONDOWN:
                mouse_pos = pygame.mouse.get_pos()
                self._check_play_button(mouse_pos)

    def _check_play_button(self, mouse_pos):
        """start a new game when the player clicks Play"""
        if self.play_button.rect.collidepoint(
                mouse_pos) and not self.stats.game_active:
            self.stats.reset_stats()
            self.stats.game_active = True
            self.sb.prep_score()
            self.sb.prep_level()
            self.sb.prep_ships()
            self.aliens.empty()
            self.bullets.empty()
            self._create_fleet()
            self.ship.center_ship()

            # reset speed
            self.settings.initialize_dynamic_settings()

            # hide the mouse cursor over the game window
            pygame.mouse.set_visible(False)

    def _check_keydown_events(self, event):
        """respond to keypresses"""
        if event.key == pygame.K_RIGHT:
            self.ship.moving_right = True
        elif event.key == pygame.K_LEFT:
            self.ship.moving_left = True
        elif event.key == pygame.K_SPACE:
            self._fire_bullet()
        elif event.key == pygame.K_q:
            self.save_high_score()
            sys.exit()
        elif event.key == pygame.K_b:
            self._bigger()
        elif event.key == pygame.K_p:
            self._start_game()
        elif event.key == pygame.K_d:
            self.save_high_score()
            with open("description.txt") as f:
                print(f.readline())
            sys.exit()

    def _check_keyup_events(self, event):
        """respond to lifting finger from key"""
        if event.key == pygame.K_RIGHT:
            self.ship.moving_right = False
        elif event.key == pygame.K_LEFT:
            self.ship.moving_left = False

    def _start_game(self):
        """respond to p button to start/restart the game"""
        self.stats.reset_stats()
        self.stats.game_active = True
        self.sb.prep_score()
        self.sb.prep_level()
        self.sb.prep_ships()
        self.aliens.empty()
        self.bullets.empty()
        self._create_fleet()
        self.ship.center_ship()

        # reset speed
        self.settings.initialize_dynamic_settings()

        # hide the mouse cursor over the game window
        pygame.mouse.set_visible(False)

    def _fire_bullet(self):
        """create a new bullet and add it to the bullets group"""
        if len(self.bullets) < self.settings.bullets_allowed:
            new_bullet = Bullet(self)
            self.bullets.add(new_bullet)

    def _update_bullets(self):
        """update the position of bullets and get rid of old bullets"""
        self.bullets.update()

        # get rid of bullets that have disappeared
        for bullet in self.bullets.copy():
            if bullet.rect.bottom <= 0:
                self.bullets.remove(bullet)
        self._check_bullet_alien_collision()

    def _check_bullet_alien_collision(self):
        """respond to bullet-alien collisions"""
        # remove any bullets and aliens that have collided
        collisions = pygame.sprite.groupcollide(self.bullets, self.aliens,
                                                True, True)

        if collisions:
            for aliens in collisions.values():
                self.stats.score += self.settings.alien_points * len(aliens)
            self.sb.prep_score()
            self.sb.check_high_score()

        # no aliens left in the fleet
        if not self.aliens:
            # destroy existing bullets and create a new fleet
            self.bullets.empty()
            self._create_fleet()
            self.stats.level += 1
            self.sb.prep_level()
            self.settings.increase_speed()

    def _create_fleet(self):
        """create a fleet of aliens"""
        # create an alien and find the number of aliens in a row
        # spacing between each alien is equal to one alien width
        alien = Alien(self)
        alien_width, alien_height = alien.rect.size
        # available_space_x decides how much space is available
        # after allowing for margins on the screen
        available_space_x = self.settings.screen_width - 2 * (alien_width)
        number_aliens_x = available_space_x // (2 * alien_width)

        # determine the number of rows of aliens that can fit on the screen
        ship_height = self.ship.rect.height
        available_space_y = self.settings.screen_height - 3 * (
            alien_height) - ship_height
        number_rows = available_space_y // (2 * alien_height)

        # create the full fleet of aliens
        for row_number in range(number_rows):
            for alien_number in range(number_aliens_x):
                self._create_alien(alien_number, row_number)

    def _create_alien(self, alien_number, row_number):
        """create an alien in the fleet"""
        alien = Alien(self)
        alien_width, alien_height = alien.rect.size
        alien.x = alien_width + 2 * alien_width * alien_number
        alien.rect.x = alien.x
        alien.rect.y = alien_height + 2 * alien_height * row_number
        self.aliens.add(alien)

    def _check_fleet_edges(self):
        """respond appropriately if any aliens have reached an edge"""
        for alien in self.aliens.sprites():
            if alien.check_edges():
                self._change_fleet_direction()
                break

    def _change_fleet_direction(self):
        """drop the entire fleet and change the fleet's direction"""
        for alien in self.aliens.sprites():
            alien.rect.y += self.settings.fleet_drop_speed
        self.settings.fleet_direction *= -1

    def _update_aliens(self):
        """update the positions of all aliens in the fleet"""
        self._check_fleet_edges()
        self.aliens.update()

        # look for alien-ship collisions
        if pygame.sprite.spritecollideany(self.ship, self.aliens):
            self._ship_hit()

        # look for aliens hitting the bottom of the screen
        self._check_aliens_bottom()

    def _update_screen(self):
        """update images on the screen and flip to the new screen"""
        self.screen.fill(self.settings.bg_color)
        self.ship.blitme()
        for bullet in self.bullets.sprites():
            bullet.draw_bullet()
        self.aliens.draw(self.screen)

        # draw the score information
        self.sb.show_score()

        # draw the play button if the game is inactive
        if not self.stats.game_active:
            self.play_button.draw_button()

        pygame.display.flip()

    def _bigger(self):
        """switch to a bigger display"""
        self.screen = pygame.display.set_mode((1350, 700))
        self.settings.screen_width = self.screen.get_rect().width
        self.settings.sreen_height = self.screen.get_rect().height
        self.ship = Ship(self)
        self.sb = Scoreboard(self)

    def _ship_hit(self):
        """respond to the ship being hit by an alien"""
        if self.stats.ships_left > 1:  # allow n ships, not n backup ships
            # decrement the ships_left
            self.stats.ships_left -= 1
            self.sb.prep_ships()

            # get rid of bullets and aliens left
            self.aliens.empty()
            self.bullets.empty()

            # create a new fleet and center the ship
            self._create_fleet()
            self.ship.center_ship()

            # pause
            sleep(1)

        else:
            self.stats.game_active = False
            pygame.mouse.set_visible(True)

    def _check_aliens_bottom(self):
        """check if any aliens have reached the bottom of the screen"""
        screen_rect = self.screen.get_rect()
        for alien in self.aliens.sprites():
            if alien.rect.bottom >= screen_rect.bottom:
                self._ship_hit()
                break

    def save_high_score(self):
        """save high score, if made, in the game"""
        with open("high.data", "w") as f:
            f.write(str(self.sb.stats.high_score))
Ejemplo n.º 25
0
class AlienInvasion:
    """Overall class to manage game assets and behavior."""
    def __init__(self):
        """Initialize the game, and create game resources."""
        pygame.init()
        # Set up the window screen, and background image
        self.screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN)
        self.image = pygame.image.load('images/ufo-4987627_1920.bmp')
        self.image = pygame.transform.scale(
            self.image, (self.screen.get_width(), self.screen.get_height()))
        self.rect = self.image.get_rect()

        # Control the settings of the game via Settings class
        self.settings = Settings()
        self.settings.screen_width = self.screen.get_rect().width
        self.settings.screen_height = self.screen.get_rect().height

        pygame.display.set_caption("Alien Invasion")
        self.music = self.settings.bg_music()

        # Manipulate game statistics & Scoreboard.
        self.stats = GameStats(self)
        self.sb = Scoreboard(self)

        # Create the actors of the game
        self.ship = Ship(self)
        self.bullets = pygame.sprite.Group()
        self.aliens = pygame.sprite.Group()
        self._create_fleet()

        # Make the Play button.
        self.play_button = Button(self, "Play")

        # flags
        self.keep_firing = False

    def run_game(self):
        """Start the main loop for the game."""
        """ Main Function of the game."""
        while True:
            self._check_events()
            if self.stats.game_active:
                self.ship.update()
                self._update_bullets()
                self._update_aliens()
                self._fire_bullet()
            self._update_screen()

    def _check_events(self):
        """ Watch for keyboard and mouse events. """
        for event in pygame.event.get():
            # Press x on top to quit
            if event.type == pygame.QUIT:
                sys.exit()
            # Check if any key is pressed down or released
            elif event.type == pygame.KEYDOWN:
                self._check_keydown_events(event)
            elif event.type == pygame.KEYUP:
                self._check_keyup_events(event)
            elif event.type == pygame.MOUSEBUTTONDOWN:
                mouse_pos = pygame.mouse.get_pos()
                self._check_play_button(mouse_pos)

    def _check_play_button(self, mouse_pos):
        """Start a new game when the player clicks Play."""
        button_clicked = self.play_button.rect.collidepoint(mouse_pos)
        if button_clicked and not self.stats.game_active:
            # initialize the game settings every time
            self.settings.initialize_dynamic_settings()
            # Reset the game statistics and prep the scoreboard.
            self.stats.reset_stats()
            self.stats.game_active = True
            self.sb.prep_score()
            self.sb.prep_level()
            self.sb.prep_ships()

            # Get rid of any remaining aliens and bullets.
            self.aliens.empty()
            self.bullets.empty()
            # Create a new fleet and center the ship.
            self._create_fleet()
            self.ship.center_ship()
            # Hide the mouse cursor.
            pygame.mouse.set_visible(False)

    def _check_keydown_events(self, event):
        """Respond to key presses."""
        if event.key == pygame.K_RIGHT:
            self.ship.moving_right = True
        elif event.key == pygame.K_LEFT:
            self.ship.moving_left = True
        elif event.key == pygame.K_q:
            sys.exit(0)
        elif event.key == pygame.K_SPACE:
            self.keep_firing = True

    def _check_keyup_events(self, event):
        """Respond to key releases."""
        if event.key == pygame.K_RIGHT:
            self.ship.moving_right = False
        elif event.key == pygame.K_LEFT:
            self.ship.moving_left = False
        elif event.key == pygame.K_SPACE:
            self.keep_firing = False

    def _fire_bullet(self):
        """Create a new bullet and add it to the bullets group."""
        if self.keep_firing and len(
                self.bullets) < self.settings.max_num_bullets:
            new_bullet = Bullet(self)
            self.bullets.add(new_bullet)

    def _update_bullets(self):
        """ Update the bullets positions """
        self.bullets.update()
        # Get rid of bullets that have disappeared.
        for bullet in self.bullets.copy():
            if bullet.rect.bottom <= 0:
                self.bullets.remove(bullet)

        # Check if any bullet collided with alien
        self._check_bullet_alien_collisions()

    def _check_bullet_alien_collisions(self):
        """Respond to bullet-alien collisions."""
        # Remove any bullets and aliens that have collided.
        # Check for any bullets that have hit aliens.
        # If so, get rid of the bullet and the alien.
        collisions = pygame.sprite.groupcollide(self.bullets, self.aliens,
                                                True, True)

        # If there is a collision, loop through the dict and increase score
        # check if the high score has been attained, and update it if so
        if collisions:
            for aliens in collisions.values():
                self.stats.score += self.settings.alien_points * len(aliens)
            self.sb.prep_score()
            self.sb.check_high_score()

        # If all aliens have been destroyed
        if not self.aliens:
            # Start a new level, by doing the following
            # Destroy existing bullets and create new fleet.
            self.bullets.empty()
            self._create_fleet()
            self.settings.increase_speed()
            # Increase level.
            self.stats.level += 1
            self.sb.prep_level()

    def _create_fleet(self):
        """Create the fleet of aliens."""
        # Make an alien.
        alien = Alien(self)
        alien_width, alien_height = alien.rect.size
        # see how much space we have to fit in some number of aliens
        available_space_x = self.settings.screen_width - (2 * alien_width)
        number_aliens_x = available_space_x // (2 * alien_width)

        ship_height = self.ship.rect.height
        # see how much space we have to fit in some number of aliens
        available_space_y = (self.settings.screen_height - (4 * alien_height) -
                             ship_height)
        number_rows = available_space_y // (2 * alien_height)

        # Create all rows and columns of aliens.
        for row_number in range(number_rows):
            for alien_number in range(number_aliens_x):
                self._create_alien(alien_number, row_number)

    def _create_alien(self, alien_number, row_number):
        # Create an alien and place it in the row.
        alien = Alien(self)
        alien_width, alien_height = alien.rect.size

        # set up the aliens position accordingly
        alien.x = alien_width + 2 * alien_width * alien_number
        alien.rect.x = alien.x
        alien.rect.y = alien.rect.height + 2 * alien.rect.height * row_number

        # Add it to the group of aliens through the sprite class
        self.aliens.add(alien)

    def _update_aliens(self):
        """ Check if the fleet is at an edge, then update the positions of all aliens in the fleet. """
        self._check_fleet_edges()
        self.aliens.update()

        # Look for alien-ship collisions.
        if pygame.sprite.spritecollideany(self.ship, self.aliens):
            self._ship_hit()

        # Look for aliens hitting the bottom of the screen.
        self._check_aliens_bottom()

    def _check_fleet_edges(self):
        """Respond appropriately if any aliens have reached an edge."""
        for alien in self.aliens.sprites():
            if alien.check_edges():
                self._change_fleet_direction()
                break

    def _change_fleet_direction(self):
        """Drop the entire fleet and change the fleet's direction."""
        for alien in self.aliens.sprites():
            alien.rect.y += self.settings.fleet_drop_speed
        self.settings.fleet_direction *= -1

    def _ship_hit(self):
        """Respond to the ship being hit by an alien."""
        # If no more lives, then end the game by setting the flag
        if self.stats.ships_left == 0:
            self.stats.game_active = False
            pygame.mouse.set_visible(True)
        else:
            # Decrement ships_left.
            self.stats.ships_left -= 1
            self.sb.prep_ships()
            # Get rid of any remaining aliens and bullets.
            self.aliens.empty()
            self.bullets.empty()

            # Create a new fleet and center the ship.
            self._create_fleet()
            self.ship.center_ship()

            # Pause for 0.7 seconds.
            sleep(0.7)

    def _check_aliens_bottom(self):
        """Check if any aliens have reached the bottom of the screen."""
        screen_rect = self.screen.get_rect()
        for alien in self.aliens.sprites():
            if alien.rect.bottom >= screen_rect.bottom:
                # Treat this the same as if the ship got hit.
                self._ship_hit()
                break

    def _update_screen(self):
        """ Redraw the screen during each pass through the loop. """
        self.screen.fill(self.settings.bg_color)
        self.screen.blit(self.image, self.rect)
        # draw the ship on the screen
        self.ship.blitme()
        # Draw the bullets on the screen
        for bullet in self.bullets.sprites():
            bullet.draw_bullet()
        # Draw the group of aliens
        self.aliens.draw(self.screen)
        # show the scoreboard on screen
        self.sb.show_score()

        # Draw the play button if the game is inactive.
        if not self.stats.game_active:
            self.play_button.draw_button()

        # Make the most recently drawn screen visible.
        pygame.display.flip()
Ejemplo n.º 26
0
class AlienInvasion:
    """Overall class to manage game assets and behavior"""
    def __init__(self):
        """Initialize the game, and create game resources"""
        pygame.init()
        self.settings = Settings()

        if self.settings.fullscreen == True:
            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
        else:
            self.screen = pygame.display.set_mode(
                (self.settings.screen_width, self.settings.screen_height))
            pygame.display.set_caption("Alien Invasion")

        # Create an instance to store game stats
        self.stats = GameStats(self)
        self.sb = Scoreboard(self)

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

        self._create_fleet()
        self.play_button = Button(self, 'Play')

    def run_game(self):
        """Start the main loop for the game"""
        while True:
            self._check_events()

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

            self._update_screen()

    def _check_events(self):
        """Respond to keyboard and mouse events"""
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                self.stats.save_high_score()
                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_keydown_events(self, event):
        """"Respond to keydown events"""
        if event.key == pygame.K_RIGHT:
            #Move the ship to the right
            self.ship.moving_right = True
        elif event.key == pygame.K_LEFT:
            self.ship.moving_left = True
        elif event.key == pygame.K_q:
            self.stats.save_high_score()
            sys.exit()
        elif event.key == pygame.K_r:
            #New game
            self._reset_game()
        elif event.key == pygame.K_SPACE:
            self._fire_bullet()

    def _check_keyup_events(self, event):
        """Respond to keyup events"""
        if event.key == pygame.K_RIGHT:
            self.ship.moving_right = False
        elif event.key == pygame.K_LEFT:
            self.ship.moving_left = False

    def _check_play_button(self, mouse_pos):
        button_clicked = self.play_button.rect.collidepoint(mouse_pos)
        if button_clicked and not self.stats.game_active:
            self._reset_game()

    def _ship_hit(self):
        """Respond to ship being hit"""
        if self.stats.ships_left > 0:
            # Decrement ships left
            self.stats.ships_left -= 1
            self.sb.prep_ships()

            # Get rid of any remaining aliens and bullets
            self.aliens.empty()
            self.bullets.empty()

            # Create a new fleet, center ship, and pause for .5 seconds
            self._create_fleet()
            self.ship.center_ship()
            sleep(0.5)
        else:
            self.stats.game_active = False
            pygame.mouse.set_visible(True)

    def _fire_bullet(self):
        """Create a new bullet and add it to the bullets group"""
        if len(self.bullets) < self.settings.bullets_allowed:
            new_bullet = Bullet(self)
            self.bullets.add(new_bullet)

    def _update_bullets(self):
        """Update position of bullets and get rid of old ones"""
        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):
        """Check for bullet alien collisions and remove both"""
        collisions = pygame.sprite.groupcollide(self.bullets, self.aliens,
                                                True, True)

        if collisions:
            for aliens in collisions.values():
                self.stats.score += self.settings.alien_points * len(aliens)
            self.sb.prep_score()
            self.sb.check_high_score()

        # If all aliens are dead create new fleet
        if not self.aliens:
            self.bullets.empty()
            self._create_fleet()
            self.settings.increase_speed()
            self.stats.level += 1
            self.sb.prep_level()

    def _create_fleet(self):
        """Create the fleet of aliens"""
        alien = Alien(self)
        alien_width, alien_height = alien.rect.size
        available_space_x = self.settings.screen_width - (2 * alien_width)
        number_aliens_x = available_space_x // (2 * alien_width)

        # Determine the number of rows of aliends that fit on screen
        ship_height = self.ship.rect.height
        available_space_y = (self.settings.screen_height - (3 * alien_height) -
                             ship_height)
        number_rows = available_space_y // (2 * alien_height)

        # Create full fleet of aliens
        for row_number in range(number_rows):
            for alien_number in range(number_aliens_x):
                self._create_alien(alien_number, row_number)

    def _create_alien(self, alien_number, row_number):
        """Create an alien and place it in the row"""
        alien = Alien(self)
        alien_width, alien_height = alien.rect.size
        alien.x = alien_width + 2 * alien_width * alien_number
        alien.rect.x = alien.x
        alien.rect.y = alien.rect.height + 2 * alien.rect.height * row_number
        self.aliens.add(alien)

    def _update_aliens(self):
        """Update position of the alien fleet"""
        self._check_fleet_edges()
        self.aliens.update()

        # Look for alien-shop collisions
        if pygame.sprite.spritecollideany(self.ship, self.aliens):
            self._ship_hit()
        # Look for aliens reaching bottom
        self._check_aliens_bottom()

    def _check_fleet_edges(self):
        """Respond if any aliens reach an edge"""
        for alien in self.aliens.sprites():
            if alien.check_edges():
                self._change_fleet_direction()
                break

    def _change_fleet_direction(self):
        """Drop the fleet and change direction"""
        for alien in self.aliens.sprites():
            alien.rect.y += self.settings.fleet_drop_speed
        self.settings.fleet_direction *= -1

    def _check_aliens_bottom(self):
        """Chck if any aliens hit bottom of screen"""
        screen_rect = self.screen.get_rect()
        for alien in self.aliens.sprites():
            if alien.rect.bottom >= screen_rect.bottom:
                #treat this as if ship was hit
                self._ship_hit()
                break

    def _update_screen(self):
        """Update images on the screen, and flip to the new screen"""
        self.screen.fill(self.settings.bg_color)
        self.ship.blitme()
        for bullet in self.bullets.sprites():
            bullet.draw_bullet()
        self.aliens.draw(self.screen)
        self.sb.show_score()

        # Draw the play button if game not active
        if not self.stats.game_active:
            self.play_button.draw_button()

        pygame.display.flip()

    def _reset_game(self):
        self.settings.initialize_dynamic_settings()
        self.stats.reset_stats()
        self.stats.game_active = True
        self.sb.prep_score()
        self.sb.prep_level()
        self.sb.prep_ships()

        self.aliens.empty()
        self.bullets.empty()

        self._create_fleet()
        self.ship.center_ship()
        pygame.mouse.set_visible(False)
Ejemplo n.º 27
0
def run_game():
    # Initialize game and create a screen object
    pygame.init()

    si_settings = Settings()

    screen = pygame.display.set_mode((si_settings.screen_width, si_settings.screen_height))
    pygame.display.set_caption("Space Invaders")

    # Make the Menu and the Play Game and High Scores buttons.
    menu = Menu(si_settings, screen)
    play_button = Button(si_settings, screen, "PLAY GAME", (si_settings.screen_width * 2.75) / 7, (si_settings.screen_height * 5.25) / 7)
    high_scores_button = Button(si_settings, screen, "HIGH SCORES", (si_settings.screen_width * 2.65) / 7, (si_settings.screen_height * 6) / 7)

    # Create an instance to store game statistics and create a scoreboard.
    stats = GameStats(si_settings)
    sb = Scoreboard(si_settings, screen, stats)

    # Make a ship, a group of bullets, and a group of aliens
    ship = Ship(si_settings, screen)
    bullets = Group()
    alienBullets = Group()
    aliens = Group()

    images = ["images/alien1.png", "images/alien2.png", "images/alien3.png"]

    random = randint(0, 10)
    ufo_random = randint(0, 10)
    start_ticks = pygame.time.get_ticks()

    # Create the ufo
    ufo = None

    # Create the fleet of aliens.
    gf.create_fleet(si_settings, screen, ship, aliens, images)

    # Load the background music
    # bg_music = pygame.mixer.music("audio/background_music.mp3")

    # Start the main loop for the game
    while True:
        # Watch for keyboard and mouse events.
        gf.check_events(si_settings, screen, stats, sb, menu, play_button, high_scores_button, ship, aliens, bullets, alienBullets, images)

        if stats.game_active:
            seconds = int((pygame.time.get_ticks() - start_ticks) / 1000)
            if seconds - previous_time == random:
                gf.fire_back(si_settings, screen, aliens, alienBullets)
                previous_time = seconds
                random = randint(5, 10)
            if seconds - ufo_previous_time == ufo_random:
                ufo = gf.create_ufo(si_settings)
                ufo_previous_time = seconds
                ufo_random = randint(20, 30)
                print("UFO Random: " + str(ufo_random) + "    Seconds: " + str(seconds) + "   UFO Previous Time: " + str(ufo_previous_time))
            ship.update()
            gf.update_bullets(si_settings, screen, stats, sb, ship, aliens, bullets, alienBullets, images)
            gf.update_aliens(si_settings, screen, stats, sb, ship, aliens, bullets, alienBullets, images, (seconds - previous_time), ufo)
        else:
            previous_time = int(pygame.time.get_ticks() / 1000)
            ufo_previous_time = int(pygame.time.get_ticks() / 1000)

        gf.update_screen(si_settings, screen, stats, sb, ship, aliens, bullets, alienBullets, menu, play_button, high_scores_button)
Ejemplo n.º 28
0
def run_game(screenmode=0):
    # Initialize pygame, settings, and screen object.
    pygame.init()
    ai_settings = Settings()

    if screenmode:
        #fullscreen speeds up game, but cannot see terminal output for debugging
        screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN)
        ai_settings.screen_width = screen.get_rect().width
        ai_settings.screen_height = screen.get_rect().height
        print(screenmode)
    else:
        screen = pygame.display.set_mode(
            (ai_settings.screen_width, ai_settings.screen_height))
        print('windowed mode')

    pygame.display.set_caption("Alien Invasion - Press p to exit")

    # Creat instances of several class objects.
    play_button = Button(ai_settings, screen, "Play")
    stats = GameStats(ai_settings)
    ship = Ship(ai_settings, screen, 1)
    ship2 = Ship(ai_settings, screen, 2)
    bullets = Group()
    alien_bullets = Group()
    aliens = Group()
    leaderboard = Leaderboard(stats, screen, ai_settings)
    sb = Scoreboard(ai_settings, screen, stats)
    textinput = ti.TextInput()

    # Create the fleet of aliens.
    gf.create_fleet(ai_settings, screen, ship, aliens, stats)

    # Start the main loop for the game.
    while ai_settings.quitflag:
        gf.check_events(ai_settings, screen, stats, sb, play_button, ship,
                        aliens, bullets, ship2)
        if stats.game_active:
            gf.update_ships(ai_settings, screen, stats, sb, ship, aliens,
                            bullets, alien_bullets, ship2, leaderboard,
                            textinput)
            gf.update_bullets(ai_settings, screen, stats, sb, ship, aliens,
                              bullets, alien_bullets, ship2, leaderboard,
                              textinput)
            gf.update_aliens(ai_settings, screen, stats, sb, ship, aliens,
                             bullets, alien_bullets, ship2, leaderboard,
                             textinput)
        gf.update_screen(ai_settings, screen, stats, sb, ship, aliens, bullets,
                         play_button, alien_bullets, ship2)

    leaderboard.read_high_score(stats)
    if stats.score > leaderboard.previous_high_score:
        leaderboard.new_high_score(ai_settings, screen, textinput, stats)

    ai_settings.quitflag = 1
    while ai_settings.quitflag:
        gf.check_events(ai_settings, screen, stats, sb, play_button, ship,
                        aliens, bullets, ship2)
        leaderboard.display(ai_settings, screen)

    pygame.display.quit()
    pygame.quit()
    exit()
Ejemplo n.º 29
0
class AlienInvasion:
    """overall class to manage game assets and behavior"""
    def __init__(self):
        """initialize the game, and create the game resources."""
        pygame.init()
        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
        pygame.display.set_caption("Alien Invasion")

        # Create an instance to store game stats and create a scoreboard
        self.stats = GameStats(self)
        self.sb = Scoreboard(self)
        self.ship = Ship(self)
        self.bullets = pygame.sprite.Group()
        self.aliens = pygame.sprite.Group()

        self._create_fleet()
        # Make the play button
        self.play_button = Button(self, "Play")

    def run_game(self):
        """starts the main loop for the game."""
        while True:
            # Watch for the keyboard and mouse events.
            self._check_events()

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

    def _check_events(self):
        """Responds to keypresses and mouse events."""
        # Watch for the keyboard and mouse events.
        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):
        """Start a new game when the player clicks play."""
        button_clicked = self.play_button.rect.collidepoint(mouse_pos)
        if button_clicked and not self.stats.game_active:
            # Reset the game settings.
            self.settings.initialize_dynamic_settings()
            # Reset the game statistics
            self.stats.reset_stats()
            self.stats.game_active = True
            self.sb.prep_score()
            self.sb.prep_level()
            self.sb.prep_ships()

            # Get rid of any remaining aliens and bullets.
            self.aliens.empty()
            self.bullets.empty()

            # Create a new fleet and center the ship
            self._create_fleet()
            self.ship.center_ship()

            # Hide the mouse cursor
            pygame.mouse.set_visible(False)

    def _check_keydown_events(self, event):
        """Respond to keypresses."""
        if event.key == pygame.K_RIGHT:
            # Move the ship to the right
            self.ship.moving_right = True
        elif event.key == pygame.K_LEFT:
            # Move the ship to the left
            self.ship.moving_left = True
        elif event.key == pygame.K_q:
            sys.exit()
        elif event.key == pygame.K_SPACE:
            self._fire_bullet()

    def _check_keyup_events(self, event):
        """REspond to key releases."""
        if event.key == pygame.K_RIGHT:
            self.ship.moving_right = False
        elif event.key == pygame.K_LEFT:
            self.ship.moving_left = False

    def _fire_bullet(self):
        """Create a new bullet and add it to the bullets group."""
        if len(self.bullets) < self.settings.bullets_allowed:
            new_bullet = Bullet(self)
            self.bullets.add(new_bullet)

    def _update_screen(self):
        """Update image on the screen and flip to the new screen."""
        self.screen.fill(self.settings.bg_color)
        self.ship.blitme()
        for bullet in self.bullets.sprites():
            bullet.draw_bullet()
        self.aliens.draw(self.screen)

        # Draw th score information
        self.sb.show_score()
        # Draw the play button if the game is inactive
        if not self.stats.game_active:
            self.play_button.draw_button()
        pygame.display.flip()

    def _update_bullets(self):
        """Update position of bullets and get rid of old bullets."""
        # Update bullet positions.
        self.bullets.update()
        # Get rid of bullets that have disappeared
        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):
        """Respond to bullet-alien collisions."""
        # remove any bullets and aliens that have collided
        collisions = pygame.sprite.groupcollide(self.bullets, self.aliens,
                                                True, True)

        if collisions:
            for aliens in collisions.values():
                self.stats.score += self.settings.alien_points * len(aliens)
            self.sb.prep_score()
            self.sb.check_high_score()

        if not self.aliens:
            # Destroy existing bullets and creat a new fleet
            self.bullets.empty()
            self._create_fleet()
            self.settings.increase_speed()

            # Increase level
            self.stats.level += 1
            self.sb.prep_level()

    def _create_alien(self, alien_number, row_number):
        """Create an alien and place it in the row"""
        alien = Alien(self)
        alien_width, alien_height = alien.rect.size
        alien.x = alien_width + 2 * alien_width * alien_number
        alien.rect.x = alien.x
        alien.rect.y = alien.rect.height + 2 * alien.rect.height * row_number
        self.aliens.add(alien)

    def _create_fleet(self):
        """Create the fleet of aliens."""
        # Create an aliena nd find the number of aliens in row
        # Spacing between each alien is equal to one alien width
        alien = Alien(self)
        alien_width, alien_height = alien.rect.size
        available_space_x = self.settings.screen_width - (2 * alien_width)
        number_alien_x = available_space_x // (2 * alien_width)

        # Determine the number of rows of aliens that fit on the screen
        ship_height = self.ship.rect.height
        available_space_y = (self.settings.screen_height - (3 * alien_height) -
                             ship_height)
        number_rows = available_space_y // (2 * alien_height)

        # Create the ful fleet of alines
        for row_number in range(number_rows):
            for alien_number in range(number_alien_x):
                # Create an alien and place it in the row.
                self._create_alien(alien_number, row_number)

    def _check_fleet_edges(self):
        """Respond appropriately if any aliens have reached an edge"""
        for alien in self.aliens.sprites():
            if alien.check_edges():
                self._change_fleet_direction()
                break

    def _check_aliens_bottom(self):
        """Check if any aliens have reached the bottom of the screen."""
        screen_rect = self.screen.get_rect()
        for alien in self.aliens.sprites():
            if alien.rect.bottom >= screen_rect.bottom:
                # Treat this the same as if the ship got hit.
                self._ship_hit()
                break

    def _change_fleet_direction(self):
        """Droip the entire fleet and change the fleet's direction"""
        for alien in self.aliens.sprites():
            alien.rect.y += self.settings.fleet_drop_speed
        self.settings.fleet_direction *= -1

    def _update_aliens(self):
        """Update the positions of all aliens in teh fleet."""
        self._check_fleet_edges()
        self.aliens.update()

        # Look for alien-ship collisions
        if pygame.sprite.spritecollideany(self.ship, self.aliens):
            self._ship_hit()

        # Look for aliens hitting the bottom of the screen.
        self._check_aliens_bottom()

    def _ship_hit(self):
        """Respond to the ship being hit by an alien."""
        if self.stats.ships_left > 0:
            # Decrement ships_left and update scoreboard
            self.stats.ships_left -= 1
            self.sb.prep_ships()

            # Get rid of any remaining aliens and bullets
            self.aliens.empty()
            self.bullets.empty()

            # Create a new fleet and center the ship.
            self._create_fleet()
            self.ship.center_ship()

            # Pause
            sleep(0.5)
        else:
            self.stats.game_active = False
            pygame.mouse.set_visible(True)
Ejemplo n.º 30
0
def run_game():
    # initialize pygame, settings, and create screen object
    pygame.init()
    ai_settings = Settings()
    screen = pygame.display.set_mode(
        (ai_settings.screen_width, ai_settings.screen_height))
    pygame.display.set_caption("Alien Invasion")

    # make play and high score button
    play_button = Button(screen, "Play", 650)
    high_score_button = Button(screen, "High Score", 700)

    # make start screen text
    title1 = Text(screen, "SPACE",
                  screen.get_rect().centerx, 65, 500, 100, (255, 255, 255),
                  250)
    title2 = Text(screen, "INVADERS",
                  screen.get_rect().centerx, 175, 500, 100, (0, 255, 0), 158)
    high_score_title1 = Text(screen, "HIGH", (screen.get_rect().centerx - 125),
                             30, 180, 70, (255, 255, 255), 100)
    high_score_title2 = Text(screen, "SCORE", (screen.get_rect().centerx + 90),
                             30, 250, 70, (0, 255, 0), 100)
    alien_1_score = Text(screen, "= 10 PTS", (screen.get_rect().centerx + 65),
                         300, 220, 50, (255, 255, 255), 70)
    alien_2_score = Text(screen, "= 20 PTS", (screen.get_rect().centerx + 65),
                         380, 220, 50, (255, 255, 255), 70)
    alien_3_score = Text(screen, "= 40 PTS", (screen.get_rect().centerx + 65),
                         460, 220, 50, (255, 255, 255), 70)
    ufo_score = Text(screen, "= ?? PTS", (screen.get_rect().centerx + 65), 540,
                     220, 50, (255, 255, 255), 70)
    hs1 = Text(screen, "1", (screen.get_rect().centerx - 125), 100, 50, 50,
               (255, 255, 255), 65)
    hs2 = Text(screen, "2", (screen.get_rect().centerx - 125), 155, 50, 50,
               (255, 255, 255), 65)
    hs3 = Text(screen, "3", (screen.get_rect().centerx - 125), 210, 50, 50,
               (255, 255, 255), 65)
    hs4 = Text(screen, "4", (screen.get_rect().centerx - 125), 265, 50, 50,
               (255, 255, 255), 65)
    hs5 = Text(screen, "5", (screen.get_rect().centerx - 125), 320, 50, 50,
               (255, 255, 255), 65)
    hs6 = Text(screen, "6", (screen.get_rect().centerx - 125), 375, 50, 50,
               (255, 255, 255), 65)
    hs7 = Text(screen, "7", (screen.get_rect().centerx - 125), 430, 50, 50,
               (255, 255, 255), 65)
    hs8 = Text(screen, "8", (screen.get_rect().centerx - 125), 485, 50, 50,
               (255, 255, 255), 65)
    hs9 = Text(screen, "9", (screen.get_rect().centerx - 125), 540, 50, 50,
               (255, 255, 255), 65)
    hs10 = Text(screen, "10", (screen.get_rect().centerx - 125), 595, 50, 50,
                (255, 255, 255), 65)

    # make start screen images

    alien_1_img = Image(screen, 'images/alien_1_1.bmp',
                        (screen.get_rect().centerx - 150), 300)
    alien_2_img = Image(screen, 'images/alien_2_1.bmp',
                        (screen.get_rect().centerx - 150), 380)
    alien_3_img = Image(screen, 'images/alien_3_1.bmp',
                        (screen.get_rect().centerx - 150), 460)
    ufo_img = Image(screen, 'images/ufo_1.bmp',
                    (screen.get_rect().centerx - 178), 540)

    # Create an instance to store game stats and create a scoreboard
    high_scores = HighScores()
    stats = GameStats(ai_settings, high_scores)
    sb = Scoreboard(ai_settings, screen, stats)

    # Make a ship, a group of bullets, and a group of aliens, and ufo group
    bullets_ship = Group()
    bullets_alien = Group()
    bunker1 = Group()
    bunker2 = Group()
    bunker3 = Group()
    aliens = Group()
    alien_type = ['images/alien_1_1.bmp', 'images/alien_1_2.bmp']
    ufo = Group()
    ufo_imgs = ['images/ufo_1.bmp', 'images/ufo_2.bmp']
    points = 10

    # create a fleet of aliens
    gf.create_fleet(ai_settings, screen, stats, alien_type, points, aliens,
                    ufo_imgs, ufo)

    gf.create_bunker(screen, 1, bunker1)
    gf.create_bunker(screen, 2, bunker2)
    gf.create_bunker(screen, 3, bunker3)

    # create ship
    ship = Ship(ai_settings, screen)

    # add music
    pygame.mixer.set_reserved(0)
    pygame.mixer.set_reserved(1)
    pygame.mixer.set_reserved(2)
    pygame.mixer.set_reserved(3)
    pygame.mixer.set_reserved(4)
    pygame.mixer.set_reserved(5)
    ship_shoot = pygame.mixer.Sound('audio/ship_shoot.wav')
    alien_shoot = pygame.mixer.Sound('audio/alien_shoot.wav')
    alien_exp = pygame.mixer.Sound('audio/alien_exp.wav')
    ship_exp = pygame.mixer.Sound('audio/ship_exp.wav')
    ufo_sound = pygame.mixer.Sound('audio/ufo_sound.wav')
    pygame.mixer.music.load('audio/bg_music_1.wav')
    pygame.mixer.music.play(-1, 0.0)
    ufo_sound_playing = False

    # Start the main loop for the game.
    while True:
        gf.check_events(ai_settings, screen, stats, sb, play_button,
                        high_score_button, ship, aliens, alien_type, points,
                        bullets_ship, bullets_alien, bunker1, bunker2, bunker3,
                        ufo_imgs, ufo, ship_shoot)

        if stats.game_active:
            ship.update()
            if ship.timer.finished is True:
                gf.ship_hit(ai_settings, stats, screen, sb, ship, aliens,
                            alien_type, points, bullets_alien, bullets_ship,
                            high_scores, bunker1, bunker2, bunker3, ufo_imgs,
                            ufo, ship_exp)
            gf.update_bullets(ai_settings, screen, stats, sb, ship, aliens,
                              alien_type, points, bullets_ship, bullets_alien,
                              high_scores, bunker1, bunker2, bunker3, ufo_imgs,
                              ufo, alien_shoot, alien_exp, ship_exp)
            gf.update_aliens(ai_settings, stats, screen, sb, ship, aliens,
                             alien_type, points, bullets_alien, bullets_ship,
                             high_scores, bunker1, bunker2, bunker3, ufo_imgs,
                             ufo, ship_exp)

        gf.update_sound(aliens, ai_settings, stats)
        gf.update_screen(ai_settings, screen, stats, sb, ship, aliens,
                         bullets_ship, bullets_alien, play_button,
                         high_score_button, title1, title2, alien_1_score,
                         alien_2_score, alien_3_score, ufo_score, alien_1_img,
                         alien_2_img, alien_3_img, ufo_img, high_score_title1,
                         high_score_title2, hs1, hs2, hs3, hs4, hs5, hs6, hs7,
                         hs8, hs9, hs10, high_scores, bunker1, bunker2,
                         bunker3, ufo, ufo_sound, ufo_sound_playing)