大数跨境
0
0

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

Python编程入门系列课程——05 飞机大战小游戏 蘑菇云创造
2021-05-02
2
导读:第五课也不会缺席!

点击蘑菇云创造 关注我们


第五课-飞机大战


一、学习背景

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

二、学习目标

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

知识目标:

1、理解python中的全局变量

2、掌握break语句、global语句的使用


技能目标:

1、掌握在turtle库中添加图片造型的方式


三、学习准备


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

四、学习实践

在本项目中,我们将创建两个python程序,之后运行程序,通过按动键盘上的不同按钮,实现飞机大战的游戏效果。
 
1.创建一个屏幕和飞机、子弹、敌机等对象并设置其初始条件。
2.设定按键触发及游戏机制。

游戏玩法机制:敌机从屏幕上方向下飞行侵略我方领地,我方派出飞机迎敌,通过键盘上的四个方向键控制飞机的移动,空格键发射子弹,消灭敌机。若敌机成功与我方飞机相撞,则游戏结束。

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

1、任务分析

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


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


2、程序编写


在正式编写程序代码之前,我们首先要创建一个项目文件及python程序文件并提前导入好gif图片(下载链接见附录1)。
 
STEP1:创建与保存项目文件
启动Mind+,另存项目并命名为“飞机大战小游戏”。
 
STEP2:创建与保存python文件
创建一个python程序文件“任务一.py”,双击打开。
 
STEP3:编写程序

import turtle #导入turtle库import random #导入随机数库#屏幕screen = turtle.Screen()#赋值screen对象width,height = 600,720#设定宽度和高度screen.setup(width,height)#以设定好的宽度和高度来创建屏幕screen.bgpic('浩瀚银河.gif')#设置背景图screen.bgcolor('black')#设置背景色为黑
#变量名称定义bulletSpeed = 50#设置子弹速度为50像素/单位时间enemySpeed = 3#设置敌机速度为3像素/单位时间planeSpeed = 20#设置飞机速度为20像素/单位时间
enemyNum = 10#设置敌机数量为10bulletPower = 40#设置子弹威力大小为40s = 0#设置子弹初始状态为0,表示未发射
plane = turtle.Pen()#新建飞机对象bullet = turtle.Pen()#新建子弹对象enemy = []#新建敌机列表for i in range(enemyNum):#敌机列表循环 enemy.append(turtle.Pen())#新建敌机对象并扩充到敌机列表中
turtle.addshape('Plane.gif')#在turtle库中添加飞机造型turtle.addshape('bullet.gif')#在turtle库中添加子弹造型turtle.addshape('enemy.gif')#在turtle库中添加敌机造型turtle.addshape('boom1.gif')#在turtle库中添加爆炸效果造型
#飞机初始设置plane.penup()#抬笔 plane.setheading(90)#设置飞机朝向向上plane.goto(0,-300)#使飞机移动到(0,-300)初始位置plane.shape('Plane.gif')#设置飞机造型
#子弹初始设置bullet.speed(0)#设置子弹移动速度最快bullet.penup()#抬笔bullet.hideturtle()#隐形bullet.setheading(90)#设置子弹朝向向上bullet.goto(0,-400)#使子弹移动到(0,-400)初始位置bullet.shape('bullet.gif')#设置子弹造型
#敌机初始设置for i in enemy:#敌机循环 i.speed(0)#设置敌机速度最快 i.penup()#抬笔 i.setheading(-90)#设置敌机朝向向下 i.goto(random.randint(-200,200),random.randint(350,400))#使敌机移动到屏幕上方指定范围 i.shape('enemy.gif')#设置敌机造型turtle.exitonclick()#点击屏幕退出程


3、程序运行


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


Turtle链接

Pen()函数

功能说明    启用画笔工具

使用方法    turtle.Pen()

举例说明    程序中,plane = turtle.Pen(),表示启用画笔并用画笔创建一个飞机对象。

addshape()函数

功能说明    添加图片到库中以便后续调用

使用方法    turtle.addshape(‘图片’),具体操作和导入屏幕背景图一致

举例说明    程序中,turtle.addshape('Plane.gif'),表示在turtle库中添加一个“Plane.gif”的图片。

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

至此,无论是游戏窗口还是游戏的角色,我们都已经成功创建了,在接下来这个程序中,我们将设置游戏的规则:

敌机从屏幕上方向下飞行侵略我方领地,我方派出飞机迎敌,通过键盘上的四个方向键控制飞机的移动,空格键发射子弹,消灭敌机。若敌机成功与我方飞机相撞,则游戏结束。
 
