Python编写微信打飞机小游戏(八)

  现在飞机已经能够带着血条突突突飞下来让玩家虐,于是我们给用户一点打飞机的成就感——计分系统以及难度递增机制。

  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分时敌机已经铺天盖地的飞了下来,为了玩家的生存,我们将在下一篇博文中为我方飞机添加超级武器:超级子弹和全屏炸弹。

 
时间: 2024-10-11 22:28:33

Python编写微信打飞机小游戏(八)的相关文章

Python编写微信打飞机小游戏(十一)

在这篇博文中,我们准备为打飞机小游戏添加一个暂停的功能,即用户在游戏过程中随时可以通过单击屏幕右上方的一个暂停按钮来暂停和恢复游戏.这个功能看似比较简单,但其中涉及了鼠标操作.图片切换.代码结构的重置等等,接下来我们一一进行介绍. 1.加载暂停按钮图标 在image文件夹下一共有四张暂停按钮的图片,分别为深色和浅色两组,首先在main()函数中加载相关图片资源并初始化暂停/开始标志位: paused = False # 标志是否暂停游戏 pause_nor_image = pygame.imag

Python编写微信打飞机小游戏(一)

最近开始学习Python语言,发现Python有一个神奇的Pygame模块,在编写小游戏时显得非常方便,于是参照教学视频编写了一个微信打飞机的小游戏,网上有很多相关的博客,但都不是很详细,大都是直接贴代码,于是决定沉下心来把编写程序的过程记录下来,与大家分享. 首先声明一点,这篇博客完全参照了小甲鱼的<零基础入门学习Python>教学视频,为了尊重原创,特将原作者的视频地址公布如下:<零基础入门学习Python> Python编译器和Pygame模块的安装网上的教程很多,这里不再赘

Python编写微信打飞机小游戏(四)

之前的工作已经基本上将我方飞机的图形显示工作做的差不多了,这篇博客中我们将开始添加敌方飞机——小型敌机.中型敌机(直升机)和大型敌机(坦克).新建一个enemy.py文件,导入pygame和random模块,开始编写吧(还是要注意文件编码问题,以后就不再啰嗦了). 敌方飞机类与我方飞机模块有一定的相似性,但不会左右移动,不会发射子弹等等.小型敌机是敌方飞机中最基本的类型,一击毙命,没有血量.没有出场音效.中型敌机有一定血量,损毁时附带特殊音效.大型敌机血量最多,出场和损毁时都有特殊音效,游戏中中

Python编写微信打飞机小游戏(三)

通过之前的任务,我们已经能够实现小飞机在屏幕上自由移动了,这次博客的任务是是的我们的小飞机看起来更有灵性——尾部喷气特效的绘制. 1.帧率 说道帧率,玩游戏的人可能并不陌生.如果你是一个lol的玩家,那你肯定最关心两件事,一是帧率(FPS),二是延迟.延迟取决于网络性能,而帧率则取决于电脑的硬件配置,自然是帧率越高游戏画面就越流畅.帧率,简单老理解就是游戏在一秒钟进行多少次画面刷新.Pygame支持的帧率大约是从30到120,为了避免游戏程序因为电脑性能的差异出现太大差别,我们在此为程序指定一个

Python编写微信打飞机小游戏(七)

这边博客我们为大型敌机和中型敌机设置血量并以血槽的形式显示出来,同时解决之前遇到的声道阻塞的BUG(声道阻塞的问题详见之前的博文). 1.为敌机添加表示血量的成员变量 所谓敌机血量,就是指敌机在挂掉之前能够挨几发子弹,这是敌机对象的一个成员属性,因此我们在中型敌机(MidEnemy)和大型敌机(BigEnemy)中添加energy成员变量: class MidEnemy(pygame.sprite.Sprite): energy = 5 def __init__(self, bg_size):

10分钟教你用Python做个打飞机小游戏超详细教程

更多精彩尽在微信公众号[程序猿声] 我知道你们一定想先看效果如何 00 目录 整体框架 开始之前-精灵类Sprite 子弹类class Bullet 玩家飞机类class Player 敌机类class Enemy 游戏主体循环以及帧率设置 让子弹飞 刷出敌机 打怪 把飞机敌机子弹都画出来 处理键盘事件 分数显示 和 GameOver 最终代码 01 前言 这次还是用python的pygame库来做的游戏.关于这个库的内容,读者可以上网了解一下.本文只讲解用到的知识.代码参考自网上,自己也做了一

C语言射击类打飞机小游戏

使用c语言编写一个打飞机小游戏,使用键盘按键来进行游戏,击中敌机可获得积分,被敌机撞中死亡一次,每次游戏有3次机会. 在网上查询资料并且和同学讨论之后,对原来的代码有了一些改进, 改进:增加了颜色函数,在你所需要改变窗口颜色的位置调用函数 system("color xx") xx分别指的是背景颜色和文字(前景)颜色.x为一位16进制数,即1-f都可以使用.可以随意组合.增加了终止函数,使游戏在死亡三次后自动结束游戏,并且可以选择是否重新开始游戏:另外增添了设置函数,使得可以对游戏进行

python编写微信公众号首图思路详解

前言 之前一直在美图秀秀调整自己的微信公众号首图,效果也不尽如人意,老是调来调去,最后发出来的图片被裁剪了一大部分,丢失部分关键信息,十分恼火,于是想着用python写一个程序,把微信公众号首图的模式固定下来,方便以后写公众号. 思路 根据微信公众号首图要求,可以上传一个不超过5M的图片,且图片尺寸要是2.35:1的尺寸,换算成像素是900:383,有了这些参数就可以做文章了,这里有两种思路 把今天推文的标题(文字)用图片展示出来,使得文字排列错落有致,简单粗暴,而又不失美感,这里可以利用mat

原生js打飞机小游戏

最近为了巩固一下原生的知识,然后拿了一个js小游戏来入手.主要也是为了学习和练手. js代码如下: 1 window.onload = function(){ 2 var oBtn = document.getElementById('gameBtn'); 3 oBtn.onclick = function(){ 4 this.style.display = 'none'; 5 Game.init('div1');//把父级传进去 6 }; 7 }; 8 //创建Game单体 9 10 var