美文网首页
【python3小白上路系列】添加一些敌人(三)

【python3小白上路系列】添加一些敌人(三)

作者: Charles_DT | 来源:发表于2020-08-23 18:59 被阅读0次

    今天首先要重构一下create_fleet()函数,然后我们要创建多行敌人,话不多说,开始吧~

    2.2.4 重构create_fleet()

    下面是create_fleet()和两个新函数,get_number_alien_x()和create_alien()。

    def get_number_aliens_x(ai_settings,alien_width):
        # 计算每行可容纳多少敌人
        available_space_x = ai_settings.screen_width - 2 * alien_width
        number_aliens_x = int(available_space_x / (2 * alien_width))
        return number_aliens_x
    
    def create_alien(ai_settings,screen,aliens,alien_number):
        # 创建一个敌人并将其放在当前行
        alien = Alien(ai_settings, screen)
        alien_width = alien.rect.width
        alien.x = alien_width + 2 * alien_width * alien_number
        alien.rect.x = alien.x
        aliens.add(alien)
    
    def create_fleet(ai_settings,screen,aliens):
        # 创建敌人群
        # 创建一个敌人,并计算一行可容纳多少个敌人 
        alien = Alien(ai_settings, screen)
        number_aliens_x = get_number_aliens_x(ai_settings,alien.rect.width)
    
        # 创建第一行敌人
        for alien_number in range(number_aliens_x):
            # 创建一个敌人并将其加入当前行
            create_alien(ai_settings,screen,aliens,alien_number)
    

    通过重构我们将功能细分到各个函数中,从而使创建整群敌人更容易。

    2.2.5 添加行

    首先我们要计算屏幕可容纳多少航,并对一行外星人的循环重复相应的次数。计算行数的方法如下:将屏幕高度减去第一行敌人的上边距、飞船的高度以及最初敌人的高度加上敌人间距(2倍敌人高度):

    available_space_y = ai_settings.screen_height - 3 * alien_height - ship_height
    

    这将在飞船上方留出一定的空白区域,给玩家留出射杀外星人的时间。
    每行下方都要留出一定的空白区域,并将其设置为敌人的高度。为计算可容纳的行数,我们将可用垂直空间除以敌人高度的两倍。

    number_rows = available_space_y / (2 * alien_height)
    

    知道可容纳多少行后,便可重复执行创建一行敌人的代码:

    import sys
    import pygame
    from bullet import Bullet
    from alien import Alien
    
    def check_keydown_events(event,ai_settings,screen,ship,bullets):
        # 响应按键
        if event.key == pygame.K_RIGHT:
            #向右移动飞船
            ship.moving_right = True
        elif event.key == pygame.K_LEFT:
            #向左移动飞船
            ship.moving_left = True
        elif event.key == pygame.K_SPACE:
            fire_bullet(ai_settings,screen,ship,bullets)
        elif event.key == pygame.K_q:
            sys.exit()
    
    def fire_bullet(ai_settings,screen,ship,bullets):
        #创建一颗子弹,并将其加入编组bullets中
        if len(bullets) < ai_settings.bullets_allowed:
            new_bullet = Bullet(ai_settings,screen,ship)
            bullets.add(new_bullet)
    
    def check_keyup_events(event,ship):
        if event.key == pygame.K_RIGHT:
            ship.moving_right = False
        elif event.key == pygame.K_LEFT:
            ship.moving_left = False
    
    
    def check_events(ai_settings,screen,ship,bullets):
        #响应案件和鼠标事件
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
            #判断持续移动
            elif event.type == pygame.KEYDOWN:
                check_keydown_events(event,ai_settings,screen,ship,bullets)
            elif event.type == pygame.KEYUP:
                check_keyup_events(event,ship)
            
        
                
    def update_screen(ai_settings,screen,ship,aliens,bullets):
        #每次循环时都重绘屏幕
            screen.fill(ai_settings.bg_color)
            #在飞船和外星人后面重绘所有子弹
            for bullet in bullets.sprites():
                bullet.draw_bullet()
            # 屏幕上绘制飞船#
            ship.blitme()
            # 屏幕上绘制敌人
            # alien.blitme()
            aliens.draw(screen)
            #让最近绘制的屏幕可见#
            pygame.display.flip()
    
    def update_bullets(bullets):
        # 更新子弹的位置
        bullets.update()   # 删除已消失的子弹
        for bullet in bullets.copy():
            if bullet.rect.bottom <= 0:
                bullets.remove(bullet)
        #print(len(bullets))
    def get_number_aliens_x(ai_settings,alien_width):
        # 计算每行可容纳多少敌人
        available_space_x = 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(ai_settings,ship_height,alien_height):
        #计算屏幕可容纳多少行敌人
        available_space_y = ai_settings.screen_height - (3 * alien_height - ship_height)
        number_rows = int(available_space_y / (4 * alien_height))
        return number_rows
    
    def create_alien(ai_settings,screen,aliens,alien_number,row_number):
        # 创建一个敌人并将其放在当前行
        alien = Alien(ai_settings, 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
        aliens.add(alien)
    
    
    def create_fleet(ai_settings,screen,ship,aliens):
        # 创建敌人群
        # 创建一个敌人,并计算一行可容纳多少个敌人 
        alien = Alien(ai_settings, screen)
        number_aliens_x = get_number_aliens_x(ai_settings,alien.rect.width)
        number_rows = get_number_rows(ai_settings,ship.rect.height,alien.rect.height)
        
        # 创建敌人群
        for row_number in range(number_rows):
            # 创建一个敌人并将其加入当前行
            for alien_number in range(number_aliens_x):
                create_alien(ai_settings,screen,aliens,alien_number,row_number)
    

    这里我修改了一下number_rows这个参数的计算公式,因为我的飞船大小跟教材中的不一样。
    修改完game_function函数后,记得修改主程序中的create_fleet函数,增加ship实参。



    大功告成啦!下一节,我们要让敌人进行移动,毕竟游戏还是要有些难度的,下次见~

    相关文章

      网友评论

          本文标题:【python3小白上路系列】添加一些敌人(三)

          本文链接:https://www.haomeiwen.com/subject/rcuijktx.html