作者:晓晓
链接:https://zhuanlan.zhihu.com/p/21290174
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

一、项目简介

1. 介绍

使用Python快速开发一款PC端玩耍的微信打飞机游戏,基于pygame实现。详细教程及在线练习地址:Python - pygame开发打飞机游戏

本教程源自Kill-Console的技术博客使用Pygame制作微信打飞机游戏PC版。

本项目类似曾经火爆的微信打飞机游戏。游戏将使用 Python 语言开发,主要用到 pygame 的 API。游戏最终将会以 python 源文件 game.py 形式完成,只需要运行python game.py就可以进入游戏。

游戏最终效果截图如下:

2. 知识点

本实验中将介绍在 Linux 桌面环境下使用 Python 及 pygame 快速开发小游戏的方式。可以通过这个游戏入门 pygame 游戏开发。

3. 安装依赖包

需要安装 pygame 库来支持本实验所需的代码运行。

在实验环境中打开 Xfce 终端,并输入以下命令来安装 pygame,会提示输入 shiyanlou 的密码:

$ sudo apt-get update
$ sudo apt-get install python-pygame

二、技术设计

1. 游戏角色

本游戏中所需的角色包括玩家飞机、敌机及子弹。用户可以通过键盘移动玩家飞机在屏幕上的位置来打击不同位置的敌机。因此设计以下 Player,Enemy 和 Bullet 三个类对应三种游戏角色。

对于 Player,需要的操作有射击和移动两种,移动又分为上下左右 4 种情况。

对于 Enemy,则比较简单,只需要移动即可,从屏幕上方出现并移动到屏幕下方。

对于 Bullet,与飞机相同,仅需要以一定速度移动即可。

2. 游戏功能

相信玩过微信打飞机的朋友都熟悉,这里将游戏做了简化。飞机的速度固定,子弹的速度固定,基本操作是移动玩家飞机,目标飞机随机从屏幕上方出现并匀速落到下方,子弹从玩家飞机发出,碰到目标飞机会击毁,如果目标飞机碰到玩家飞机,则 Game Over 并显示分数。

三、代码实现

1. 界面显示

代码实现所需的 resources 图片文件都可以通过下述命令获取:

$git clone http://git.shiyanlou.com/shiyanlou/PythonShootGame

详细步骤

  1. 初始化 pygame
  2. 设置游戏界面大小、背景图片及标题
  3. 游戏主循环内需要处理游戏界面的初始化、更新及退出
  4. 显示玩家飞机(代码中使用的 resources/image/shoot.png 图里包含多种飞机,只需要使用 pygame.image 的 subsurface API 根据位置截取 shoot.png 中所需的图片)

示例代码

#1. 初始化 pygame
pygame.init()#2. 设置游戏界面大小、背景图片及标题
# 游戏界面像素大小
screen = pygame.display.set_mode((480, 800))# 游戏界面标题
pygame.display.set_caption('飞机大战')# 背景图
background = pygame.image.load('resources/image/background.png').convert()# Game Over 的背景图
game_over = pygame.image.load('resources/image/gameover.png')# 飞机图片
plane_img = pygame.image.load('resources/image/shoot.png')# 截取玩家飞机图片
player = plane_img.subsurface(pygame.Rect(0, 99, 102, 126))#3. 游戏主循环内需要处理游戏界面的初始化、更新及退出
while True:# 初始化游戏屏幕screen.fill(0)screen.blit(background, (0, 0))# 显示玩家飞机在位置[200,600]screen.blit(player, [200, 600])# 更新游戏屏幕pygame.display.update()# 游戏退出事件for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()exit()

2. 事件处理

在主循环中处理键盘输入的事件(上下左右按键操作),增加游戏操作交互(玩家飞机的上下左右移动)。

详细步骤

  1. 获取键盘事件(上下左右按键)
  2. 处理键盘事件(移动飞机的位置)
  3. 将上述步骤代码放入游戏主循环中

示例代码

