Пример #1
0
    def __init__(self):
        """Инициализирует игру и создает игровые ресурсы."""
        pygame.init()
        pygame.display.set_caption('Alien Invasion')

        self.settings = Settings()

        self.background_color = self.settings.background_color

        if self.settings.fullscreen:
            self.screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN)

        else:
            self.screen = pygame.display.set_mode(
                (self.settings.screen_width, self.settings.screen_height))

        self.stats = GameStats(self)
        self.score = ScoreBoard(self)
        self.play_button = PlayButton(self, 'Play')

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

        self._create_fleet()
Пример #2
0
    def __init__(self, parent):
        Location.__init__(self, parent, menu_background)
        
        pygame.mixer.music.load(music)
        pygame.mixer.music.play(-1)
        
        pygame.mouse.set_visible(1)
        pygame.key.set_repeat(0)


        self.start_button = PlayButton(240, 300)

        self.surfaces = []
        self.controls = pygame.sprite.Group()
        self.controls.add(self.start_button)
        
        self.platform1 = Platform(120, 600)
        self.platform2 = Platform(240, 490)
        self.platform3 = Platform(360, 550)
        self.doodle = Doodle()

        self.animation = pygame.sprite.Group()
        self.animation.add(self.platform1)
        self.animation.add(self.platform2)
        self.animation.add(self.platform3)
        self.animation.add(self.doodle)

        self.window.blit(self.background, (0, 0))
Пример #3
0
 def on_show(self):
     self.setup_theme()
     arcade.set_background_color(arcade.color.AMETHYST)
     self.play_button = PlayButton(550,
                                   100,
                                   80,
                                   80,
                                   theme=self.theme,
                                   text='play')
     self.exit_button = ExitButton(650,
                                   100,
                                   80,
                                   80,
                                   theme=self.theme_2,
                                   text='exit')
     self.button_list.append(self.play_button)
     self.button_list.append(self.exit_button)
Пример #4
0
 def on_show(self):
     self.setup_theme()
     arcade.set_background_color(arcade.color.AMETHYST)
     self.play_button = PlayButton(self.WIDTH / 2 - 100,
                                   self.HEIGHT / 2 - 200,
                                   150,
                                   100,
                                   theme=self.theme,
                                   text='restart')
     self.exit_button = ExitButton(self.WIDTH / 2 + 100,
                                   self.HEIGHT / 2 - 200,
                                   150,
                                   100,
                                   theme=self.theme_2,
                                   text='exit')
     self.button_list.append(self.play_button)
     self.button_list.append(self.exit_button)
Пример #5
0
class StartView(arcade.View):
    """Class to display the starting View for the game"""
    def __init__(self, game, WIDTH, HEIGHT):
        super().__init__()
        self.game = game
        self.WIDTH = WIDTH
        self.HEIGHT = HEIGHT
        self.start_game = False

    def setup_theme(self):
        self.theme = Theme()
        self.theme_2 = Theme()
        self.theme.set_font(24, arcade.color.BLACK)
        self.set_button_textures()

    def on_show(self):
        self.setup_theme()
        arcade.set_background_color(arcade.color.AMETHYST)
        self.play_button = PlayButton(550,
                                      100,
                                      80,
                                      80,
                                      theme=self.theme,
                                      text='play')
        self.exit_button = ExitButton(650,
                                      100,
                                      80,
                                      80,
                                      theme=self.theme_2,
                                      text='exit')
        self.button_list.append(self.play_button)
        self.button_list.append(self.exit_button)

    def set_button_textures(self):
        #Play button
        normal = "img/buttons/green.png"
        hover = "img/buttons/pink.png"
        clicked = "img/buttons/red.png"
        locked = "img/buttons/blue.png"

        #Exit button
        self.theme.add_button_textures(normal, hover, clicked, locked)
        normal2 = "img/buttons/red.png"
        hover2 = "img/buttons/blue.png"
        clicked2 = "img/buttons/pink.png"
        locked2 = "img/buttons/green.png"
        self.theme_2.add_button_textures(normal2, hover2, clicked2, locked2)

    def on_draw(self):
        arcade.start_render()
        start_x = self.WIDTH / 2
        start_y = self.HEIGHT / 2
        arcade.draw_text(
            "Welcome to Black Jack! \n You start off with 100 chips.\n Try to make it to 250 chips by beating the dealer\'s cards.\n Would you like to play?",
            start_x,
            start_y,
            arcade.color.BLACK,
            font_size=30,
            anchor_x="center",
            anchor_y="center",
            align='center')
        super().on_draw()
        self.play_button.draw()
        self.exit_button.draw()
        if self.play_button.pressed:
            game_view = GameViewBid(self.WIDTH, self.HEIGHT)
            self.game.window.show_view(game_view)
        if self.exit_button.pressed:
            arcade.close_window()
