现在飞机已经能够带着血条突突突飞下来让玩家虐,于是我们给用户一点打飞机的成就感——计分系统以及难度递增机制。
1、计分系统
首先,我们在main()函数中添加全局变量(score)并初始化为零用以统计当前用户的打飞机得分:
~~~
score = 0 # 统计用户得分
~~~
接下来只需要在敌机销毁时对score进行累加就可以了,我们在这里先给敌机标个价:小型敌机一架值500分,中型敌机一架值2000分,大型敌机一架值6000分,然后在敌机损毁时根据敌机类型选择加多少分,对于小型敌机:
~~~
for each in small_enemies: # 绘制小型敌机并自动移动
if each.active:
# 绘制小型敌机
else:
if e1_destroy_index == 0:
# 敌机损毁音效
if not (delay % 3):
# 播放损毁画面
if e1_destroy_index == 0:
score += 500
# reset()
~~~
中型敌机:
~~~
for each in mid_enemies: # 绘制中型敌机并自动移动
if each.active:
# 绘制中型敌机# 绘制血槽
else:
if e2_destroy_index == 0:
# 播放损毁音效
if not (delay % 3):
# 绘制损毁画面
if e2_destroy_index == 0:
score += 2000
# reset()
~~~
大型敌机:
~~~
for each in big_enemies: # 绘制大型敌机并自动移动
if each.active: # 如果飞机正常存在
# 绘制大型敌机# 绘制血槽
if each.rect.bottom == -50:
# 播放大型飞机的音效(循环播放)
else: # 如果飞机已撞毁
# 出场音效停止
if e3_destroy_index == 0:
# 播放飞机撞毁音效
if not (delay % 3): # 每三帧播放一张损毁图片# 大型敌机有六张损毁图片
if e3_destroy_index == 0: # 如果损毁图片播放完毕,则重置飞机属性
score += 6000
# reset()
~~~
需要指出一点,这里之所以添加“if e3_destroy_index == 0:”是因为整个飞机损毁的过程是由四帧(或六帧)图像的播放来完成的,如果不加这个限制,则在飞机损毁过程中每播放一帧就加一次分,这样小型机和中型机损毁一次就要加4次分,大型机损毁一次就要加6次分,因此需要规定每次飞机损毁时只在播放损毁最后一帧画面之后再进行加分、复位,播放声音等操作。
2、显示分数
在游戏过程中,需要将玩家得分实时显示在界面的左上角,这就涉及到Pygame的font模块的应用。首先在main函数初始化过程(while循环之前)调用font模块成员函数创造系统字体对象:
~~~
score_font = pygame.font.SysFont("arial", 48) # 定义分数字体
~~~
这里的score_font对象采用系统字体“arial”,字号为48。之后通过调用字体对象的render()成员函数将当前分数存于字体对象中,并返回字体的surface格式对象,用以接下来的屏幕打印工作:
~~~
score_text = score_font.render("Score : %s" % str(score), True, color_white)
screen.blit(score_text, (10, 5))
~~~
这里先将当前分数通过str()函数转换成字符串,然后格式化到“Score:”的字符串中,第二个参数表示当前字体在打印时自动开启抗锯齿功能,第三个参数为字体颜色。建议将这两句代码放在while循坏体内比较靠前的位置,以便使代码更为整洁。运行程序,分数能够正确的、实时的显示在屏幕上,接下来我们来给游戏增加难度——难度分级递增机制。
3、设计难度分级标准
我们的目的是随着用户得分的提高,游戏对应难度也逐渐加大,首先需要在main()函数添加一个全局标志位level用以指示当前游戏处于那种难度:
~~~
level = 1 # 游戏难度级别
~~~
接下来简单的制定以下难度门槛:分数处于(0,5000)为第一级难度,处于(5000,30000)为第二级难度,处于(30000,60000)为第三级难度:
~~~
# ====================定义难度递进操作====================
if level == 1 and score > 5000: # 如果达到第二难度等级,则增加3架小型敌机,2架中型敌机,1架大型敌机,并提升小型敌机速度
level = 2
pass
elif level == 2 and score > 30000: # 如果达到第三难度等级
level = 3
pass
elif level == 3 and score > 60000: # 如果达到第四难度等级
level = 4
pass
~~~
接下来开始根据对应难度等级来给游戏加难度,如何才算增加难度,无非是增加敌机数量,增加敌机速度,因此我们定义两个函数来完成这个功能,首先定义增加飞机数量的函数,刚好我们之前已经定义好了这个函数:
~~~
# ====================敌方飞机生成控制函数====================
def add_small_enemies(group1, group2, num):
def add_mid_enemies(group1, group2, num):
def add_big_enemies(group1, group2, num):
~~~
关于这些函数的具体作用参见之前博文,接下来定义速度增加函数,原理就是增加敌机对象内部speed成员变量的值即可:
~~~
# ====================提升敌机速度====================
def inc_speed(target, inc):
for each in target:
each.speed += inc
~~~
target为待加速的敌机精灵组,inc为加速的程度(大致可以成为加速度吧)。
4、完善难度分级递增机制
定义完“add_small_enemies”、“inc_speed”等操作函数后,我们给出完整的难度分级递增机制部分代码(建议放在while循环的开始部分):
~~~
# ====================定义难度递进操作====================
if level == 1 and score > 5000: # 如果达到第二难度等级,则增加3架小型敌机,2架中型敌机,1架大型敌机,并提升小型敌机速度
level = 2
level_up_sound.play()
add_small_enemies(small_enemies, enemies, 3)
add_mid_enemies(mid_enemies, enemies, 2)
add_big_enemies(big_enemies, enemies, 1)
inc_speed(small_enemies, 1)
elif level == 2 and score > 30000: # 如果达到第三难度等级
level = 3
level_up_sound.play()
add_small_enemies(small_enemies, enemies, 3)
add_mid_enemies(mid_enemies, enemies, 2)
add_big_enemies(big_enemies, enemies, 1)
inc_speed(small_enemies, 1)
inc_speed(mid_enemies, 1)
elif level == 3 and score > 60000: # 如果达到第四难度等级
level = 4
level_up_sound.play()
add_small_enemies(small_enemies, enemies, 3)
add_mid_enemies(mid_enemies, enemies, 2)
add_big_enemies(big_enemies, enemies, 1)
inc_speed(small_enemies, 1)
inc_speed(mid_enemies, 1)
inc_speed(big_enemies, 1)
~~~
这段代码的分级机制很简单,每增加一级难度,就在之前的基础上添加三架小型敌机,两架中型敌机和一架大型敌机,同时将各个机型的速度均加一,在难度提升的瞬间还有特殊音效播放。ok程序到这里应该可以正确运行,试玩一下发现,当分数超过30000分时敌机已经铺天盖地的飞了下来,为了玩家的生存,我们将在下一篇博文中为我方飞机添加超级武器:超级子弹和全屏炸弹。
~~~
~~~
~~~
~~~