大数跨境
0
0

0基础也可以学会的“打飞机”小游戏

0基础也可以学会的“打飞机”小游戏 数据皮皮侠
2019-11-21
0
导读:0基础也可以学会的“打飞机”小游戏Python是一个功能非常强大的计算机程序设计语言,相信无论在看这篇文章的

0基础也可以学会的“打飞机”小游戏


Python是一个功能非常强大的计算机程序设计语言,相信无论在看这篇文章的你是帅哥还是靓女都见到过这样的字眼——“会Python的人,工作都不会太差”、“学了Python才知道,Python竟然这么好学”。那么,Python真的这么重要吗?学了Python有什么用呢?

本文旨在向大家通俗易懂的介绍Python中用于编写游戏的pygame,并给出一段可以实现“打飞机”游戏的代码,随着代码的展开介绍一些pygame的知识点。看完本文以后,你就会发现什么贪吃蛇啊、跳跃的小球啊原来就是一行行代码,并且只要你有Python,就可以用本文给出的代码自己创造出来“打飞机”游戏并进行一些自己的创作改进。

话不多说,先给大家展示下我们很受欢迎的“打飞机”小游戏:


怎么样?是不是跃跃欲试?

其实,这个小游戏只要200行代码就可以实现了!

在学习这段代码前,先来一起安装pygame这一模块。这里假定大家都已经下载了python(没下载的快快到官网上,操作非常简单,又免费),在最新的python3.8.0中,只需要在你的命令提示符(cmd)输入python -m pip install pygame ,你的电脑就会自动下载符合你的python版本要求的pygame

下载完成后怎么检验下载是否成功,怎么查看下载的版本呢?在你的python里打入如下代码,如果和下图显示内容一致,则说明安装成功,就可以开始愉快的打飞机游戏编写了。

那接下来就和笔者一起来看看这段代码吧!

 

importsysfrompygame.locals import *


这行代码是将pygame的所有常量导入,这样在后面的代码中就可以直接用这些常量而

不用多次申明。

 

fromconfig.settings import *fromsrc.plane import OurPlane          # 导入我们的飞机fromsrc.enemy import SmallEnemy       #导入敌方飞机fromsrc.bullet import Bullet             #导入子弹


    src.plane、src.enemy、src.bullet是三个子代码文件。其中,src.plane是我方飞机的实现代码。其中的重点是精灵(Sprite)模块的运用,精灵可以认为成是一个个小图片,一种可以在屏幕上移动的图形对象,并且可以与其他图形对象交互。精灵图像可以是使用Pygame绘制函数绘制的图像,也可以是原来就有的图像文件。所以我方的飞机就是这里的小精灵咯。

self.image=pygame.image.load(filename)说明该精灵调用显示filename这个图片文件。self.rect=self.image.get_rect()获得image距形的大小,然后赋值给self.rect来设定image显示的位置self.rect.topleft(topright、bottomleft、bottomright)来设定某一个角的显示位置。self.rect.top、self.rect.bottom、self.rect.right、self.rect.left分别表示上下左右。self.update负责使精灵行为生效。Sprite.add  添加精灵到group中去。Sprite.remove从group中删除精灵。src.enemy定义了敌方的小飞机,这里也使用了精灵模块,除此之外,最关键的一点就是随机数的产生了,因为敌方小飞机是随机出现在界面中的,所以用self.rect.left, self.rect.top =(randint(0, self.width - self.rect.width), randint(-5 * self.rect.height, -5) ) self.active = True来定义敌机出现的位置, 保证敌机不会在程序已开始就立即出现。something= random.randint(1,3) 将13的随机值赋给somethingsrc.bullet实现了最后一个重要元素——子弹。主要包含一个move函数使子弹移动, 超出屏幕范围, 则设置死亡;还有一个reset复位函数,使子弹重新上膛。 bg_size= 480, 752                       # 初始化游戏背景大小(宽, 高)screen= pygame.display.set_mode(bg_size)   # 设置背景对话框pygame.display.set_caption("飞机大战")     # 设置标题background= pygame.image.load(os.path.join(BASE_DIR,"material/image/background.png")) # 加载背景图片,并设置为不透明这里的bg_size就是你希望得到的游戏界面的大小,可以根据自己的电脑来做改变。pygame.display.set_mode()这一函数可以设置不同的显示效果,在一个游戏的设计和实现中非常重要。set_mode(resolution =(0,0),flags=0, depth=0)


