小学生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()

编程飞机大战代码python 编程飞机大战游戏视频_编程飞机大战代码python

3、英语单词掌握

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

代码实现

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

编程飞机大战代码python 编程飞机大战游戏视频_编程飞机大战代码python_02

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、 通过背景图的移动,形成飞机一直在飞的效果

编程飞机大战代码python 编程飞机大战游戏视频_开发语言_03

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  # 隐藏子弹

编程飞机大战代码python 编程飞机大战游戏视频_游戏_04

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

编程飞机大战代码python 编程飞机大战游戏视频_背景图片_05

完整代码

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的一些基本语法,比如角色、声音、背景,界面控制等,理解更加透彻。