前言
之前的外星人都是直接铺满屏幕的,移动方式和下落节奏都很单一,这次我们整一点花活,来一个随机生成外星人,这样还不够,外星人的移动方向我们也需要改改,不然多没意思。
随机生成
这里我们采用的是random包中的random函数,因为是生成外星人,所以修改的是game_function中的create_fleet函数,该函数的功能是计算空间中能生成的外星人行数和列数,双重循环调用外星人生成函数。
#前面有一个from random import random
def create_fleet(ai_settings,screen,stats,ship,aliens):"""创建外星人群"""alien = Alien(ai_settings,screen)#第一个对象是用来计算相关数据的number_aliens_x = get_number_alien_x(ai_settings,alien.rect.width)number_rows = get_number_rows(ai_settings,ship.rect.width,alien.rect.height)for row_number in range(number_rows):for alien_number in range(number_aliens_x):a = random()if a > 0.3:create_alien(ai_settings,screen,aliens,alien_number,row_number)
random函数的返回值是[0,1)随机数,我们选择0.3-1生成外星人,这样不会太少。
create_alien是使用外星人类来生成一个对象,并将其加入到aliens编组中,具体内容看一下之前的博客:
- 外星人类的讲解:链接
- 事件函数讲解:链接
放一张图:
好了,本期博客到此结束(bushi
随机方向
可以试一下,改了之后我们的外星人移动还是之前的一整块,看着就很难受,所以我想到了随机方向的问题。
首先,如果每一个外星人都有自己不一样的方向,那么我们就要对原来的结构修改:
- 方向变量(正负1)不应该放在setting中了,而应该是在外星人类中
- 检测外星人到达边界时函数不需要break了,我们要对每一个都进行判断
- 修改外星人方向的函数也不应该是修改所有的方向并下落,而是针对单独一个外星人
def check_fleet_deges(ai_settings,aliens):"""有外星人得到边界时"""for alien in aliens.sprites():if alien.check_edge():change_fleet_direction(ai_settings,alien)def change_fleet_direction(ai_settings,alien):"""将外星人下调,并改变方向"""alien.rect.y += ai_settings.fleet_drop_speedalien.fleet_direction *= -1
贴图:
(可以看到重叠的部分明显有白边,这是因为我们的外星人图片不是透明背景,不然会好很多。)
这样基本上就实现了外星人的无序,增强了游戏体验。
结语
最后再给一个游戏技巧吧,站在中间打就行了。
嗯,就是这样,因为飞船是一定要经过中间的,打起来就很方便。
游戏体验怎么还下降了……