1041浏览
查看: 1041|回复: 0

[教程] Python编程入门系列课程 — 05飞机大战小游戏

[复制链接]
本帖最后由 木子呢 于 2021-5-12 16:40 编辑


Python编程入门系列课程——第五课 飞机大战小游戏

一、学习背景

经过上节课的学习,我们掌握了函数的定义与调用的方法,也了解了如何使键盘按键与屏幕实现交互。这节课,我们将利用键盘控制的方式来设计一个飞机大战的小游戏,让我们开始吧!

二、学习目标
本实践项目通过编写python程序来设计一个飞机大战的小游戏。

知识目标:
1、理解python中的全局变量
2、掌握break语句、global语句的使用

技能目标:
1、掌握在turtle库中添加图片造型的方式

三、学习准备

1、电脑
2、mind+编程软件

四、学习实践

在本项目中,我们将创建两个python程序,之后运行程序,通过按动键盘上的不同按钮,实现飞机大战的游戏效果。
1.创建一个屏幕和飞机、子弹、敌机等对象并设置其初始条件。
2.设定按键触发及游戏机制。
游戏玩法机制:敌机从屏幕上方向下飞行侵略我方领地,我方派出飞机迎敌,通过键盘上的四个方向键控制飞机的移动,空格键发射子弹,消灭敌机。若敌机成功与我方飞机相撞,则游戏结束。

任务1:初始化游戏程序设计

在这个程序中,我们将创建飞机、子弹、敌机等多个对象,并对其进行初始条件设置。通过它,我们可以了解在turtle库中增加图片造型的方式。为此,我们将分三步创建这个程序。首先是分析任务,之后进行程序的编写,最后运行程序并观察效果。

1、任务分析
在这个任务中,我们首先需要创建一个屏幕,之后创建出飞机大战所需的各个角色——飞机、子弹、敌机并对其进行初始化设置,具体流程如下,

FriApril-202104304885..png

由于敌机的数量众多,因此,我们可以通过列表循环的方式对敌机进行创建及初始化设置,分别如下左图和右图,
FriApril-202104306156..png FriApril-202104306071..png

2、程序编写

在正式编写程序代码之前,我们首先要创建一个项目文件及python程序文件并提前导入好gif图片(图片下载链接见附录1)
STEP1:创建与保存项目文件
启动Mind+,另存项目并命名为“飞机大战小游戏”。
STEP2:创建与保存python文件
创建一个python程序文件“任务一.py”,双击打开。
STEP3:导入图片
在项目文件夹中导入需要的gif图。(图片与程序文件同在项目文件夹中)(下载链接见附录1)
STEP4:编写程序
  1. import turtle #导入turtle库
  2. import random #导入随机数库
  3. #屏幕
  4. screen = turtle.Screen()#赋值screen对象
  5. width,height = 600,720#设定宽度和高度
  6. screen.setup(width,height)#以设定好的宽度和高度来创建屏幕
  7. screen.bgpic('浩瀚银河.gif')#设置背景图
  8. screen.bgcolor('black')#设置背景色为黑
  9. #变量名称定义
  10. bulletSpeed = 50#设置子弹速度为50像素/单位时间
  11. enemySpeed = 3#设置敌机速度为3像素/单位时间
  12. planeSpeed = 20#设置飞机速度为20像素/单位时间
  13. enemyNum = 10#设置敌机数量为10
  14. bulletPower = 40#设置子弹威力大小为40
  15. s = 0#设置子弹初始状态为0,表示未发射
  16. plane = turtle.Pen()#新建飞机对象
  17. bullet = turtle.Pen()#新建子弹对象
  18. enemy = []#新建敌机列表
  19. for i in range(enemyNum):#敌机列表循环
  20.     enemy.append(turtle.Pen())#新建敌机对象并扩充到敌机列表中
  21. turtle.addshape('Plane.gif')#在turtle库中添加飞机造型
  22. turtle.addshape('bullet.gif')#在turtle库中添加子弹造型
  23. turtle.addshape('enemy.gif')#在turtle库中添加敌机造型
  24. turtle.addshape('boom1.gif')#在turtle库中添加**效果造型
  25. #飞机初始设置
  26. plane.penup()#抬笔   
  27. plane.setheading(90)#设置飞机朝向向上
  28. plane.goto(0,-300)#使飞机移动到(0,-300)初始位置
  29. plane.shape('Plane.gif')#设置飞机造型
  30. #子弹初始设置
  31. bullet.speed(0)#设置子弹移动速度最快
  32. bullet.penup()#抬笔
  33. bullet.hideturtle()#隐形
  34. bullet.setheading(90)#设置子弹朝向向上
  35. bullet.goto(0,-400)#使子弹移动到(0,-400)初始位置
  36. bullet.shape('bullet.gif')#设置子弹造型
  37. #敌机初始设置
  38. for i in enemy:#敌机循环
  39.     i.speed(0)#设置敌机速度最快
  40.     i.penup()#抬笔
  41.     i.setheading(-90)#设置敌机朝向向下
  42.     i.goto(random.randint(-200,200),random.randint(350,400))#使敌机移动到屏幕上方指定范围
  43.     i.shape('enemy.gif')#设置敌机造型
  44. turtle.exitonclick()#点击屏幕退出程序