Пример #6
0
class AlienInvasion(object):
    """
    Класс для управления ресурсами и поведением игры.
    """
    def __init__(self):
        """Инициализирует игру и создает игровые ресурсы."""
        pygame.init()
        pygame.display.set_caption('Alien Invasion')

        self.settings = Settings()

        self.background_color = self.settings.background_color

        if self.settings.fullscreen:
            self.screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN)

        else:
            self.screen = pygame.display.set_mode(
                (self.settings.screen_width, self.settings.screen_height))

        self.stats = GameStats(self)
        self.score = ScoreBoard(self)
        self.play_button = PlayButton(self, 'Play')

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

        self._create_fleet()

    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:
                self._check_play_button(pygame.mouse.get_pos())

    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 or event.key == pygame.K_ESCAPE:
            sys.exit()

        elif event.key == pygame.K_SPACE:
            self._fire_bullet()

        elif event.key == pygame.K_z:
            self._fire_mega_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 _check_play_button(self, position):
        """Запускает новую игру при нажатии кнопки Play."""
        if self.play_button.rect.collidepoint(
                position) and not self.stats.game_active:
            self.stats.reset_stats()
            self.settings.init_dynamic_settings()
            self.stats.game_active = True

            self.score.prep_score()
            self.score.prep_level()
            self.score.prep_ships()

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

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

            pygame.mouse.set_visible(False)

    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.score.prep_score()
            self.score.check_high_score()

        self._using_mega_bullets()

        if not self.aliens:
            self.bullets.empty()
            self.mega_bullets.empty()
            self._create_fleet()

            self.settings.increase_speed()
            self.stats.level += 1
            self.score.prep_level()

    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 _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 _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 _update_screen(self):
        """Обновляет изображения на экране и отображает новый экран."""
        self.screen.fill(self.background_color)
        self.ship.blitme()
        for bullet in self.bullets.sprites():
            bullet.draw_bullet()
        for mega_bullet in self.mega_bullets.sprites():
            mega_bullet.draw_bullet()
        self.aliens.draw(self.screen)

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

        if not self.stats.game_active:
            self.play_button.draw_button()

        pygame.display.flip()

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

    def _fire_mega_bullet(self):
        self.mega_bullets.add(MegaBullet(self))

    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):
        """Создание флота вторжения."""
        # Создание одного пришельца, не включенного во флот,
        # для расчета максимального количествыа пришельцев в ряду
        # TODO: оптипизировать
        alien = Alien(self)
        alien_width, alien_height = alien.rect.size
        available_space_x = self.settings.screen_width - (2 * alien_width)
        number_of_aliens_x = available_space_x // (2 * alien_width)
        available_space_y = (self.settings.screen_height - (3 * alien_height) -
                             self.ship.rect.height)
        number_of_rows_y = available_space_y // (2 * alien_height)

        # Создание флота пришельцев.
        for row_number in range(number_of_rows_y):
            for alien_number in range(number_of_aliens_x):
                self._create_alien(alien_number, row_number)

    def _change_fleet_direction(self):
        """Опускает весь флот и меняет направление флота."""
        for alien in self.aliens.sprites():
            alien.rect.y += self.settings.fleet_speed
        self.settings.fleet_direction *= -1

    def _using_mega_bullets(self):
        # Обработка читерских пуль
        self.mega_bullets.update()

        for mega_bullet in self.mega_bullets.copy():
            if mega_bullet.rect.bottom <= 0:
                self.mega_bullets.remove(mega_bullet)

        pygame.sprite.groupcollide(
            self.mega_bullets,
            self.aliens,
            False,
            True,
        )

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

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

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

            time.sleep(2)

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

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