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

2020-08-23  本文已影响0人  Charles_DT

今天首先要重构一下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实参。



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

上一篇下一篇

猜你喜欢

热点阅读