为此,我们将分三步创建程序,首先是任务分析,之后进行程序的编写,最后运行程序体验游戏。
 

1、任务分析

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


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


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


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


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


2、程序编写


STEP1:创建与保存python文件
新建一个python程序文件“任务二.py”,双击打开。
 
STEP2:编写程序
import turtle #导入turtle库import random #导入随机数库#屏幕screen = turtle.Screen()#赋值screen对象width,height = 600,720#设定宽度和高度screen.setup(width,height)#以设定好的宽度和高度来创建屏幕screen.bgpic('浩瀚银河.gif')#设置背景图screen.bgcolor('black')#设置背景色为黑
#变量名称定义bulletSpeed = 50#设置子弹速度为50像素/单位时间enemySpeed = 3#设置敌机速度为3像素/单位时间planeSpeed = 20#设置飞机速度为20像素/单位时间
enemyNum = 10#设置敌机数量为10bulletPower = 40#设置子弹威力大小为40s = 0#设置子弹初始状态为0,表示未发射
plane = turtle.Pen()#新建飞机对象bullet = turtle.Pen()#新建子弹对象enemy = []#新建敌机列表for i in range(enemyNum):#敌机列表循环 enemy.append(turtle.Pen())#新建敌机对象并扩充到敌机列表中
turtle.addshape('Plane.gif')#在turtle库中添加飞机造型turtle.addshape('bullet.gif')#在turtle库中添加子弹造型turtle.addshape('enemy.gif')#在turtle库中添加敌机造型turtle.addshape('boom1.gif')#在turtle库中添加爆炸效果造型
#飞机初始设置plane.penup()#抬笔 plane.setheading(90)#设置飞机朝向向上plane.goto(0,-300)#使飞机移动到(0,-300)初始位置plane.shape('Plane.gif')#设置飞机造型
#子弹初始设置bullet.speed(0)#设置子弹移动速度最快bullet.penup()#抬笔bullet.hideturtle()#隐形bullet.setheading(90)#设置子弹朝向向上bullet.goto(0,-400)#使子弹移动到(0,-400)初始位置bullet.shape('bullet.gif')#设置子弹造型
#敌机初始设置for i in enemy:#敌机循环 i.speed(0)#设置敌机速度最快 i.penup()#抬笔 i.setheading(-90)#设置敌机朝向向下 i.goto(random.randint(-200,200),random.randint(350,400))#使敌机移动到屏幕上方指定范围 i.shape('enemy.gif')#设置敌机造型
#函数定义#plane上下左右移动def leftMove():#创建左移函数 plane.goto(plane.xcor()-planeSpeed,plane.ycor())#使飞机移动到左侧一小段距离处,这段距离值为飞机的速度值
def rightMove():#创建右移函数 plane.goto(plane.xcor()+planeSpeed,plane.ycor())#使飞机移动到右侧一小段距离处,这段距离值为飞机的速度值
def upMove():#创建上移函数 plane.goto(plane.xcor(),plane.ycor()+10)#使飞机移动到上方10像素处
def downMove():#创建下移函数 plane.goto(plane.xcor(),plane.ycor()-10)#使飞机移动到下方10像素处
def shoot():#创建射击函数 bullet.goto(bullet.xcor(),bullet.ycor()+bulletSpeed)#使子弹移动到上方一小段距离处,这段距离值为子弹的速度值 bullet.showturtle()#显示子弹global s#定义s为全局变量 s = 1#设置s的值为1
#键盘控制上下左右以及射击turtle.onkeypress(leftMove,'Left')#按压键盘left键实现左移turtle.onkeypress(rightMove,'Right')#按压键盘right键实现右移turtle.onkeypress(upMove,'Up')#按压键盘up键实现上移turtle.onkeypress(downMove,'Down')#按压键盘down键实现下移#子弹发射控制turtle.onkeypress(shoot,'space')#按压键盘空格实现射击#键盘监听开始turtle.listen()
#游戏设置 while True:#永久循环if s == 0:#如果子弹状态为0(未发射) bullet.goto(plane.xcor(),plane.ycor()-100)#不发射子弹else:#否则 bullet.goto(bullet.xcor(),bullet.ycor()+bulletSpeed)#发射子弹
if bullet.ycor() > 360:#子弹出屏(位置) bullet.hideturtle()#隐藏子弹 s = 0#设置子弹状态为0(未发射)
for i in enemy:#敌机列表循环 i.shape('enemy.gif')#显示敌机造型 i.goto(i.xcor(),i.ycor()-enemySpeed)#使敌机移动到下方一小段距离处,这段距离值为子弹的速度值#子弹打到敌机if i.distance(bullet) < bulletPower:#如果敌机到子弹的距离值小于子弹的威力值 i.shape('boom1.gif')#显示爆炸效果图 i.goto(random.randint(-200,200),random.randint(350,400))#使敌机移动到屏幕上方指定范围内 bullet.hideturtle()#隐藏子弹 s = 0#设置子弹状态为0if i.ycor() < -360:#敌机状态判定,敌机出屏 i.goto(random.randint(-200,200),random.randint(350,400))#使敌机移动到屏幕上方指定范围内#敌机撞击 if i.distance(plane)<50:#如果敌机与飞机的距离小于50print ('game over')#打印显示游戏结束 screen.clear()#清屏break#跳出循环

