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