宅在家里好几个月了,有点无聊。小编决定写了一个小游戏,名字叫做《小蜜蜂的丛林历险记》。

什么情况呢?

我来介绍一下游戏吧:有一天,小蜜蜂为了采集花蜜,决定穿越最凶险的丛林,抵达传说中的万花岛。丛林里有各种各样野蛮的虫子,如果不幸被这些虫子抓到了,小蜜蜂生命值就会损失,如果生命值损失没了,小蜜蜂就挂了,当然,在寻找万花岛的过程中,小蜜蜂也会遇到各种各样的帮助,比如说,如果小蜜蜂碰到了一个桃花,喝到了桃花蜜,她的生命值就会提高。如果碰到了梅花,小蜜蜂移动速度加快。

对了,我们还忘记了说一件事,那就是小蜜蜂到底有什么样的武器来对付这些毒虫呢!大家看下面:

python 小蜜蜂_开发语言

小蜜蜂现在只有一种武器,那就是她射出的箭。当然了,随着关卡的不断深入,小蜜蜂还会不断地获得各种各样的新武器。比如.........我也没想好

python 小蜜蜂_python 小蜜蜂_02

。如果大家有什么想法可以加入qq群,向群主提意见。我们可以把大家的想法写进游戏里。qq群号码:996113038。

先看看游戏吧:

游戏代码资源在百度网盘中:

链接: https://pan.baidu.com/s/1B9sr0sc-moi1NSEu1vEumA?pwd=x45m 提取码: x45m 复制这段内容后打开百度网盘手机App,操作更方便哦 
--来自百度网盘超级会员v3的分享

现在是这个游戏的第一步,在将来,我们会不断的更新这个小游戏,不断添加各种各样的敌人。同时也赋予小蜜蜂越来越多的武器。

好吧!!!

开始啦!

我们来看看我们今天的主角:小蜜蜂:

python 小蜜蜂_pygame_03

然后小蜜蜂碰到的第一个敌人是:瓢虫:

python 小蜜蜂_开发语言_04

现在是最简化版本的游戏,形式上和飞机大战差不多。按上下左右键,小蜜蜂就可以上下左右移动,如果按了空格键,小蜜蜂发射一支箭,射中了瓢虫,那么瓢虫直接死亡(瓢虫血比较薄)。当然,如果小蜜蜂被瓢虫碰到了,小蜜蜂也死亡。

在直接动手写程序以前,我们首先要做的是抠图,意思是把这些图片素材的背景变成透明的,记住,白色的背景不是透明的,白色是一种颜色,我们要的是透明,意思就是无色的。如果我们不扣图,图片素材里面有白色的背景,就会出现这样的情况。

python 小蜜蜂_游戏_05

大家可以看到,瓢虫就是没有抠图的效果,小蜜蜂是抠图以后的效果。网上有很多抠图的网站,但很多都是收费的,这里我写了一个python的代码,可以自动从白色的背景中抠图。代码如下:

from PIL import Image


def transPNG(srcImageName, dstImageName):
    img = Image.open(srcImageName)
    img = img.convert("RGBA")
    datas = img.getdata()
    newData = list()
    for item in datas:
        if item[0] > 225 and item[1] > 225 and item[2] > 225:
            newData.append((255, 255, 255, 0))
        else:
            newData.append(item)
    img.putdata(newData)
    img.save(dstImageName, "PNG")
    
transPNG('my_arrow.png','new_arrow')

然后我们就要开始正式的程序了。

关于小游戏,我们之前已经讲的很多了,比如说按键识别,大家很容易就能看懂。这个游戏比较特殊的地方在于,我们用了pygame里面的精灵和精灵组。这是pygame里面专门用来开发游戏的功能,可以大幅度节约你的代码。

另外就是,我们用到了类的继承,相信很多同学都学过。

我们首先定义一个精灵类:

class GrameSprite(pygame.sprite.Sprite):
    """"飞机大战游戏精灵类"""


    def __init__(self, image_name, speed=1,speed1=1):
        # 调用父类方法
        super().__init__()
        pygame.image.load(image_name).convert_alpha()


        self.image = pygame.image.load(image_name).convert_alpha()
        self.rect = self.image.get_rect()
        self.speed = speed
        self.speed1=speed1


    def update(self):
        self.rect.y += self.speed

这个精灵类包含一些基本的参数和功能。

首先,精灵类继承了GrameSprite(pygame.sprite.Sprite)。也就是说,我们定义的这个精灵,它继承了pygame里面的精灵的全部功能。我们还给它添加了一些新的功能。比如说speed,speed表示的是左右方向的速度,而speed1表示的是上下的速度。在update功能中,还定义了精灵的移动功能。

之后,我们定义小蜜蜂的类:

class Hero(GrameSprite):
    """英雄类"""


    def __init__(self):
        super().__init__('./images/hero1.png', 0)
        self.rect.centerx = SCREEN_RECT.centerx
        self.rect.bottom = SCREEN_RECT.bottom - 120


        # 创建子弹精灵组
        self.bullet_group = pygame.sprite.Group()


    def update(self):
        self.rect.x += self.speed
        self.rect.y += self.speed1
        if self.rect.x < 0:
            self.rect.x = 0
        elif self.rect.right > SCREEN_RECT.right:
            self.rect.right = SCREEN_RECT.right
        if self.rect.y>SCREEN_RECT.height:
            self.rect.bottom=SCREEN_RECT.height
        elif self.rect.y<0:
            self.rect.bottom=0
            


    def fire(self):
        bullet = Bullet()
        bullet.rect.bottom = self.rect.y - 20
        bullet.rect.centerx = self.rect.centerx
        self.bullet_group.add(bullet)

小蜜蜂就是英雄,她的功能有两个,一个是移动,另一个是开火。我们在__init__中读取小蜜蜂的图片,设置她的位置。self.rect表示的是包围小蜜蜂的矩形的四个边的坐标值,我们移动小蜜蜂,指的就是移动这些坐标值。移动坐标的值,我们做了一个专门的函数来处理。也就是update。

最后,小蜜蜂还有一个重要的功能就是开火(也就是射箭)。在这个函数中,我们首先要初始化一个子弹(箭),然后设置好这个子弹的位置,最后把这个子弹添加到子弹的精灵组里面。

然后,我们来讲一讲游戏的循环,和所有的游戏一样,这个游戏也是通过快速的帧率变化来展现出连贯的视频的。我们设置一个帧率,然后快速刷新,由于人眼的视觉暂留效应。这样看到的就是一个连续的视频了。

def start_game(self):
        while True:
            # 1.设置刷新帧率
            self.clock.tick(FRAME_PER_SEC)
            # 2.事件监听
            self.__event_handler()
            # 3.碰撞检测
            self.__check_collide()
            # 4.更新/绘制精灵组
            self.__update_sprites()
            # 5.更新显示
            pygame.display.update()

在游戏中,我们可以将所有的代码简化为4步,分别是,事件监听,也就是查看我们的按键输入,之后移动各种游戏元素。用精灵组的自带功能进行碰撞检测(查看箭有没有碰到瓢虫,瓢虫有没有碰到蜜蜂)。最后更新精灵组(将射中的瓢虫删除,将箭也删除)。最后更新显示我们的界面。