#1. 获取键盘事件(上下左右按键)
key_pressed = pygame.key.get_pressed()#2. 处理键盘事件(移动飞机的位置)
if key_pressed[K_w] or key_pressed[K_UP]:player.moveUp()
if key_pressed[K_s] or key_pressed[K_DOWN]:player.moveDown()
if key_pressed[K_a] or key_pressed[K_LEFT]:player.moveLeft()
if key_pressed[K_d] or key_pressed[K_RIGHT]:player.moveRight()

3. 子弹处理

子弹由玩家飞机发出,并以一定速度向界面上方移动。

详细步骤

  1. 生成子弹,需要控制发射频率
  2. 以固定速度移动子弹
  3. 移动出屏幕后删除子弹
  4. 敌机被子弹击中效果处理(下一节处理)

示例代码

#1. 生成子弹,需要控制发射频率
# 首先判断玩家飞机没有被击中
if not player.is_hit:if shoot_frequency % 15 == 0:player.shoot(bullet_img)shoot_frequency += 1if shoot_frequency >= 15:shoot_frequency = 0for bullet in player.bullets:#2. 以固定速度移动子弹bullet.move()#3. 移动出屏幕后删除子弹if bullet.rect.bottom < 0:player.bullets.remove(bullet)            # 显示子弹
player.bullets.draw(screen)

4. 敌机处理

敌机需要随机在界面上方产生,并以一定速度向下移动。

详细步骤

  1. 生成敌机,需要控制生成频率
  2. 移动敌机
  3. 敌机与玩家飞机碰撞效果处理
  4. 移动出屏幕后删除敌机
  5. 敌机被子弹击中效果处理

示例代码

#1. 生成敌机,需要控制生成频率
if enemy_frequency % 50 == 0:enemy1_pos = [random.randint(0, SCREEN_WIDTH - enemy1_rect.width), 0]enemy1 = Enemy(enemy1_img, enemy1_down_imgs, enemy1_pos)enemies1.add(enemy1)
enemy_frequency += 1
if enemy_frequency >= 100:enemy_frequency = 0for enemy in enemies1:#2. 移动敌机enemy.move()#3. 敌机与玩家飞机碰撞效果处理if pygame.sprite.collide_circle(enemy, player):enemies_down.add(enemy)enemies1.remove(enemy)player.is_hit = Truebreak#4. 移动出屏幕后删除飞机    if enemy.rect.top < 0:enemies1.remove(enemy)#5. 敌机被子弹击中效果处理# 将被击中的敌机对象添加到击毁敌机 Group 中,用来渲染击毁动画
enemies1_down = pygame.sprite.groupcollide(enemies1, player.bullets, 1, 1)
for enemy_down in enemies1_down:enemies_down.add(enemy_down)# 敌机被子弹击中效果显示
for enemy_down in enemies_down:if enemy_down.down_index == 0:passif enemy_down.down_index > 7:enemies_down.remove(enemy_down)score += 1000continuescreen.blit(enemy_down.down_imgs[enemy_down.down_index / 2], enemy_down.rect)enemy_down.down_index += 1# 显示敌机
enemies1.draw(screen)

5. 得分显示

在游戏界面固定位置显示消灭了多少目标敌机。

示例代码

# 绘制得分
score_font = pygame.font.Font(None, 36)
score_text = score_font.render(str(score), True, (128, 128, 128))
text_rect = score_text.get_rect()
text_rect.topleft = [10, 10]
screen.blit(score_text, text_rect)

四、完整代码参考

大家可以按照上述步骤组合出自己的打飞机游戏,也可以登录实验楼查看完整代码。实验楼为本项目提供了在线练习环境。

更多Python经典项目:Python项目课

参考资料 :代码参考 Kill-Console 写的PythonShootGame,文档参考 pygame 文档

