def run_game(): # init game 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") # create a new ship ship = Ship(ai_settings, screen) aliens = Group() # create alien's group gf.create_fleet(ai_settings, screen, ship, aliens) # create a group to store the bullet bullets = Group() # start game's main circulation while True: # listen mouse and keyboard gf.check_events(ai_settings, screen, ship, bullets) ship.update() gf.update_bullets(aliens, bullets) gf.update_aliens(ai_settings, aliens) # redraw screen every circulation # let last screen be visible gf.update_screen(ai_settings, screen, ship, aliens, bullets)
def __init__(self): """ Initialize the game and creates game resources""" pygame.init() self.settings = Settings() # for windowed mode # self.screen = pygame.display.set_mode((self.settings.screen_width, self.settings.screen_height)) # for the fullscreen 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 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.stars = pygame.sprite.Group() self.aliens = pygame.sprite.Group() self._populate_sky() self._create_fleet() self.play_button = Button(self, 'Play')
def run_game(): # Inicializa o jogo e cria um objeto para a tela pygame.init() ai_settings = Settings() screen = pygame.display.set_mode(( ai_settings.screen_width, ai_settings.screen_height, )) pygame.display.set_caption('Alien Invasion') # Cria o botão Play play_button = Button(ai_settings, screen, 'Play') # Cria uma instância para armazenar dados estatísticos do jogo stats = GameStats(ai_settings) sb = Scoreboard(ai_settings, screen, stats) # Cria uma espaçonave, um grupo de projéteis e um grupo de alienígenas ship = Ship(ai_settings, screen) bullets = Group() aliens = Group() # Cria a frota de alienígenas gf.create_fleet(ai_settings, screen, ship, aliens) # Inicia o laço principal do jogo while True: gf.check_events( ai_settings, screen, stats, sb, play_button, ship, aliens, bullets, ) if stats.game_active: ship.update() gf.update_bullets(ai_settings, screen, stats, sb, ship, aliens, bullets) gf.update_aliens(ai_settings, screen, stats, sb, ship, aliens, bullets) gf.update_screen( ai_settings, screen, stats, sb, ship, aliens, bullets, play_button, )
def _clear_board(self): self.attacked = CoordinateSet() self.hit = CoordinateSet() self.miss = CoordinateSet() self.occupied = CoordinateSet() self.ships = { Ship('Carrier'): CoordinateSet(), Ship('Battleship'): CoordinateSet(), Ship('Destroyer'): CoordinateSet(), Ship('Submarine'): CoordinateSet(), Ship('Patrol Boat'): CoordinateSet() } self.symbols = [EMPTY_COORDINATE for _ in range(100)] self.sunk = []
def smallest_unsunk_ship(self) -> Ship: """Return the smallest unsunk ship.""" smallest = Ship('Carrier') for ship, mask in self.ships.items(): if len(ship) != len(mask) and len(ship) < len(smallest): smallest = ship return smallest
def add_ship(self, ship_obj: Ship, bow: str, direction: str) -> bool: """Add CoordinateSet to board to represent a Ship. Params ------ ship_obj : Ship The ship to be added to the board. bow : Coordinate The coordinate of the bow of ship. direction : str The direction from bow to tail of ship. Returns ------- bool True if ship added successfully. """ ship_coords = ship_coordinates(bow, len(ship_obj), direction) if ship_coords and ship_coords.isdisjoint(self.occupied): self.ships[ship_obj] = ship_coords self.occupied.update(ship_coords) for _c in ship_coords: self.symbols[_c] = ship_obj.symbol() return True return False
def prep_ships(self): self.ships = Group() for ship_number in range(self.stats.ships_left): ship = Ship(self.cfg, self.screen) ship.rect.x = 10 + ship_number * ship.rect.width ship.rect.y = 10 self.ships.add(ship)
def prep_ships(self): """ Show how many ships are left """ self.ships = pygame.sprite.Group() for ship_number in range(self.stats.ships_left): ship = Ship(self.ai_game) ship.rect.x = 10 + ship_number * ship.rect.width ship.rect.y = 10 self.ships.add(ship)
def prep_ships(self): """Mostra quantas espaçonaves restam.""" self.ships = Group() for ship_number in range(self.stats.ships_left): ship = Ship(self.ai_settings, self.screen) ship.rect.x = 10 + ship_number * ship.rect.width ship.rect.y = 10 self.ships.add(ship)
def __init__(self): 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") 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(): # init pygame.init() # config cfg = Settings() screen = pygame.display.set_mode((cfg.screen_width, cfg.screen_height)) pygame.display.set_caption("Alien Invasion") # 创建飞船 ship = Ship(cfg, screen) # 创建子弹 bullets = Group() # 创建外星人 # alien = Alien(cfg, screen) aliens = Group() game_funcs.create_fleet(cfg, screen, aliens, ship) # 游戏统计信息 stats = GameStats(cfg) sb = Scoreboard(cfg, screen, stats) # 按钮控制 play_button = Button(cfg, screen, "Play") over_all = OverAll(cfg, screen, ship, bullets, aliens, stats, sb) # usage print("started game. press keyboard to start playing.") while True: game_funcs.check_events(cfg, screen, ship, bullets, aliens, stats, play_button, sb) if stats.game_active: ship.update() game_funcs.update_bullets(cfg, screen, ship, bullets, aliens, stats, sb) game_funcs.update_aliens(cfg, screen, ship, bullets, aliens, stats, sb) game_funcs.update_screen(cfg, screen, ship, bullets, aliens, stats, play_button, sb)
def run_game(): # Initialize game and create a screen object. pygame.init() settings = Settings() screen = pygame.display.set_mode( (settings.screen_width, settings.screen_heigth)) pygame.display.set_caption("Alien Invasion 3000") ship = Ship(screen) # Start the main loop for the game. while True: gf.check_events(ship) gf.update_screen(settings, screen, ship)
def run_game(): """运行游戏""" setting = Settings() screen = pygame.display.set_mode([setting.screen_width, setting.screen_height]) # 飞船 ship = Ship(setting, screen) # 子弹 bullets = Group() # 外星人 aliens = Group() gf.create_fleet(setting, screen, ship, aliens) # title pygame.display.set_caption("Alien Invasion") bg_color = (255, 255, 255) while True: gf.check_event(setting, screen, ship, bullets) ship.update() gf.update_aliens(setting, aliens) gf.update_bullets(bullets) gf.update_screen(setting, screen, ship, bullets, aliens)
def run_game(): # 初始化游戏并创建一个屏幕对象 pygame.init() ai_settings = Settings() screen = pygame.display.set_mode( (ai_settings.screen_width, ai_settings.screen_height)) # screen = pygame.display.set_mode((1200, 800)) pygame.display.set_caption("Alian Invasion") # 创建Play按钮 play_button = Button(ai_settings, screen, "Play") # 设置背景颜色 bg_color = (85, 204, 220) # 创建一艘飞船 ship = Ship(ai_settings, screen) # 创建一个用于存储子弹的编组 bullets = Group() # 创建一艘飞船、一个子弹编组和一个外星人编组 aliens = Group() # 创建一个外星人 alien = Alien(ai_settings, screen) # 开始游戏的主循环 while True: gf.check_events(ai_settings, screen, play_button, ship, bullets) ship.update() # bullets.update() # 删除已消失的子弹 # for bullet in bullets.copy(): # if bullet.rect.bottom <= 0: # bullet.remove(bullet) print(len(bullets)) gf.update_bullets(bullets) gf.update_screen(ai_settings, screen, ship, alien, bullets, play_button) gf.update_screen(ai_settings, screen, ship, aliens, bullets) # 创建外星人群 gf.create_fleet(ai_settings, screen, ship, aliens) # 监视键盘和鼠标事件 for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exeit() # 每次循环时都重绘屏幕 screen.fill(ai_settings.bg_color) # screen.fill(bg_color) ship.blitme() # 让最终绘制的屏幕可见 pygame.display.flip()
def ship_type_at(self, coordinate: Coordinate) -> Optional[Ship]: """Determine which type of ship occupies a provided coordinate. PARAMS ------ coordinate : Coordinate The coordinate being checked for ship occupancy. RETURNS ------- <class `gamebox.ship.Ship`> or None Ship object if one is present, else None. """ coordinate = parse_coordinate(coordinate) return Ship.from_symbol(self.symbols[coordinate]) or None
def setup_ship(self, grid): ''' Create the ship surface ''' # create ship surface form_ship = self.get_component('f ship') # if not ship set -> put question mark image if not np.any(grid): form_ship.set_surface(img_question) else: ship = Ship.from_grid(grid, 0) ship.compile() form_ship.set_surface(ship.get_surface('original'))
def create_ship(self, grid): ''' Create the Ship object given its grid. Set its starting position & color according to its team. ''' self.ship = Ship.from_grid(grid, self.team) self.ship.compile() # set starting position & color if self.team == 1: self.ship.set_pos(Spec.POS_P1) self.ship.set_color(Spec.COLOR_P1) else: self.ship.set_pos(Spec.POS_P2) self.ship.set_color(Spec.COLOR_P2) self.ship.orien = np.pi
def _ship_update(self, ship_info): if self.player_ship and ship_info.player_id == context.Player.room_player_id: return for ship in self.ships: if ship.id_ == ship_info.id: ship.spos = (ship_info.x, ship_info.y) # ship.player_id = ship_info.player_id ship.angle = ship_info.angle ship.thruttle = ship_info.thruttle ship.reverse_thruttle = ship_info.reverse_thruttle ship.life = ship.life return new_ship = Ship() new_ship.spos = (ship_info.x, ship_info.y) new_ship.player_id = ship_info.player_id new_ship.angle = ship_info.angle new_ship.thruttle = ship_info.thruttle new_ship.reverse_thruttle = ship_info.reverse_thruttle new_ship.life = ship.life if new_ship.player_id == context.Player.room_player_id: self.player_ship = new_ship self.add_ship(new_ship)
class AlienInvasion: """Класс для управления ресурсами и поведением игры.""" def __init__(self): 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") 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: self._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._start_game() def _start_game(self): self.settings.initialize_dynamic_settings() self.stats.reset_stats() self.stats.game_active = True self.sb.prep_images() self.aliens.empty() self.bullets.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 in {pygame.K_q, pygame.K_ESCAPE}: self._exit() elif event.key == pygame.K_SPACE: self._fire_bullet() elif event.key == pygame.K_RETURN: # Enter key self._start_game() 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_collision() def _check_bullet_alien_collision(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._start_new_level() def _start_new_level(self): 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: self.stats.ships_left -= 1 # 4 attempts. if before the condition, then 3 attempts 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 _create_fleet(self): alien = Alien(self) alien_width, alien_height = alien.rect.size available_space_x = self.settings.screen_width - (alien_width * 2) 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_height + 2 * alien_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_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) self.sb.show_score() if not self.stats.game_active: self.play_button.draw_button() pygame.display.flip() def _exit(self): with open('record.txt', 'w') as record: record.write(str(self.stats.high_score)) sys.exit()
def __init__(self, *args, **kwargs): super(Game, self).__init__(*args, **kwargs) #create a new window, make it the full size of our current display galaxy = milkyway.create() galaxy_window = Map2DWindow(map2d=galaxy.map, rect=((0, 0), self.display.resolution), game=self) self.windows.add_window(galaxy_window) self.register_update_callback(galaxy.update) #self.register_pre_render_callback(galaxy_window.draw_grid) #add a ship and center the map on it player = Ship() galaxy.map.add_object(player, (1 * AU, 1 * AU)) self.register_update_callback(player.update) #galaxy_window.lock_center(player) galaxy_window.scale = 0.000001 galaxy_window.index_cycle = galaxy.index.values() galaxy_window.index_pointer = 0 galaxy_window.lock_center(galaxy_window.index_cycle[galaxy_window.index_pointer]) #TODO: figure out a better way to pass context items like player or galaxy_window to commands #so that they have the same method signature self.keyboard.bindings = { K_w: { KEYDOWN: lambda: commands.player_main_engine_on(player), KEYUP: lambda: commands.player_main_engine_off(player) }, K_s: { KEYDOWN: lambda: commands.player_retro_engine_on(player), KEYUP: lambda: commands.player_retro_engine_off(player) }, K_a: { KEYDOWN: lambda: commands.player_left_engine_on(player), KEYUP: lambda: commands.player_left_engine_off(player) }, K_d: { KEYDOWN: lambda: commands.player_right_engine_on(player), KEYUP: lambda: commands.player_right_engine_off(player) }, K_SPACE: { KEYDOWN: lambda: commands.toggle_player_view_lock(player, galaxy_window) }, K_ESCAPE: { KEYDOWN: commands.quit }, K_RETURN: { KEYDOWN: lambda: commands.cycle_galaxy_index(galaxy_window) } } self.mouse.bindings = { MOUSEMOTION: lambda event: commands.set_player_heading_from_mouse(event, galaxy_window, player), MOUSEBUTTONDOWN: { 1: lambda event: commands.set_map_center_from_mouse_click(event, galaxy_window), 4: lambda event: commands.zoom_map_in(event, galaxy_window, 1.1), 5: lambda event: commands.zoom_map_out(event, galaxy_window, 1.1) } } widgets = [] widgets.append(TextWidget(binding=lambda: 'view: {view}'.format(view=galaxy_window.get_viewport_range()), font_size=20, color=(255, 100, 100))) widgets.append(TextWidget(binding=lambda: 'pos: {x}, {y}'.format(x=int(player.get_position()[0]), y=int(player.get_position()[1])), font_size=20, color=(255, 50, 150))) widgets.append(TextWidget(binding=lambda: 'accell: {accell}'.format(accell=player.acceleration), font_size=20, color=(255, 50, 150))) widgets.append(TextWidget(binding=lambda: 'vector: {vector}'.format(vector=player.vector), font_size=20, color=(255, 50, 150))) widgets.append(TextWidget(binding=lambda: 'heading: {heading}'.format(heading=player.heading), font_size=20, color=(255, 150, 255))) #widgets.append(TextWidget(binding=lambda: 'slice: {slice}'.format(slice=galaxy_window._slice_rect), font_size=20, color=(255, 100, 255))) #widgets.append(TextWidget(binding=lambda: 'c: {center}'.format(center=galaxy_window.center), font_size=20, color=(255, 100, 100))) #widgets.append(TextWidget(binding=lambda: 'pv: {vector}'.format(vector=galaxy_window.pan_vector), font_size=20, color=(255, 100, 255))) widgets.append(TextWidget(binding=lambda: '{fps} fps'.format(fps=self.clock.fps), font_size=20, color=(100, 255, 100))) widgets.append(TextWidget(binding=lambda: '{ups} ups'.format(ups=self.clock.ups), font_size=20, color=(100, 100, 255))) widget_x = self.display.resolution[0] widget_y = self.display.resolution[1] widget_spacing = 15 for i in range(len(widgets)): self.widgets.add_widget(widgets[i], (widget_x, widget_y - (widget_spacing * i)))
# Define some colors black = ( 0, 0, 0) white = ( 255, 255, 255) green = ( 0, 255, 0) red = ( 255, 0, 0) pygame.init() # Set the width and height of the screen [width,height] size=[700,500] screen=pygame.display.set_mode(size) ship = Ship(screen) pygame.display.set_caption("SeaFarers") #Loop until the user clicks the close button. done=False # Used to manage how fast the screen updates clock=pygame.time.Clock() # -------- Main Program Loop ----------- while not done: milliseconds = clock.tick(100) # milliseconds passed since last frame seconds = milliseconds / 1000.0 # seconds passed since last frame (float)
import pygame from game.ship import Ship # Define some colors black = (0, 0, 0) white = (255, 255, 255) green = (0, 255, 0) red = (255, 0, 0) pygame.init() # Set the width and height of the screen [width,height] size = [700, 500] screen = pygame.display.set_mode(size) ship = Ship(screen) pygame.display.set_caption("SeaFarers") #Loop until the user clicks the close button. done = False # Used to manage how fast the screen updates clock = pygame.time.Clock() # -------- Main Program Loop ----------- while not done: milliseconds = clock.tick(100) # milliseconds passed since last frame seconds = milliseconds / 1000.0 # seconds passed since last frame (float) # ALL EVENT PROCESSING SHOULD GO BELOW THIS COMMENT
class AlienInvasion: """ Overall class to manage game assets and behavior """ def __init__(self): """ Initialize the game and creates game resources""" pygame.init() self.settings = Settings() # for windowed mode # self.screen = pygame.display.set_mode((self.settings.screen_width, self.settings.screen_height)) # for the fullscreen 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 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.stars = pygame.sprite.Group() self.aliens = pygame.sprite.Group() self._populate_sky() 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 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_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() elif event.key == pygame.K_p: self._start_game() elif event.key == pygame.K_PAGEUP: self.settings.manual_level += 1 self.stats.level = self.settings.manual_level self.sb.prep_level() elif event.key == pygame.K_PAGEDOWN: self.settings.manual_level -= 1 if self.settings.manual_level < 1: self.settings.manual_level = 1 self.stats.level = self.settings.manual_level self.sb.prep_level() elif event.key == pygame.K_r: self._end_game() 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 if the player clicks Play """ button_clicked = self.play_button.rect.collidepoint(mouse_pos) if button_clicked and not self.stats.game_active: self._start_game() def _check_bullet_alien_collisions(self): """ Respond for bullet-alien collisions """ # Remove any bullet and alien 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._start_new_level() def _start_new_level(self): """ Level up the game if all alien ships were destroyed """ # 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_fleet_edges(self): """ Respond appropriately if any aliens have reached the edge """ for alien in self.aliens.sprites(): if alien.check_edges(): self._change_fleet_direction() break def _check_aliens_bottoms(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 it the same as if the ship got hit self._ship_hit() 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 _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 # Double indent from left side of the screen for every even row # indent_width = alien_width if row_number % 2 == 0 else 2 * alien_width 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 _create_fleet(self): """ Create the fleet of aliens """ # Create and alien and finds a number of aliens in the row # Spacing between each alien is equal to one alien width alien = Alien(self) alien_width, alien_height = alien.rect.size ship_height = self.ship.rect.height # Defying the number of alien to fill all available space in a row available_space_in_row = self.settings.screen_width - 2 * alien_width number_aliens_in_row = available_space_in_row // (2 * alien_width) # Determine a number of rows of alien to fit the screen available_space_for_rows = self.settings.screen_height - ship_height - (5 * alien_height) number_of_rows = available_space_for_rows // (2 * alien_height) # Creates the fleet of aliens for row_number in range(number_of_rows): for alien_number in range(number_aliens_in_row): self._create_alien(alien_number, row_number) def _end_game(self): """ Set end game conditions """ self.stats.game_active = False self.settings.manual_level = 1 self.sb.store_high_score() 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 _populate_sky(self): """ Place stars on the sky """ for _ in range(self.settings.star_count): star = Star(self) star_width, star_height = star.rect.size star.rect.x = randint(star_width, self.settings.screen_width - star_width) star.rect.y = randint(star_height, self.settings.screen_height - star_height) self.stars.add(star) def _start_game(self): """ Start the game if key pressed or mouse clicked """ # Reset the game stats self.stats.reset_stats() self.settings.initialize_dynamic_settings() self.settings.set_start_speed() self.sb.prep_images() self.stats.game_active = True # 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 _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() # Clear the screen from remaining aliens and bullets self.bullets.empty() self.aliens.empty() # Create new fleet and center the ship. self._create_fleet() self.ship.center_ship() # Pause sleep(1) else: self._end_game() def _update_aliens(self): """ Check if the fleet is at an edge, then update the position of all aliens in the fleet """ self._check_fleet_edges() self.aliens.update() if pygame.sprite.spritecollideany(self.ship, self.aliens): self._ship_hit() # Look for aliens hitting the bottom of the screen self._check_aliens_bottoms() def _update_bullets(self): """ Update position of bullets and get rid of old bullets """ # Update bullet position 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_screen(self): """ Update images on the screen and flip to the new screen """ self.screen.fill(self.settings.bg_color) self.stars.draw(self.screen) self.ship.blit_me() 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()