当前位置: 首页 > news >正文

小学生python游戏编程2----飞机大战1

小学生python游戏编程2----飞机大战1

      • 前言
    • 主要设计
      • 1、界面设计
      • 2、动态背景
      • 3、记分的实现
      • 4、射击游戏功能的实现
      • 5、声音的实现
    • 应用知识点
      • 1、python知识点
        • 1.1 角色创建,也即对象的创建
        • 1.2、函数的定义与引用
      • 2、pygamezero知识点
        • 2.1 Actor标红提示,库的导入问题
        • 2.2 游戏标题,大小写不一样
        • 2.3 背景角色的关健点
        • 2.4 声音控制使用注意点
      • 3、英语单词掌握
    • 代码实现
      • a、主游戏界面,玩家显示
      • b、 通过背景图的移动,形成飞机一直在飞的效果
      • C、 子弹生成
      • D、敌机实现
      • E、 得分
      • F、玩家与敌机碰撞,结束画面
      • 完整代码
    • 总结
      • *通过此次的《飞机大战》游戏的初步实现,可以对pgzrun的相关知识有了进一步的了解,对pyzero这门语言也有了比以前更深刻的认识。 pyzero的一些基本语法,比如角色、声音、背景,界面控制等,理解更加透彻。如果大家喜欢,关注点先赞较多,后期还会针对此体材进一步增加敌机带着英语单词,或数学口算题,制一个英语单词飞机大战。有兴趣的可关注讨论哟。感䜒您为了孩子看到现在,谢谢。*
    • 源码获取

前言

	飞机大战想必是很多人童年时期的经典游戏,我们依旧能记得抱个老人机娱乐的场景,这篇文章主要给大家介绍了关于如何利用python,pgzrun写一个简单的飞机大战小游戏的相关一步步实现的资料,以后想把英语 单词的学习能加进来,先实现不带单词的功能,需要的朋友可以参考下

主要设计

1、界面设计

游戏主界面以窗口形式给出,设置窗口大小为400x600, 利背景更换(两张背景替换显示),添加玩家飞机及敌机。通过检测子弹或玩家与敌机相碰进行得减分。

2、动态背景

利用背景图片的上下滚动,制造飞机在天空中飞行的效果

3、记分的实现

游戏过程中,每打掉一个敌机,增加一分,玩家碰到敌机后游戏结束,以后可以改成返回,或分数达到多少后至一下关。

4、射击游戏功能的实现

按下左健,发射子弹,子弹发射后通过修改子弹图片的位置,实现子弹飞行的效果,位置改变大小可以调整子弹飞行的速度

5、声音的实现

发射时的声音,玩家碰到敌机的销毁图与声音,子弹打到敌机的爆炸声

应用知识点

1、python知识点

1.1 角色创建,也即对象的创建

背景,敌机,子弹,玩家等角色的创建,引入图片,定位位置
background1 = Actor(‘bg1’) # 导入背景图片
background1.x = 480/2 # 背景1的x坐标
background1.y = 800/2 # 背景1的y坐标

1.2、函数的定义与引用

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()

2、pygamezero知识点

2.1 Actor标红提示,库的导入问题

通过加入以下语句可解决 from pgzero.actor import Actor
声音加载标红可加:from pgzero.loaders import sounds

2.2 游戏标题,大小写不一样

TITLE=“飞机大战”,title要大写,类似点:WIDTH = 480 # 设置窗口的宽度,HEIGHT = 600 # 设置窗口的高度

2.3 背景角色的关健点

取同张背景图片,设置两个角色,初始定位设置不同

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向下滚动

2.4 声音控制使用注意点

sounds.射击07.play()
在这里插入图片描述

3、英语单词掌握

TITLE 标题 title
WIDTH 宽度 width
HEIGHT 高度 height
screen 屏幕
sounds 声音
actor 角色
background 背景
hero 英雄,在此指玩家飞机
bullet 子弹
enemy 敌人

代码实现

a、主游戏界面,玩家显示

在这里插入图片描述

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()  # 开始执行游戏

b、 通过背景图的移动,形成飞机一直在飞的效果

在这里插入图片描述

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()  # 开始执行游戏

C、 子弹生成

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 # 子弹自动向上移动