Python开发打飞机游戏相关推荐

  1. Pygame开发打飞机游戏

    pygame 开发打飞机游戏 一.实验说明 1. 实现效果 单文件实现微信打飞机小游戏 2. 开发环境 python 2.7 pygame random sys 3. 源码下载 本课程中的所有源码:h ...

  2. Python开发转盘小游戏

    Python开发转盘小游戏 Python  一 原理分析 Python开发一个图形界面 有12个选项和2个功能键 确定每个按钮的位置 每个按钮的间隔相同 点击开始时转动,当前选项的背景颜色为红色,其他 ...

  3. 一行代码就能使用PYTHON开发的小游戏

    导语: 哈喽~~没错这期又是游戏集!!! 都是童年玩的小游戏啦~一行代码就能进入使用Python开发的小游戏快乐玩耍了

  4. 如何用Python开发象棋小游戏

    如何用Python开发象棋小游戏,源代码版本 人生苦短,我用Python! hello 大家好!我是Mark,一个姓马名克的中国人. 最近,我在CSDN当中看到了这一篇文章: 传送门 他详细地讲解了如 ...

  5. 使用python开发“魂斗罗”游戏

    使用python开发"魂斗罗"游戏 开发完整的魂斗罗(Contra)游戏是一个庞大的任务,它涉及到图形渲染.物理碰撞.敌人AI.游戏关卡等多个方面.在这个简短的交互中,我将向你展示 ...

  6. C语言游戏开发——打飞机游戏2.0

    C语言游戏开发--打飞机游戏2.0 本次打飞机游戏对上次的打飞机游戏2.0做了代码重构和升级 通过定义函数来实现多个功能 以下为代码主体 通过w a s d来控制飞机的移动 通过空格来发射子弹 #in ...

  7. python写打飞机游戏

    python与打飞机(飞碟) 打飞机小游戏应该算得上是入门python最经典的游戏了,在大部分教程中都有所介绍,不过一般缺乏一定的创新性和可玩性,例如ALIEN INVASION项目的介绍中作出了就是 ...

  8. [Python] 开发植物大战僵尸游戏

    用python开发植物大战僵尸 早期的植物大战僵尸是由vc开发的,作者的想法是非常地有特色,所以今天我们来探讨下植物大战僵尸游戏的进入场景怎么开发. 我们首需要用到如下几个文件 程序文件 功能 gam ...

  9. Python微信打飞机游戏编程学习笔记01

    刚学习Python,看别人写的小游戏,照搬照学照写,纯手工手打,一步步,加深印象,加深学习 运行环境是: Python 3.7.1   pygame 1.9.4 微信很火的打飞机游戏拿了学习下 第一步 ...

最新文章

  1. java立方表示方法
  2. Angular 使用 Injector API 人工获取依赖注入的实例
  3. 【转】SQL Server 索引结构及其使用(二)
  4. python画三维立体图难吗_万万没想到,Python竟能绘制出如此酷炫的三维图
  5. 随想录(符号数据与无符号数据)
  6. (转)J2EE十三个技术规范
  7. GDAL C#中文路径,中文属性名称乱码问题
  8. 在Angular外部使用js调用Angular控制器中提供的函数方法或变量
  9. python如何移动文件却不覆盖现有文件_在python中创建新文件,不要覆盖现有文件...
  10. Ubuntu 安装与使用 Rootkit 扫描程序
  11. 深度卷积神经网络是什么,卷积神经网络结构设计
  12. AE Face Tools 4 脸部工具扩展(中英对照)
  13. android获得cache路径,android取得当前程序File与Cache路径!
  14. 李力刚《谈判博弈》读书笔记
  15. 需求分析——系统建模方法
  16. Python使用wordcloud做词云
  17. uniapp 实现抽奖幸运大转盘功能
  18. GEE基础学习——绘制经纬线pixelLonLat
  19. ASAM_CCP_V2.1.0_cn
  20. HDOJ 2112 HDU Today (最短路 Dijkstra SPFA)

热门文章

  1. 【愚公系列】2023年05月 攻防世界-Web(FlatScience)
  2. iOS开发浮点数问题
  3. 2021-11-21 根据身高 体重计算出bmi指数,检测自己是否属于肥胖
  4. teleport助手已启动了,但一直显示未检测到
  5. 思科WebEx会议应用停止支持Blackberry OS 6/7/10
  6. 邮件的发送和接收过程——STMP、POP、IMAP、MIME
  7. 计算机主机安装流程,电脑怎么安装打印机(详细步骤)
  8. 台式机笔记本需要做机械硬盘和固态硬盘4K对齐吗?怎么做?
  9. kafka的使用场景
  10. 建议收藏!财务报表制作的要点