resolution 指定界面大小

flags 指定拓展选项


 

depth 指定颜色位数不推荐设置

 

# 血槽颜色绘制color_black= (0, 0, 0)color_green= (0, 255, 0)color_red= (255, 0, 0)color_white= (255, 255, 255) # 获取我方飞机our_plane= OurPlane(bg_size)defadd_small_enemies(group1, group2, num):添加小型敌机,指定个数敌机对象添加到精灵组(sprite.group),参数group1、group2是两个精灵组类型的形参,用以存储多个精灵对象(敌机)。需要注意的一点是group既然是特定的精灵组结构体,在向其内部添加精灵对象时需要调用其对应的成员函数add()。    for i in range(num):        small_enemy = SmallEnemy(bg_size)        group1.add(small_enemy)        group2.add(small_enemy)for iin range(a,b)是很常用的一个循环语句,意味着i从a取值到b-1。 defmain():    # 背景音乐响起    pygame.mixer.music.play(-1) # loops接收该参数, -1表示无限循环(默认循环播放一次)    running = True    switch_image = False       # 切换飞机的标识位(使飞机具有喷气式效果)    delay = 60               # 对一些效果进行延迟, 效果更好一些    enemies = pygame.sprite.Group()  # 生成敌方飞机组(一种精灵组用以存储所有敌机精灵)    small_enemies = pygame.sprite.Group()  # 敌方小型飞机组(不同型号敌机创建不同的精灵组来存储)    add_small_enemies(small_enemies, enemies,6)  # 生成若干敌方小型飞机 # 定义子弹, 各种敌机和我方敌机的毁坏图像索引    bullet_index = 0    e1_destroy_index = 0    me_destroy_index = 0  # 定义子弹实例化个数    bullet1 = []    bullet_num = 6    for i in range(bullet_num):       bullet1.append(Bullet(our_plane.rect.midtop))  while running:        screen.blit(background, (0, 0))      # 绘制背景图        clock = pygame.time.Clock()        #调整帧率        clock.tick(60)        # 绘制我方飞机的两种不同的形式        if not delay % 3:            switch_image = not switch_imageforeach in small_enemies:            if each.active:                # 随机循环输出敌方小飞机                each.move()                screen.blit(each.image,each.rect)                pygame.draw.line(screen,color_black,(each.rect.left, each.rect.top - 5),(each.rect.right,each.rect.top - 5), 2)                energy_remain = each.energy / SmallEnemy.energy                if energy_remain > 0.2:  # 如果血量大于百分之二十则为绿色,否则为红色                    energy_color = color_green                else:                    energy_color = color_red                pygame.draw.line(screen,energy_color,                                (each.rect.left, each.rect.top - 5),                                (each.rect.left + each.rect.width * energy_remain, each.rect.top - 5),2)            else:                if e1_destroy_index == 0:                    enemy1_down_sound.play()               screen.blit(each.destroy_images[e1_destroy_index], each.rect)                e1_destroy_index =(e1_destroy_index + 1) % 4                if e1_destroy_index == 0:                    each.reset()screen.blit是用来显示到屏幕上的函数,第一个参数为一个Surface对象,第二个为左上角位置。画完以后切记用update更新一下,否则画面一片漆黑。  # 当我方飞机处于存活状态, 则正常展示        if our_plane.active:            if switch_image:               screen.blit(our_plane.image_one, our_plane.rect)            else:               screen.blit(our_plane.image_two, our_plane.rect)            # 飞机存活的状态下才可以发射子弹            if not (delay % 10):  # 每十帧发射一颗移动的子弹                bullet_sound.play()                bullets = bullet1               bullets[bullet_index].reset(our_plane.rect.midtop)                bullet_index = (bullet_index +1) % bullet_num            for b in bullets:                if b.active:  # 只有激活的子弹才可能击中敌机                    b.move()                    screen.blit(b.image,b.rect)                    enemies_hit =pygame.sprite.spritecollide(b, enemies, False, pygame.sprite.collide_mask)                    if enemies_hit:           # 如果子弹击中飞机                        b.active = False       # 子弹损毁                        for e in enemies_hit:                            e.active =False   # 小型敌机损毁   # 毁坏状态绘制爆炸的场面       else:            if not (delay % 3):               screen.blit(our_plane.destroy_images[me_destroy_index], our_plane.rect)                me_destroy_index = (me_destroy_index+ 1) % 4                if me_destroy_index == 0:                    me_down_sound.play()                    our_plane.reset()  # 调用pygame 实现的碰撞方法 spritecollide(我方飞机如果和敌机碰撞, 则更改飞机的存活属性)        enemies_down =pygame.sprite.spritecollide(our_plane, enemies, False,pygame.sprite.collide_mask)        if enemies_down:            our_plane.active = False            for row in enemies:                row.active = False   # 响应用户的操作        for event in pygame.event.get():            if event.type == 12:  # 如果用户按下屏幕上的关闭按钮,触发QUIT事件,程序退出                pygame.quit()                sys.exit()        if delay == 0:            delay = 60        delay -= 1事件是用户或者程序的一系列行为。pygame.event.get()用来处理所有的事件,