3、程序运行


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


知识链接

变量的分类与全局变量

知识描述    对于变量我们已经不陌生了,它可以用来存储可变的数据。事实上,变量可以依据在程序中创建的位置,分为局部变量和全局变量两种。局部变量是指在函数内部定义并使用的变量,它只在函数内部有效。而全局变量是能够作用于函数内外的变量,它在整个python程序中有效。如果想要在函数体内修改全局变量的值,可以通过global语句来实现。

 

全局变量主要有以下两种情况:

(1)如果一个变量在函数外定义,那么不仅在函数外可以访问到,在函数内也可以访问到。这样定义在函数体外的变量就是全局变量

(2)在函数体内定义,并且使用“global”修饰后,该变量也就变为全局变量。在函数体外也可以访问到该变量,并且在函数体内还可以对其进行修改。



知识积累

global语句

功能说明    global语句可以在函数体内为一个函数外的变量重新赋值

 

使用方法    global 变量

 

举例说明    程序中,

def shoot():#创建射击函数

    bullet.goto(bullet.xcor(),bullet.ycor()+bulletSpeed)#使子弹移动到上方一小段距离处,这段距离值为子弹的速度值

    bullet.showturtle()#显示子弹

    global s#定义s为全局变量

    s = 1#设置s的值为1

 

这里,我们就是通过global语句修改变量s的值为1。

break语句

功能说明    break语句可以终止当前的循环,包括while和for在内的所有控制语句。

break语句一般会结合if语句进行搭配使用,表示在某种条件下跳出循环。如果使用嵌套循环,break语句将跳出最内层的循环。

 

使用方法    

在while语句中使用break语句的形式如下:

while <条件表达式1>:

    执行代码

    if <条件表达式2>:

        Break

 

其中,条件表达式2用于判断何时调用break语句跳出循环。

 

在for语句中使用break语句的形式如下:

for <变量> in <对象>:

    if <条件表达式>:

        Break

 

其中,条件表达式用于判断何时调用break语句跳出循环。

 

举例说明    程序中,

while True:#永久循环

    for i in enemy:#敌机列表循环

        if i.distance(plane)<50:#如果敌机与飞机的距离小于50

            print ('game over')#打印显示游戏结束

            screen.clear()#清屏

            break#跳出循环

 

表示当敌机与飞机之间的距离小于50时,跳出敌机列表循环。

 

对象链接

distance属性

功能说明    distance属性表示两个对象之间的距离

使用方法    对象1.distance(对象2)

举例说明    程序中,if i.distance(bullet) < bulletPower:,表示将敌机对象i与子弹对象bullet之间的距离与子弹的威力值进行比较。

 

乐一乐

    至此,飞机大战小游戏我们就完成啦,赶紧来试一试吧,看看你能击败多少敌机呢?







五、巩固提高


项目回顾

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

知识小结


程序
Python知识点
初始化游戏程序设计
设定机制程序设计
break语句、全局变量、global语句
 

项目拓展

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

附录

附录1背景图下载链接

链接:
https://pan.baidu.com/s/1IYIRkIbplXiZ4SfpAtXHjQ
提取码:
g6z8
 
附录2常见的python关键字
 

 



‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

蘑菇云创造

微信号 : mgystem

扫码关注,了解更多


‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍‍

推荐阅读:



点击 “ 原文链接 ” ,可下载源程序和图片

【声明】内容源于网络
0
0
蘑菇云创造
蘑菇云是DFRobot旗下专注于AI人工智能、创客、STEAM、劳动教育的科技创新教育品牌;以为中国培养下一代科技创新人才为使命,为学校提供k12全龄段科技创新教育解决方案。
内容 969
粉丝 0
蘑菇云创造 蘑菇云是DFRobot旗下专注于AI人工智能、创客、STEAM、劳动教育的科技创新教育品牌;以为中国培养下一代科技创新人才为使命,为学校提供k12全龄段科技创新教育解决方案。
总阅读1.7k
粉丝0
内容969