D、敌机实现

敌机
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) # 敌机水平位置随机

E、 得分

global score
if bullet.colliderect(enemy): # 子弹与敌机发生碰撞后
    enemy.y = 0 # 敌机从上面重新出现
    enemy.x = random.randint(0, WIDTH)  # 敌机水平位置随机
    score = score + 1 # 得分加1
    bullet.y = -HEIGHT  # 隐藏子弹   

在这里插入图片描述

F、玩家与敌机碰撞,结束画面

  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()  # 开始执行游戏

总结

通过此次的《飞机大战》游戏的初步实现,可以对pgzrun的相关知识有了进一步的了解,对pyzero这门语言也有了比以前更深刻的认识。 pyzero的一些基本语法,比如角色、声音、背景,界面控制等,理解更加透彻。如果大家喜欢,关注点先赞较多,后期还会针对此体材进一步增加敌机带着英语单词,或数学口算题,制一个英语单词飞机大战。有兴趣的可关注讨论哟。感䜒您为了孩子看到现在,谢谢。

源码获取

关注博主后,私聊博主免费获取
需要技术指导,育娃新思考,企业软件合作等更多服务请联系博主

今天是以此模板持续更新此育儿专栏的第2/50次。
可以关注我,点赞我、评论我、收藏我啦。

相关文章:

  • 用python实现自动回复QQ消息——不到60行
  • 第十三届蓝桥杯C++B组国赛E题——出差 (AC)
  • 【大数据ETL工具,Kettle的学习和使用】
  • C++----二叉树的进阶
  • java基于微信小程序的智能停车场管理系统+ssm+uinapp+Mysql+计算机毕业设计
  • 学会这个样生成性能测试报告,拿下20k轻轻松松
  • 爬取小说章节,并制作成词云进行宣传
  • [架构之路-18]:目标系统 - 硬件平台 - 案例1 - 单片机MCU STM32 芯片的工作原理与启动流程
  • C++内存管理以及模板的引入
  • ROS问题:gazebo没有想要的模型,而且不报错
  • 【SpringBoot+MyBatisPlus】点餐系统之登录功能、退出功能设计
  • 操作符(operator)
  • 数据同步工具—Sqoop
  • 文件上传之中间件解析漏洞详解
  • 【每日一好题】这么经典的题你不能不会:矩阵置零
  • [js高手之路]搞清楚面向对象,必须要理解对象在创建过程中的内存表示
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • 2018天猫双11|这就是阿里云!不止有新技术,更有温暖的社会力量
  • 2019.2.20 c++ 知识梳理
  • canvas 高仿 Apple Watch 表盘
  • Git学习与使用心得(1)—— 初始化
  • HashMap剖析之内部结构
  • HTTP--网络协议分层,http历史(二)
  • Logstash 参考指南(目录)
  • Nginx 通过 Lua + Redis 实现动态封禁 IP
  • Unix命令
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 机器学习 vs. 深度学习
  • 技术:超级实用的电脑小技巧
  • 入手阿里云新服务器的部署NODE
  • 深度学习在携程攻略社区的应用
  • 数据库写操作弃用“SELECT ... FOR UPDATE”解决方案
  • 腾讯视频格式如何转换成mp4 将下载的qlv文件转换成mp4的方法
  • 协程
  • MyCAT水平分库
  • 阿里云移动端播放器高级功能介绍
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • (2)MFC+openGL单文档框架glFrame
  • (iPhone/iPad开发)在UIWebView中自定义菜单栏
  • (k8s中)docker netty OOM问题记录
  • (LeetCode 49)Anagrams
  • (TOJ2804)Even? Odd?
  • (二)PySpark3:SparkSQL编程
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (附源码)SSM环卫人员管理平台 计算机毕设36412
  • (三分钟了解debug)SLAM研究方向-Debug总结
  • (十一)c52学习之旅-动态数码管
  • (学习日记)2024.02.29:UCOSIII第二节
  • (转)LINQ之路
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • (转载)PyTorch代码规范最佳实践和样式指南
  • .NET处理HTTP请求
  • .net反编译的九款神器
  • .NET开源全面方便的第三方登录组件集合 - MrHuo.OAuth
  • /etc/motd and /etc/issue