复制代码


3、程序运行
运行程序,我们看到:弹出了一个屏幕,屏幕的下方是我们的主角——飞机,屏幕的上方一个个敌机蓄势待发。


FriApril-202104301849..png

FriApril-202104303868..png

任务2:设定机制程序设计

至此,无论是游戏窗口还是游戏的角色,我们都已经成功创建了,在接下来这个程序中,我们将设置游戏的规则:
敌机从屏幕上方向下飞行侵略我方领地,我方派出飞机迎敌,通过键盘上的四个方向键控制飞机的移动,空格键发射子弹,消灭敌机。若敌机成功与我方飞机相撞,则游戏结束。
为此,我们将分三步创建程序,首先是任务分析,之后进行程序的编写,最后运行程序体验游戏。

1、任务分析

在上个任务中,我们创建了游戏的屏幕窗口,也完成了游戏角色的创建和初始化设置。接下来为了实现按下方向键控制飞机移动,按下空格键发射子弹的功能,我们将在初始化设置的基础上创建移动和射击函数并设定键盘按键的触发与监听,

FriApril-202104309905..png

整体上,我们将采用顺序控制的方式编写程序,而由于游戏要始终运行,因此对于游戏中各个对象上述的操作我们将通过永久循环的方式编写,流程图如下,
FriApril-202104308044..png

在判定子弹的状态时,由于对于子弹只有发射和未发射(s为0)两种状态,因此,我们以双分支结构的方式来编写,流程图如下,

FriApril-202104304707..png

而当子弹发射向上移动超出屏幕后(纵坐标>360),我们需要将子弹隐藏起来并再次将状态设为0,这里只有一种情况,因此我们使用单分支结构编写即可,流程图如下,

FriApril-202104302832..png

由于敌机数量众多,因此,对于后续对于敌机的设定和判定,我们使用列表循环的方式编写程序,流程图如下,

FriApril-202104309249..png

