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) 将1到3的随机值赋给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 = Trueswitch_image = Falsedelay = 60enemies = pygame.sprite.Group()small_enemies = pygame.sprite.Group()add_small_enemies(small_enemies, enemies,6)bullet_index = 0e1_destroy_index = 0me_destroy_index = 0bullet1 = []bullet_num = 6for 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.energyif energy_remain > 0.2:energy_color = color_greenelse:energy_color = color_redpygame.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) % 4if 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 = bullet1bullets[bullet_index].reset(our_plane.rect.midtop)bullet_index = (bullet_index +1) % bullet_numfor 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 = Falsefor e in enemies_hit:e.active =Falseelse:if not (delay % 3):screen.blit(our_plane.destroy_images[me_destroy_index], our_plane.rect)me_destroy_index = (me_destroy_index+ 1) % 4if me_destroy_index == 0:me_down_sound.play()our_plane.reset()(我方飞机如果和敌机碰撞, 则更改飞机的存活属性)enemies_down =pygame.sprite.spritecollide(our_plane, enemies, False,pygame.sprite.collide_mask)if enemies_down:our_plane.active = Falsefor row in enemies:row.active = Falsefor event in pygame.event.get():if event.type == 12:pygame.quit()sys.exit()if delay == 0:delay = 60delay -= 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

作者:韩雪
编辑校对:郭通