pygame.event.wait()使得Pygame等到发生一个事件才继续下去;而pygame.event.poll()一旦调用,会根据现在的情形返回一个真实的事件,或者一个“什么都没有”。下表是一个常用事件集:

 # 获得用户所有的键盘输入序列(如用户通过键盘发出“向上”的指令,其他类似)        key_pressed = pygame.key.get_pressed()        if key_pressed[K_w] orkey_pressed[K_UP]:            our_plane.move_up()        if key_pressed[K_s] orkey_pressed[K_DOWN]:            our_plane.move_down()        if key_pressed[K_a] orkey_pressed[K_LEFT]:            our_plane.move_left()        if key_pressed[K_d] orkey_pressed[K_RIGHT]:            our_plane.move_right()
# 绘制图像并输出到屏幕上面 pygame.display.flip()


 

至此,我们的主代码就全部搞定啦!只需要再创建一个运行文本

from bin.main import mainif __name__ == '__main__':    main()


点击该文本的run module就可以运行起我们的小飞机了(所需素材可以点击参考资料里的第一个网址获得)。当然,聪明的你可能并不满足于此,还想对这个游戏进行升级,这当然没问题,只要你学习了更多的关于pygame的知识,就可以编写出更加高级的游戏。

这里再补充一点关于pygame的基础知识。

Pygame常用模块


其中,pygame.transform用于实现对象(surface)的变换


好了,本期对pygame模块的介绍就到这里了,感谢大家耐心看完!比心心❤

 

参考资料:

https://www.cnblogs.com/alex3714/p/7966656.html

https://blog.csdn.net/zha6476003/article/details/82940350

(本文为CSDN博主「(.*)释然」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。)

https://blog.csdn.net/qq_38526635/article/details/82688820

(本文为CSDN博主「luckycyong」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。)

@小五义http://www.cnblogs.com/xiaowuyi


作者:韩雪

编辑校对:郭通



   




【声明】内容源于网络
0
0
数据皮皮侠
社科数据综合服务中心,立志服务百千万社科学者
内容 2137
粉丝 0
数据皮皮侠 社科数据综合服务中心,立志服务百千万社科学者
总阅读16
粉丝0
内容2.1k