【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实参。
大功告成啦!下一节,我们要让敌人进行移动,毕竟游戏还是要有些难度的,下次见~