Esempio n. 1
0
class AlienInvasion:
    '''overall class to manage game assets and behavior'''
    def __init__(self):
        pygame.init()
        self.setting1 = Setting()
        self.screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN)
        self.screen_rect = self.screen.get_rect()
        pygame.display.set_caption('Alien Invasion')
        self.stats = Gamestats(self)
        self.ship = Ship(self)
        self.bullets = pygame.sprite.Group()
        self.aliens = pygame.sprite.Group()
        self._create_fleet()
        self.play_button = Button(self, 'PLAY')
        self.sb = Scoreboard(self)

    def run_game(self):
        while True:
            self._check_event()
            if self.stats.game_active:
                self.ship.update_ship()
                self._update_bullet()
                self._update_alien()
            self._update_screen()

    def _check_event(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_RIGHT:
                    self.ship.move_to_right = True
                elif event.key == pygame.K_LEFT:
                    self.ship.move_to_left = True
                elif event.key == pygame.K_q:
                    sys.exit()
                elif event.key == pygame.K_SPACE:
                    self._fire_bullet()
            elif event.type == pygame.KEYUP:
                if event.key == pygame.K_RIGHT:
                    self.ship.move_to_right = False
                elif event.key == pygame.K_LEFT:
                    self.ship.move_to_left = False
            elif event.type == pygame.MOUSEBUTTONDOWN:
                mouse_pos = pygame.mouse.get_pos()
                self._check_play_button(mouse_pos)

    def _check_play_button(self, mouse_pos):
        if self.play_button.rect.collidepoint(
                mouse_pos) and self.stats.game_active == False:
            self.stats.game_active = True
            self.stats.reset_stats()
            self.sb.prep_score()
            self.sb.prep_ship()
            self.aliens.empty()
            self.bullets.empty()
            self.setting1.initialized_dynamic_setting()
            self._create_fleet()
            self.ship.recenter_ship()
            pygame.mouse.set_visible(False)

    def _update_screen(self):
        self.screen.fill(self.setting1.bg_color)
        self.ship.blitme()
        for bullet in self.bullets.sprites():
            bullet.draw_bullet()
        self.aliens.draw(self.screen)
        self.sb.draw_score()
        if not self.stats.game_active:
            self.play_button.draw_button()
        pygame.display.flip()

    def _fire_bullet(self):
        if len(self.bullets) < self.setting1.max_valid_bullet:
            new_bullet = Bullets(self)
            self.bullets.add(new_bullet)

    def _update_bullet(self):
        self.bullets.update()
        self._remove_invalid_bullet()
        self._hit_alien()
        self._refill_fleet()

    def _remove_invalid_bullet(self):
        for bullet in self.bullets.copy():
            if bullet.rect.bottom <= 0:
                self.bullets.remove(bullet)

    def _refill_fleet(self):
        if not self.aliens:
            self.bullets.empty()
            self._create_fleet()
            self.setting1.increase_speed()
            self.stats.level += 1
            self.sb.prep_level()

    def _hit_alien(self):
        collisions = pygame.sprite.groupcollide(self.bullets, self.aliens,
                                                False, True)
        if collisions:
            for aliens in collisions.values():
                self.stats.score += len(aliens) * self.setting1.hit_score
            self.sb.prep_score()
        if self.stats.score > self.stats.high_score:
            self.stats.high_score = self.stats.score
            self.sb.high_score()

    def _create_fleet(self):
        alien = Alien(self)
        alien.width, alien.height = alien.rect.size
        avalible_y = self.screen_rect.height - 3 * alien.height - self.ship.rect.height
        row_numbers = avalible_y // (2 * alien.height)
        avalible_x = self.screen_rect.width - 2 * alien.width
        column_numbers = avalible_x // (2 * alien.width)

        for row_number in range(row_numbers):
            for column_number in range(column_numbers):
                self._add_alien(row_number, column_number)

    def _add_alien(self, row_number, column_number):
        alien = Alien(self)
        alien.rect.x = alien.rect.width + 2 * alien.rect.width * column_number
        alien.rect.y = alien.rect.height + 2 * alien.rect.height * row_number
        self.aliens.add(alien)

    def _check_edges(self):
        for alien in self.aliens.sprites():
            if alien.check_edge():
                self._change_direction()
            break

    def _change_direction(self):
        for alien in self.aliens.sprites():
            alien.rect.y += self.setting1.alien_drop_speed
        self.setting1.direction *= -1

    def _update_alien(self):
        self._check_edges()
        self.aliens.update()
        if pygame.sprite.spritecollideany(self.ship, self.aliens):
            self._hit_ship()
        for alien in self.aliens:
            if alien.rect.bottom >= self.screen_rect.bottom:
                self._hit_ship()
            break

    def _hit_ship(self):
        if self.stats.ship_left > 0:
            self.stats.ship_left -= 1
            self.sb.prep_ship()
            self.aliens.empty()
            self.bullets.empty()
            self._create_fleet()
            self.ship.recenter_ship()
            sleep(0.5)
        else:
            self.stats.game_active = False
            pygame.mouse.set_visible(True)
Esempio n. 2
0
class AlienInvasion:
    # overall class for game assets and behaviour
    def __init__(self):
        pygame.init()    # initialize the game
        self.settings = Settings()
        # self.screen = pygame.display.set_mode((self.settings.screen_width, self.settings.screen_height))
        
        # for 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")

        self.stats = Gamestats(self)    # instance for game stats
        self.sb = Scoreboard(self)

        self.ship = Ship(self)
        self.stars = pygame.sprite.Group()
        self.bullets = pygame.sprite.Group()    
        self.aliens = pygame.sprite.Group()
        self._create_tara()
        self._create_fleet()
        self.play_button = Button(self, "START!")

    def run_game(self):
        while True:    # starts the main loop for game
            self._check_events()    # watch for keyboard and mouse movements
            self.stars.update()
            if self.stats.game_active:
                self.ship.update()
                self._update_bullets()
                self._update_aliens()
            self._update_screen()

    def _create_tara(self):
        star = Star(self)    # make a star
        star_width, star_height = star.rect.size
        available_space_x = self.settings.screen_width - 10*star_width
        number_stars_x = available_space_x // (25*star_width)

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

        for row_number in range (number_rows):
            for star_number in range(number_stars_x):
                self._create_star(star_number, row_number)

    def _create_star(self, star_number, row_number):
        star = Star(self)
        star_width, star_height = star.rect.size
        star.x = star_width + 40*star_width*star_number
        star.rect.x = star.x + 10
        star.rect.y = (5*star.rect.height + 40*star.rect.height*row_number)
        self.stars.add(star)
    
    def _create_fleet(self):
        # create a fleet of aliens
        alien = Alien(self)    # make an alien
        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 to 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 the full sleet 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):
        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):
        # drop the entire fleet and change its direction
        for alien in self.aliens.sprites():
            alien.rect.y += self.settings.fleet_drop_speed
        self.settings.fleet_direction *= (-1)
    
    def _update_aliens(self):
        self._check_fleet_edges() # check if fleet is at an edge
        self.aliens.update()    # update the position of all aliens
        # look for alien-ship collisions
        if pygame.sprite.spritecollideany(self.ship, self.aliens):
            self._ship_hit()
        self._check_aliens_bottom()    # check if alien has hit 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     # decreament ships left
            # get rid of remaining aliens and bullets
            self.aliens.empty()
            self.bullets.empty()
            # create new fleet and centre the ship
            self._create_fleet()
            self.ship.center_ship
            sleep(0.5)  #pause
        else:
            self.stats.game_active = False
            pygame.mouse.set_visible(True)
    
    def _update_bullets(self):
        self.bullets.update()
        # deleting bullets vanished from screen
        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):
        # check if a bullet has hit an alien; if hits, get reid of 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)    # score update
            self.sb.prep_score()
            self.sb.check_high_score()

        # if aliens group is empty, 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 _check_events(self):
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                lekho = open(r"highscore.txt", "w")
                lekho.write(str(self.stats.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:    # keydown=pressing/holding key, keyup=releasing 
                self._check_keydown_events(event)
            elif event.type == pygame.KEYUP:
                self._check_keyup_events(event)
            
    
    def _check_play_button(self, mouse_pos):
        # start game when user hit play button
        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()    # reset the game stat
            self.stats.game_active = True
            self.sb.prep_score()
            self.sb.prep_level

            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 == pygame.K_UP:
            self.ship.moving_up = True
        elif event.key == pygame.K_DOWN:
            self.ship.moving_down = True
        elif event.key == pygame.K_SPACE:
            self._fire_bullet()
        elif event.key == pygame.K_ESCAPE:
            lekho = open(r"highscore.txt", "w")
            lekho.write(str(self.stats.high_score))
            sys.exit()

    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
        elif event.key == pygame.K_UP:
            self.ship.moving_up = False
        elif event.key == pygame.K_DOWN:
            self.ship.moving_down = False

    def _fire_bullet(self):
        if len(self.bullets) < self.settings.bullets_allowed:
            new_bullet = Bullet(self)   # create new bullet and add it in group
            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.stars.draw(self.screen)
            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 the game is inactive
            if not self.stats.game_active:
                self.play_button.draw_button()

            pygame.display.flip()    # make the recent screen visible
Esempio n. 3
0
class AlienInvasion:

    # Display settings as adding alien,ship and bullets to the screen

    def __init__(self):

        pygame.init()
        self.setting = Settings()

        # Setting the screen

        self.screen = pygame.display.set_mode(
            (self.setting.screen_width, self.setting.screen_height))
        self.setting.screen_width = self.screen.get_rect().width
        self.setting.screen_height = self.screen.get_rect().height

        self.background = pygame.image.load("starfield.png")

        # Setting a Caption

        pygame.display.set_caption("Alien Invasion")

        # Setting a value for other python pages that are imported

        self.stats = Gamestats(self)
        self.S_B = scoreboard(self)
        self.ship = ship(self)
        self.bullets = pygame.sprite.Group()
        self.aliens = pygame.sprite.Group()

        self.S_B.check_high_score()
        self.create_fleet()

        # Setting button and a message

        self.play_button = Button(self, "Play")

    # Runs the game/functions

    def run_game(self):

        while True:

            self.check_event()

            if self.stats.game_active:

                self.ship.update()
                self.bullets.update()
                self.update_bullet()
                self.update_alien()

            self.update_screen()

    # runs the two function key up and key down

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

    # sees if the key is still pressed or not to continue the movement

    def Check_KEYDOWN(self, event):

        if event.key == pygame.K_RIGHT:
            self.ship.moving_right = True

        if event.key == pygame.K_LEFT:
            self.ship.moving_left = True

        if event.key == pygame.K_UP:
            self.ship.moving_top = True

        if event.key == pygame.K_DOWN:
            self.ship.moving_bottom = True

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

        if event.key == pygame.K_q:
            sys.exit()

    # sees if the key is still pressed or not to stop the movement

    def Check_KEYUP(self, event):

        if event.key == pygame.K_RIGHT:
            self.ship.moving_right = False

        if event.key == pygame.K_LEFT:
            self.ship.moving_left = False

        if event.key == pygame.K_UP:
            self.ship.moving_top = False

        if event.key == pygame.K_DOWN:
            self.ship.moving_bottom = False

    # Fires the bullets

    def _fire_bullet(self):

        # Amount of bullets that are allowed

        if len(self.bullets) < self.setting.allowed_bullet:
            new_bullet = Bullet(self)
            self.bullets.add(new_bullet)

    # Takes the alien and fills the screen with the alien image

    def create_fleet(self):

        alien = Alien(self)
        alien_width, alien_height = alien.rect.size

        available_space_x = self.setting.screen_width - (2 * alien_width)
        number_alien_x = available_space_x // (2 * alien_width)

        ship_height = self.ship.rect.height

        available_space_y = (self.setting.screen_height - (5 * alien_height) -
                             ship_height)
        number_alien_y = available_space_y // (2 * alien_height)

        for row_number in range(number_alien_y):
            for alien_number in range(number_alien_x):

                self.create_alien(alien_number, row_number)

    # Creates an alien

    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)

    # Checks if the fleet (the alien) have hit the edge or not

    def check_fleet_edges(self):

        # check if alien hit the edge

        for alien in self.aliens.sprites():
            if alien.check_edge():
                self.change_fleet_direction()
                break

    # Changing direction of the aliens

    def change_fleet_direction(self):

        # change the fleet direction and drops the alien

        for alien in self.aliens.sprites():
            alien.rect.y += self.setting.fleet_drop_speed

        self.setting.fleet_direction *= -1

    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.setting.initialize_dynamic_settings()

            self.stats.reset_stats()

            self.stats.game_active = True
            self.S_B.prep_score()

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

            self.create_fleet()
            self.ship.center_ship()
            self.S_B.prep_ship()

            # mouse unvisible

            pygame.mouse.set_visible(False)

    # If ship gets hit by alien

    def ship_hit(self):

        if self.stats.ships_left > 0:

            # Removes a life of a player

            self.stats.ships_left -= 1
            self.S_B.prep_ship()

            # Removes bullets and aliens fleets

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

            # recenter the ship and recreate a fleet

            self.create_fleet()
            self.ship.center_ship()

            # Pause

            sleep(0.5)

        else:

            self.stats.game_active = False

            # Mouse visible

            pygame.mouse.set_visible(True)

    def check_alien_bottom(self):

        # Makes the screen a rectangle

        screen_rect = self.screen.get_rect()

        # Checks if the alien ship have hit the bottom screen

        for alien in self.aliens.sprites():
            if alien.rect.bottom >= screen_rect.bottom:
                self.ship_hit()
                break

    # Removing the bullets and checking for a collision between alien and bullet

    def update_bullet(self):

        # Removes the bullet if goes throw the top if the display

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

        self.check_bullet_hit()
        # Collision to see if the bullets have hit the alien ship

    def check_bullet_hit(self):

        collision = pygame.sprite.groupcollide(self.bullets, self.aliens, True,
                                               True)

        # Adding points

        if collision:
            self.stats.score += self.setting.alien_points
            self.S_B.prep_score()
            self.S_B.check_high_score()

        # Repopulating and Increasing speed

        if not self.aliens:

            self.bullets.empty()
            self.create_fleet()
            self.setting.increase_speed()

    # Running two function that moves and checks if the alien hit the edges

    def update_alien(self):

        # Runs two functions the first one moves the fleet of alien and the second checks if the alien have hit and edge

        self.aliens.update()
        self.check_fleet_edges()

        # Runs an if function to check for a collide between ship and alien

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

        # Runs a function that checks if the alien have hit the bottom of the screen

        self.check_alien_bottom()

    # filling the screen and drawing bullets

    def update_screen(self):

        # Fills the screen with a background

        self.screen.blit(self.background, (0, 0))

        # Display the Ship

        self.ship.blit()

        # Draw bullets on the screen

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

        # Draw alien to the display

        self.aliens.draw(self.screen)

        self.S_B.show_score()
        self.S_B.check_high_score()

        # Play Button

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

        # display flip

        pygame.display.flip()
class AlienInvasion:
    #It's a master class
    def __init__(self):
        pygame.init()  #Initializing the game

        self.screen = pygame.display.set_mode((800, 600))
        # sets a 1200 pixel wide and 800 pixels high screen called surface
        # Surface returned by pygame.display.set_mode() represents entire game window
        self.bg = pygame.image.load(background_image)
        pygame.display.set_caption("Alien Invasion")

        self.stats = Gamestats(self)  # creating instanc to store game-stats
        self.sb = Scoreboard(self)

        self.alien_speed = 1
        self.Ship = ship(self)
        self.our_speed = 1
        self.bullets = pygame.sprite.Group()
        self.aliens = pygame.sprite.Group()
        self.fleet_direction = 1
        self.val = 5
        self._create_fleet()

        self.bullet_speed = 1
        self.bullet_width = 4
        self.bullet_height = 15
        self.bullet_color = (255, 0, 0)
        self.bullet_allowed = 3

        self.play_button = Button(self, "Play")
        #self.win_button = Button(self,"You Won!!")
        #self.Ship_speed = 2

    def _create_fleet(self):
        alien = Alien(self)
        #self.aliens.add(alien)

        #alien_width = 70
        available_space_x = 800
        number_aliens_x = available_space_x // (140)

        ship_height = self.Ship.rect.height
        alien_width, alien_height = alien.rect.size

        available_space_y = 600 - (3 * alien_height) - ship_height
        number_rows = available_space_y // (alien_height)

        #print(number_rows)
        #print(number_aliens_x)

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

    def create_alien(self, alien_number, alien_row):
        alien = Alien(self)
        alien_width, alien_height = alien.rect.size
        alien.x = alien_width * alien_number + 50
        alien.rect.x = alien.x
        alien.rect.y = alien_height * alien_row

        self.aliens.add(alien)

    def _update_aliens(self):

        for alien in self.aliens.sprites():
            if alien.check_edge():
                self.newer_update()
                break

        self.aliens.update(self.fleet_direction)

    def newer_update(self):
        for alien in self.aliens.sprites():
            alien.rect.y += self.val  #note that you can't increment with value < 1

        self.fleet_direction *= -1
        self.aliens.update(self.fleet_direction)

    def _ship_newwave(self):

        #print(self.stats.ship_left)

        if self.stats.ship_left > 0:
            self.stats.ship_left -= 1

            self.val *= 1.5
            self.bullet_speed *= 1.5
            self.alien_speed *= 2
            self.our_speed *= 2
            self.sb.stats.level += 1
            self.sb.prep_level()
            #val_upadte()

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

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

            sleep(0.5)

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

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

            self.stats.reset_stats()
            #print(self.stats.score)
            self.sb.prep_level()
            self.sb.prep_score()
            pygame.mouse.set_visible(False)

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

            self._create_fleet()
            self.Ship.center_ship()

    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.stats.game_active = False
                self.stats.reset_stats()
                self.sb.prep_score()
                self.sb.prep_level()
                break

    def run_game(self):  # Game is controlled by this function
        self.stats.reset_stats()

        while (True):  #Infinte loop until game gives order to quit
            for event in pygame.event.get():
                #pygame.event.get() function returns a list of events occured since the last time it was called
                if event.type == pygame.QUIT:
                    sys.exit()

                elif event.type == pygame.KEYDOWN:
                    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:
                        new_bullet = Bullet(self)
                        self.bullets.add(new_bullet)

                    elif event.key == pygame.K_q:
                        sys.exit()

                elif event.type == pygame.KEYUP:
                    if event.key == pygame.K_RIGHT:
                        self.Ship.moving_right = False

                    elif event.key == pygame.K_LEFT:
                        self.Ship.moving_left = False

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

            if self.stats.game_active:
                self.Ship.update()
                self.bullets.update()
                self._update_aliens()

            self.screen.blit(self.bg, [0, 0])
            self.Ship.blitme()

            for bullet in self.bullets.sprites():
                bullet.draw_bullet()
            self.aliens.draw(self.screen)

            for bullet in self.bullets.copy():  #To save memory
                if bullet.rect.bottom <= 0:
                    self.bullets.remove(bullet)

            collisions = pygame.sprite.groupcollide(self.bullets, self.aliens,
                                                    True, True)

            if collisions:
                self.stats.score += 50
                self.sb.prep_score()
                self.sb.check_highscore()

            #print(len(self.bullets))
            #print(len(self.bullets))
            self.sb.show_scorecard()

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

            if pygame.sprite.spritecollideany(self.Ship, self.aliens):
                self.stats.game_active = False
                pygame.mouse.set_visible(True)

            self._check_aliens_bottom()

            if not self.stats.game_active:  #remember to keep it just before flip() func
                self.play_button.draw_button()
                pygame.mouse.set_visible(True)
                #self.stats.reset_stats()
                #self.sb.prep_score()
                #self.sb.prep_level()

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