单击游戏交流网

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 128|回复: 0

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

[复制链接]

2

主题

4

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2022-12-4 16:35:41 | 显示全部楼层 |阅读模式
前言

        飞机大战想必是很多人童年时期的经典游戏,我们依旧能记得抱个老人机娱乐的场景,这篇文章主要给大家介绍了关于如何利用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向下滚动
.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次。
可以关注我,点赞我、评论我、收藏我啦。
回复

使用道具 举报

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

本版积分规则

Archiver|手机版|小黑屋|单击游戏交流网

Copyright © 2001-2013 Comsenz Inc.Template by Comsenz Inc.All Rights Reserved.

Powered by Discuz!X3.4

快速回复 返回顶部 返回列表