2、程序编写
STEP1:创建与保存python文件
新建一个python程序文件“任务二.py”,双击打开。
STEP2:编写程序
  1. import turtle #导入turtle库
  2. import random #导入随机数库
  3. #屏幕
  4. screen = turtle.Screen()#赋值screen对象
  5. width,height = 600,720#设定宽度和高度
  6. screen.setup(width,height)#以设定好的宽度和高度来创建屏幕
  7. screen.bgpic('浩瀚银河.gif')#设置背景图
  8. screen.bgcolor('black')#设置背景色为黑
  9. #变量名称定义
  10. bulletSpeed = 50#设置子弹速度为50像素/单位时间
  11. enemySpeed = 3#设置敌机速度为3像素/单位时间
  12. planeSpeed = 20#设置飞机速度为20像素/单位时间
  13. enemyNum = 10#设置敌机数量为10
  14. bulletPower = 40#设置子弹威力大小为40
  15. s = 0#设置子弹初始状态为0,表示未发射
  16. plane = turtle.Pen()#新建飞机对象
  17. bullet = turtle.Pen()#新建子弹对象
  18. enemy = []#新建敌机列表
  19. for i in range(enemyNum):#敌机列表循环
  20.     enemy.append(turtle.Pen())#新建敌机对象并扩充到敌机列表中
  21. turtle.addshape('Plane.gif')#在turtle库中添加飞机造型
  22. turtle.addshape('bullet.gif')#在turtle库中添加子弹造型
  23. turtle.addshape('enemy.gif')#在turtle库中添加敌机造型
  24. turtle.addshape('boom1.gif')#在turtle库中添加**效果造型
  25. #飞机初始设置
  26. plane.penup()#抬笔   
  27. plane.setheading(90)#设置飞机朝向向上
  28. plane.goto(0,-300)#使飞机移动到(0,-300)初始位置
  29. plane.shape('Plane.gif')#设置飞机造型
  30. #子弹初始设置
  31. bullet.speed(0)#设置子弹移动速度最快
  32. bullet.penup()#抬笔
  33. bullet.hideturtle()#隐形
  34. bullet.setheading(90)#设置子弹朝向向上
  35. bullet.goto(0,-400)#使子弹移动到(0,-400)初始位置
  36. bullet.shape('bullet.gif')#设置子弹造型
  37. #敌机初始设置
  38. for i in enemy:#敌机循环
  39.     i.speed(0)#设置敌机速度最快
  40.     i.penup()#抬笔
  41.     i.setheading(-90)#设置敌机朝向向下
  42.     i.goto(random.randint(-200,200),random.randint(350,400))#使敌机移动到屏幕上方指定范围
  43.     i.shape('enemy.gif')#设置敌机造型
  44. #函数定义
  45. #plane上下左右移动
  46. def leftMove():#创建左移函数
  47.     plane.goto(plane.xcor()-planeSpeed,plane.ycor())#使飞机移动到左侧一小段距离处,这段距离值为飞机的速度值
  48.    
  49. def rightMove():#创建右移函数
  50.     plane.goto(plane.xcor()+planeSpeed,plane.ycor())#使飞机移动到右侧一小段距离处,这段距离值为飞机的速度值
  51. def upMove():#创建上移函数
  52.     plane.goto(plane.xcor(),plane.ycor()+10)#使飞机移动到上方10像素处
  53. def downMove():#创建下移函数
  54.     plane.goto(plane.xcor(),plane.ycor()-10)#使飞机移动到下方10像素处
  55. def shoot():#创建射击函数
  56.     bullet.goto(bullet.xcor(),bullet.ycor()+bulletSpeed)#使子弹移动到上方一小段距离处,这段距离值为子弹的速度值
  57.     bullet.showturtle()#显示子弹
  58.     global s#定义s为全局变量
  59.     s = 1#设置s的值为1
  60. #键盘控制上下左右以及射击
  61. turtle.onkeypress(leftMove,'Left')#按压键盘left键实现左移
  62. turtle.onkeypress(rightMove,'Right')#按压键盘right键实现右移
  63. turtle.onkeypress(upMove,'Up')#按压键盘up键实现上移
  64. turtle.onkeypress(downMove,'Down')#按压键盘down键实现下移
  65. #子弹发射控制
  66. turtle.onkeypress(shoot,'space')#按压键盘空格实现射击
  67. #键盘监听开始
  68. turtle.listen()
  69. #游戏设置
  70. while True:#永久循环
  71.     if s == 0:#如果子弹状态为0(未发射)
  72.         bullet.goto(plane.xcor(),plane.ycor()-100)#不发射子弹
  73.     else:#否则
  74.         bullet.goto(bullet.xcor(),bullet.ycor()+bulletSpeed)#发射子弹
  75.     if bullet.ycor() > 360:#子弹出屏(位置)
  76.         bullet.hideturtle()#隐藏子弹
  77.         s = 0#设置子弹状态为0(未发射)
  78.    
  79.     for i in enemy:#敌机列表循环
  80.         i.shape('enemy.gif')#显示敌机造型
  81.         i.goto(i.xcor(),i.ycor()-enemySpeed)#使敌机移动到下方一小段距离处,这段距离值为子弹的速度值
  82.         #子弹打到敌机
  83.         if i.distance(bullet) < bulletPower:#如果敌机到子弹的距离值小于子弹的威力值
  84.             i.shape('boom1.gif')#显示**效果图
  85.             i.goto(random.randint(-200,200),random.randint(350,400))#使敌机移动到屏幕上方指定范围内
  86.             bullet.hideturtle()#隐藏子弹
  87.             s = 0#设置子弹状态为0
  88.         if i.ycor() < -360:#敌机状态判定,敌机出屏
  89.             i.goto(random.randint(-200,200),random.randint(350,400))#使敌机移动到屏幕上方指定范围内
  90.         #敌机撞击
  91.         if i.distance(plane)<50:#如果敌机与飞机的距离小于50
  92.             print ('game over')#打印显示游戏结束
  93.             screen.clear()#清屏
  94.             break#跳出循环
复制代码

3、程序运行

STEP1:点击运行,弹出一个屏幕窗口
STEP2:观察屏幕窗口上方,一架架敌机正缓慢向下移动
STEP3:通过四个方向键移动飞机,对准敌机后,按下空格键“space”发射子弹星空中仅可存在一颗子弹,打中目标后,敌机炸裂。


项目实例3.gif


FriApril-202104302146..png

FriApril-202104302568..png

FriApril-202104308114..png

FriApril-202104303953..png

五、巩固提高
项目回顾

本节课我们利用海归绘图(turtle)库,首先创建了一个屏幕作为游戏窗口,之后创建了游戏中的飞机、敌机、子弹等角色并对其进行初始化设置,接下来设置键盘的按键触发及游戏规则,最后,体验游戏。
知识小结
FriApril-202104307363..png



项目拓展

尝试加快敌机的移动速度,增加游戏难度,再来试一试吧!

附录
附录1背景图下载见附件
取码:g6z8
n]提取码:g6z8

附件.zip

763.57 KB, 下载次数: 173

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4

© 2013-2021 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail