飞机大战想必是很多人童年时期的经典游戏,我们依旧能记得抱个老人机娱乐的场景,这篇文章主要给大家介绍了关于如何利用python,pgzrun写一个简单的飞机大战小游戏的相关一步步实现的资料,以后想把英语 单词的学习能加进来,先实现不带单词的功能,需要的朋友可以参考下
游戏主界面以窗口形式给出,设置窗口大小为400x600, 利背景更换(两张背景替换显示),添加玩家飞机及敌机。通过检测子弹或玩家与敌机相碰进行得减分。
利用背景图片的上下滚动,制造飞机在天空中飞行的效果
游戏过程中,每打掉一个敌机,增加一分,玩家碰到敌机后游戏结束,以后可以改成返回,或分数达到多少后至一下关。
按下左健,发射子弹,子弹发射后通过修改子弹图片的位置,实现子弹飞行的效果,位置改变大小可以调整子弹飞行的速度
发射时的声音,玩家碰到敌机的销毁图与声音,子弹打到敌机的爆炸声
背景,敌机,子弹,玩家等角色的创建,引入图片,定位位置
background1 = Actor(‘bg1’) # 导入背景图片
background1.x = 480/2 # 背景1的x坐标
background1.y = 800/2 # 背景1的y坐标
def on_mouse_move(pos, rel, buttons): # 当鼠标移动时执行
hero.x = pos[0] # 玩家飞机的x坐标设为鼠标的x坐标
hero.y = pos[1] # 玩家飞机的y坐标设为鼠标的y坐标
def on_mouse_down(): # 当鼠标键按下时
bullet.x = hero.x # 把子弹位置设为玩家飞机的正上方
bullet.y = hero.y - 20
sounds.射击07.play()
通过加入以下语句可解决 from pgzero.actor import Actor
声音加载标红可加:from pgzero.loaders import sounds
TITLE=“飞机大战”,title要大写,类似点:WIDTH = 480 # 设置窗口的宽度,HEIGHT = 600 # 设置窗口的高度
取同张背景图片,设置两个角色,初始定位设置不同
background1 = Actor('bg1') # 导入背景图片
background1.x = 480/2 # 背景1的x坐标
background1.y = 800/2 # 背景1的y坐标
background2 = Actor('bg1') # 导入背景图片
background2.x = 480/2 # 背景2的x坐标
background2.y = -800/2
在更新中,动态调整背景照片的Y值,实现背景动态显示的效果、此方法也用于子弹的显示问题。
def update(): # 更新模块,每帧重复操作
global isLoose
if not isLoose:
# 以下代码用于实现背景图片的循环滚动效果
if background1.y > 800/2 + 800:
background1.y = -800/2 # 背景1移动到背景2的正上方
if background2.y > 800/2 + 800:
background2.y = -800/2 # 背景2移动到背景1的正上方
background1.y += 1 # 背景1向下滚动
background2.y += 1 # 背景2向下滚动
TITLE 标题 title
WIDTH 宽度 width
HEIGHT 高度 height
screen 屏幕
sounds 声音
actor 角色
background 背景
hero 英雄,在此指玩家飞机
bullet 子弹
enemy 敌人
import pgzrun # 导入游戏库
from pgzero.actor import Actor
TITLE="飞机大战"
WIDTH = 480 # 设置窗口的宽度
HEIGHT = 600 # 设置窗口的高度
background = Actor('bg1') # 导入背景图片
hero = Actor('hero') # 导入玩家飞机图片
hero.x = WIDTH/2 # 设置玩家飞机的x坐标
hero.y = HEIGHT*2/3 # 设置玩家飞机的y坐标
def draw():
background.draw() # 绘制游戏背景
hero.draw() # 绘制玩家飞机
def on_mouse_move(pos, rel, buttons): # 当鼠标移动时执行
hero.x = pos[0] # 玩家飞机的x坐标设为鼠标的x坐标
hero.y = pos[1] # 玩家飞机的y坐标设为鼠标的y坐标
pgzrun.go() # 开始执行游戏
import pgzrun # 导入游戏库
from pgzero.actor import Actor
WIDTH = 480 # 设置窗口的宽度
HEIGHT = 600 # 设置窗口的高度
TITLE="飞机大战"
background1 = Actor('bg1') # 导入背景图片
background1.x = 480/2 # 背景1的x坐标
background1.y = 800/2 # 背景1的y坐标
background2 = Actor('bg1') # 导入背景图片
background2.x = 480/2 # 背景2的x坐标
background2.y = -800/2
hero = Actor('hero') # 导入玩家飞机图片
hero.x = WIDTH/2 # 设置玩家飞机的x坐标
hero.y = HEIGHT*2/3 # 设置玩家飞机的y坐标
def draw(): # 绘制模块,每帧重复执行
background1.draw() # 绘制游戏背景
background2.draw() # 绘制游戏背景
hero.draw() # 绘制玩家飞机
def update(): # 更新模块,每帧重复操作
# 以下代码用于实现背景图片的循环滚动效果
if background1.y > 800/2 + 800:
background1.y = -800/2 # 背景1移动到背景2的正上方
if background2.y > 800/2 + 800:
background2.y = -800/2 # 背景2移动到背景1的正上方
background1.y += 1 # 背景1向下滚动
background2.y += 1 # 背景2向下滚动
def on_mouse_move(pos, rel, buttons): # 当鼠标移动时执行
hero.x = pos[0] # 玩家飞机的x坐标设为鼠标的x坐标
hero.y = pos[1] # 玩家飞机的y坐标设为鼠标的y坐标
pgzrun.go() # 开始执行游戏
bullet = Actor(‘bomb0’) # 导入子弹图片
bullet.x = WIDTH/2 # 子弹的x坐标
bullet.y = -HEIGHT # 子弹的y坐标,开始不可见
当鼠标键按下时,把子弹位置设为玩家飞机的正上方
def on_mouse_down(): # 当鼠标键按下时
bullet.x = hero.x # 把子弹位置设为玩家飞机的正上方
bullet.y = hero.y - 30
更新中增加
if bullet.y > -HEIGHT:
bullet.y = bullet.y - 8 # 子弹自动向上移动
敌机
enemy = Actor(‘enemy’) # 导入敌机图片
enemy.x = WIDTH/2 # 设置敌机的x坐标
enemy.y = 0 # 设置敌机的y坐标
敌机自动下落
enemy.y += 3
if enemy.y > HEIGHT: # 敌机落到画面底部
enemy.y = 0 # 敌机从上面重新出现
enemy.x = random.randint(30, WIDTH-30) # 敌机水平位置随机
global score
if bullet.colliderect(enemy): # 子弹与敌机发生碰撞后
enemy.y = 0 # 敌机从上面重新出现
enemy.x = random.randint(0, WIDTH) # 敌机水平位置随机
score = score + 1 # 得分加1
bullet.y = -HEIGHT # 隐藏子弹
global isLoose
if hero.colliderect(enemy): # 玩家飞机和敌机发生碰撞
isLoose = True # 游戏失败
hero.image = 'blowup' # 更换游戏玩家的图片为爆炸图片
# 不加此句,只显爆炸图
if isLoose: # 游戏失败后输出信息
screen.draw.text("游戏失败!", (50, HEIGHT/2), fontsize=90,fontname='simhei', color='red')
import pgzrun # 导入游戏库
from pgzero.actor import Actor
import random
from pgzero.screen import Screen
screen: Screen # 类型标注
from pgzero.loaders import sounds, images
TITLE="飞机大战"
WIDTH = 480 # 设置窗口的宽度
HEIGHT = 600 # 设置窗口的高度
background1 = Actor('bg1') # 导入背景图片
background1.x = 480/2 # 背景1的x坐标
background1.y = 800/2 # 背景1的y坐标
background2 = Actor('bg1') # 导入背景图片
background2.x = 480/2 # 背景2的x坐标
background2.y = -800/2
hero = Actor('hero') # 导入玩家飞机图片
hero.x = WIDTH/2 # 设置玩家飞机的x坐标
hero.y = HEIGHT*2/3 # 设置玩家飞机的y坐标
bullet = Actor('bomb0') # 导入子弹图片
bullet.x = WIDTH/2 # 子弹的x坐标
bullet.y = -HEIGHT # 子弹的y坐标,开始不可见
enemy = Actor('enemy') # 导入敌机图片
enemy.x = WIDTH/2 # 设置敌机的x坐标
enemy.y = 0 # 设置敌机的y坐标
score = 0 # 游戏得分
isLoose = False # 游戏是否失败,初始不失败
def draw(): # 绘制模块,每帧重复执行
background1.draw() # 绘制游戏背景
background2.draw() # 绘制游戏背景
hero.draw() # 绘制玩家飞机
enemy.draw() # 绘制敌机飞机
bullet.draw() # 绘制子弹
# 下面显示得分
screen.draw.text("得分: "+str(score), (10,20), fontsize=30,
fontname='simhei', color='red')
# 不加此句,玩家变成爆炸图一样可以发子弹哟
if isLoose: # 游戏失败后输出信息
screen.draw.text("游戏失败!", (50, HEIGHT/2), fontsize=90,fontname='simhei', color='red')
def update(): # 更新模块,每帧重复操作
global isLoose
if not isLoose:
# 以下代码用于实现背景图片的循环滚动效果
if background1.y > 800/2 + 800:
background1.y = -800/2 # 背景1移动到背景2的正上方
if background2.y > 800/2 + 800:
background2.y = -800/2 # 背景2移动到背景1的正上方
background1.y += 1 # 背景1向下滚动
background2.y += 1 # 背景2向下滚动
if bullet.y > -HEIGHT:
bullet.y = bullet.y - 10 # 子弹自动向上移动
enemy.y += 3 # 敌机自动下落
if enemy.y > HEIGHT: # 敌机落到画面底部
enemy.y = 0 # 敌机从上面重新出现
enemy.x = random.randint(30, WIDTH-30) # 敌机水平位置随机
global score
if bullet.colliderect(enemy): # 子弹与敌机发生碰撞后
sounds.explode.play() # 播放玩家飞机爆炸音效
enemy.y = 0 # 敌机从上面重新出现
enemy.x = random.randint(0, WIDTH) # 敌机水平位置随机
score = score + 1 # 得分加1
bullet.y = -HEIGHT # 隐藏子弹
if hero.colliderect(enemy): # 玩家飞机和敌机发生碰撞
sounds.explode.play() # 播放玩家飞机爆炸音效
isLoose = True # 游戏失败
hero.image = 'blowup' # 更换游戏玩家的图片为爆炸图片
def on_mouse_move(pos, rel, buttons): # 当鼠标移动时执行
hero.x = pos[0] # 玩家飞机的x坐标设为鼠标的x坐标
hero.y = pos[1] # 玩家飞机的y坐标设为鼠标的y坐标
def on_mouse_down(): # 当鼠标键按下时
bullet.x = hero.x # 把子弹位置设为玩家飞机的正上方
bullet.y = hero.y - 20
sounds.射击07.play()
pgzrun.go() # 开始执行游戏
可关注博主后,私聊博主免费获取
需要技术指导,育娃新思考,企业软件合作等更多服务请联系博主
今天是以此模板持续更新此育儿专栏的第2/50次。
可以关注我,点赞我、评论我、收藏我啦。