飞机大战实战项目解析(超详细版)

这篇具有很好参考价值的文章主要介绍了飞机大战实战项目解析(超详细版)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

# 导包
import time
import pygame
import random
# 初始化游戏
pygame.init()
# 显示窗口
screen = pygame.display.set_mode((480, 650))
# 修改游戏图标
icon = pygame.image.load("img/icon.png")
pygame.display.set_icon(icon)
# 加载背景
bg_img = pygame.image.load("img/background.png")

# 加载战机
hero_img1 = pygame.image.load("img/me1.png")
hero_img2 = pygame.image.load("img/me2.png")
# 定义战机
hero_rect = pygame.rect.Rect(189, 524, 102, 126)
heroPlaneX = hero_rect.x
heroPlaneY = hero_rect.y
pygame.key.set_repeat(20, 30)
# 显示战机要用参数
a = "单发"

# 定义英雄子弹
class HeroBullet:
    def __init__(self, x, y, screen):
        self.x = x
        self.y = y
        self.show = screen
        self.pic = pygame.image.load("img/bullet1.png")

    # 画子弹
    def draw(self):
        self.show.blit(self.pic,(self.x,self.y))
        self.move()

    # 子弹移动
    def move(self):
        self.y -= 5

# 战机子弹列表
hero_Bulletlist = []
# 战机爆炸条件
hero_bomb = False
# 战机爆炸索引
hero_bomb_index = 0
# 战机爆炸图片
hero_bomb_list = ["img/enemy1_down1.png",
                  "img/enemy1_down2.png",
                  "img/enemy1_down3.png",
                  "img/enemy1_down4.png"]


# 加载敌机
di_img = pygame.image.load("img/enemy2.png")
# 定义敌机
di_rect = pygame.rect.Rect(189, 0, 69, 99)
diPlaneX = di_rect.x
diPlaneY = di_rect.y
# 敌机移动要用的参数
b = 'left'
# 敌机子弹
class DiBullet:
    def __init__(self,x,y,screen):
        self.x = x
        self.y = y
        self.show = screen
        self.pic = pygame.image.load("img/bullet2.png")

    # 画子弹
    def draw(self):
        self.show.blit(self.pic,(self.x,self.y))
        self.move()

    # 子弹移动
    def move(self):
        self.y += 5

# 敌机子弹列表
di_Bulletlist = []
# 敌机爆炸条件
is_bomb = False
# 敌机爆炸索引
di_bomb_index = 0
# 敌机爆炸图片
di_bomb_list = ["img/enemy1_down1.png",
                "img/enemy1_down2.png",
                "img/enemy1_down3.png",
                "img/enemy1_down4.png"]

clock = pygame.time.Clock()
while True:
    clock.tick(120)
    # 显示背景
    screen.blit(bg_img, (0, 0))

    # 战机底部飞入
    heroPlaneY -= 1
    if heroPlaneY <= 0:
        heroPlaneY = 500
    # 获取所有监听事件
    event_list = pygame.event.get()
    # 获取窗口退出事件
    for event in event_list:
        if event.type == pygame.QUIT:
            print("游戏结束了")
            # 卸载模块
            pygame.quit()
            exit(0)

        # 战机移动
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                heroPlaneX = heroPlaneX-10 if heroPlaneX >= 5 else 0
            elif event.key == pygame.K_RIGHT:
                heroPlaneX = heroPlaneX+10 if heroPlaneX <=370 else 380
            elif event.key == pygame.K_UP:
                heroPlaneY = heroPlaneY-10 if heroPlaneY >=5 else 0
            elif event.key == pygame.K_DOWN:
                heroPlaneY = heroPlaneY+20 if heroPlaneY <=521 else 526
            elif event.key == pygame.K_SPACE:
                hero_bullet = HeroBullet(heroPlaneX+40+10, heroPlaneY-11,screen)
                hero_Bulletlist.append(hero_bullet)
    # 调用函数画出战机子弹
    for bullet in hero_Bulletlist:
        bullet.draw()
    # 定义战机子弹的rect
        hero_bullet_rect = pygame.rect.Rect(bullet.x,bullet.y,5,11)
    # 检测敌机和子弹矩形是否相交
        flag = hero_bullet_rect.colliderect(di_rect)
        # 如果相交
        if flag:
            print("敌机爆炸")
            is_bomb = True
            hero_Bulletlist.remove(bullet)

    # 绘制敌机爆炸图片
    if is_bomb == False:
        #
        screen.blit(di_img,(diPlaneX,diPlaneY))
    else:
        #
        if di_bomb_index == len(di_bomb_list):
            time.sleep(0.2)
            exit(0)
        di_bomb_img = pygame.image.load(di_bomb_list[di_bomb_index])
        screen.blit(di_bomb_img,(diPlaneX,diPlaneY))
        di_bomb_index += 1
        time.sleep(0.2)


    # 显示敌机
    # screen.blit(di_img,(diPlaneX,diPlaneY))
    # 敌机移动
    if b == 'left':
        diPlaneX = diPlaneX-3
        if diPlaneX <= 0:
            b = 'right'
    elif b == 'right':
        diPlaneX = diPlaneX+3
        if diPlaneX >= 480-60:
            b = 'left'
    # 定义敌机子弹
    x = random.randint(1, 100)
    if x == 5 or x == 78:
        enemybullet = DiBullet(diPlaneX+(69+5)/2, diPlaneY+99, screen)
        di_Bulletlist.append(enemybullet)
    for bullet1 in di_Bulletlist:
        bullet1.draw()
        di_bullet_rect = pygame.rect.Rect(bullet1.x,bullet1.y,9,21)

        flag = di_bullet_rect.colliderect(hero_rect)
        if flag:
            print("战机爆炸")
            hero_bomb = True
            di_Bulletlist.remove(bullet1)
    if hero_bomb == False:
        # 显示战机
        if a == "连发":
            screen.blit(hero_img1, (heroPlaneX, heroPlaneY))
            a = "连发"
        else:
            screen.blit(hero_img2, (heroPlaneX, heroPlaneY))
            a = "单发"
    else:
        if hero_bomb_index == len(hero_bomb_list):
            time.sleep(0.5)
            exit()
        hero_bomb_img = pygame.image.load(hero_bomb_list[hero_bomb_index])
        screen.blit(hero_bomb_img,(heroPlaneX, heroPlaneY))
        hero_bomb_index += 1
        time.sleep(0.5)

    # 循环显示所有图片
    pygame.display.update()

分段解析

1.导包和初始化

import time
import pygame
import random

导入必要的Python模块:time用于处理时间相关的功能,pygame是用于游戏开发的库,random用于生成随机数。

pygame.init()

初始化Pygame库,这是使用Pygame之前必须做的。

2. 设置窗口和图标

screen = pygame.display.set_mode((480, 650))

创建一个游戏窗口,大小为480x650像素。

icon = pygame.image.load("img/icon.png")
pygame.display.set_icon(icon)

加载游戏图标并设置到游戏窗口。

3. 加载游戏资源

bg_img = pygame.image.load("img/background.png")

加载背景图片。

hero_img1 = pygame.image.load("img/me1.png")
hero_img2 = pygame.image.load("img/me2.png")

加载英雄战机的两种不同状态图片。

4.定义英雄飞机和敌机的基本属性

hero_rect = pygame.rect.Rect(189,524,102,126)
heroPlaneX = hero_rect.x
heroPlaneY = hero_rect.y
pygame.key.set_repeat(20,30)

创建英雄战机的矩形区域,并设置初始位置。pygame.key.set_repeat用于设置按键重复的延迟和间隔。

5.英雄飞机子弹类

a = "单发"

一个变量,用于控制英雄战机的图片切换。

class HeroBullet:
    def __init__(self,x,y,screen):
        self.x = x
        self.y = y
        self.show = screen
        self.pic = pygame.image.load("img/bullet1.png")

    # 画子弹
    def draw(self):
        self.show.blit(self.pic,(self.x,self.y))
        self.move()

    # 子弹移动
    def move(self):
        self.y -= 5

# 战机子弹列表
hero_Bulletlist = []
# 战机爆炸条件
hero_bomb = False
# 战机爆炸索引
hero_bomb_index = 0
# 战机爆炸图片
hero_bomb_list = ["img/enemy1_down1.png",
                  "img/enemy1_down2.png",
                  "img/enemy1_down3.png",
                  "img/enemy1_down4.png"]


# 加载敌机
di_img = pygame.image.load("img/enemy2.png")
# 定义敌机
di_rect = pygame.rect.Rect(189, 0, 69, 99)
diPlaneX = di_rect.x
diPlaneY = di_rect.y
# 敌机移动要用的参数
b = 'left'
# 敌机子弹
class DiBullet:
    def __init__(self,x,y,screen):
        self.x = x
        self.y = y
        self.show = screen
        self.pic = pygame.image.load("img/bullet2.png")

    # 画子弹
    def draw(self):
        self.show.blit(self.pic,(self.x,self.y))
        self.move()

    # 子弹移动
    def move(self):
        self.y += 5

# 敌机子弹列表
di_Bulletlist = []
# 敌机爆炸条件
is_bomb = False
# 敌机爆炸索引
di_bomb_index = 0
# 敌机爆炸图片
di_bomb_list = ["img/enemy1_down1.png",
                "img/enemy1_down2.png",
                "img/enemy1_down3.png",
                "img/enemy1_down4.png"]

这段代码定义了两个类 HeroBullet 和 DiBullet,分别用于创建和渲染英雄战机和敌机的子弹。同时,它还初始化了一些用于控制游戏逻辑的变量。

HeroBullet 类

这个类用于创建英雄战机的子弹。每个子弹对象都有以下属性和方法:

x 和 y:子弹在屏幕上的坐标。

show:游戏屏幕的表面对象,用于在屏幕上绘制子弹。

pic:子弹的图像,通过 pygame.image.load 加载。

draw() 方法:在屏幕上绘制子弹,并调用 move() 方法来更新子弹的位置。

move() 方法:将子弹的 y 坐标减少 5,使子弹向上移动。

DiBullet 类

这个类用于创建敌机的子弹。它的结构和工作方式与 HeroBullet 类似,但是子弹的移动方向相反:子弹的 y 坐标增加 5,使子弹向下移动。

游戏逻辑变量

hero_Bulletlist 和 di_Bulletlist:这两个列表分别存储英雄战机和敌机的子弹对象。

hero_bomb 和 is_bomb:这两个布尔变量用于判断战机是否应该爆炸。

hero_bomb_index 和 di_bomb_index:这两个整型变量用于跟踪爆炸动画的当前帧。

hero_bomb_list 和 di_bomb_list:这两个列表包含战机爆炸动画的帧图像文件路径。

敌机初始化

di_img:加载敌机的图像。

di_rect:定义敌机的矩形区域,用于碰撞检测。

diPlaneX 和 diPlaneY:存储敌机的当前位置。

b:控制敌机移动方向的变量,初始值为 'left'。

敌机移动逻辑

敌机的移动逻辑在主游戏循环中实现,根据变量 b 的值,敌机在屏幕上左右移动。当敌机到达屏幕边缘时,改变移动方向。

爆炸逻辑

当战机被子弹击中时,相应的爆炸条件变量 (hero_bomb 或 is_bomb) 设置为 True,并在游戏循环中触发爆炸动画。动画通过遍历爆炸图像列表来实现,每次循环显示一张图像,直到列表中的所有图像都被显示一遍。

这段代码是游戏的一部分,它需要与游戏的主循环和事件处理逻辑结合使用。在主循环中,将创建子弹对象,更新它们的位置,检测碰撞,并绘制到屏幕上。当战机或敌机被击中时,将触发爆炸动画,最终可能结束游戏或进行其他游戏逻辑的处理。

clock = pygame.time.Clock()

创建一个时钟对象,用于控制游戏的帧率。

6.游戏循环和事件处理

while True:
    clock.tick(120)

游戏的主循环,所有游戏逻辑都在这个循环中处理。

游戏循环开始,clock.tick(120) 设置每秒钟最多执行120次循环,即游戏的帧率为120FPS。

screen.blit(bg_img, (0, 0))

在屏幕上绘制背景图像,位于屏幕的左上角。

 heroPlaneY -= 1
    if heroPlaneY <= 0:
        heroPlaneY = 500

英雄战机的Y坐标每帧减少1,模拟战机移动。如果战机移动到屏幕顶部之外,将其重新设置到屏幕底部。

event_list = pygame.event.get()

获取所有pygame事件。

 for event in event_list:
        if event.type == pygame.QUIT:
            print("游戏结束了")
            pygame.quit()
            exit(0)

遍历事件列表,如果检测到QUIT事件(通常是用户关闭窗口),则打印游戏结束信息,卸载pygame模块,并退出程序。

 if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                heroPlaneX = heroPlaneX-10 if heroPlaneX >= 5 else 0
            elif event.key == pygame.K_RIGHT:
                heroPlaneX = heroPlaneX+10 if heroPlaneX <=370 else 380
            elif event.key == pygame.K_UP:
                heroPlaneY = heroPlaneY-10 if heroPlaneY >=5 else 0
            elif event.key == pygame.K_DOWN:
                heroPlaneY = heroPlaneY+20 if heroPlaneY <=521 else 526
            elif event.key == pygame.K_SPACE:
                hero_bullet = HeroBullet(heroPlaneX+40+10, heroPlaneY-11,screen)
                hero_Bulletlist.append(hero_bullet)

如果检测到KEYDOWN事件(键盘按键按下),则根据按下的键来移动战机或发射子弹。


     for bullet in hero_Bulletlist:
        bullet.draw()
    # 定义战机子弹的rect
        hero_bullet_rect = pygame.rect.Rect(bullet.x,bullet.y,5,11)
    # 检测敌机和子弹矩形是否相交
        flag = hero_bullet_rect.colliderect(di_rect)
        # 如果相交
        if flag:
            print("敌机爆炸")
            is_bomb = True
            hero_Bulletlist.remove(bullet)
for bullet in hero_Bulletlist:
        bullet.draw()

遍历英雄战机的子弹列表,调用每个子弹的draw方法来绘制它们,并检测子弹是否与敌机碰撞。

 for bullet in hero_Bulletlist:
        bullet.draw()
    # 定义战机子弹的rect
        hero_bullet_rect = pygame.rect.Rect(bullet.x,bullet.y,5,11)
    # 检测敌机和子弹矩形是否相交
        flag = hero_bullet_rect.colliderect(di_rect)
        # 如果相交
        if flag:
            print("敌机爆炸")
            is_bomb = True
            hero_Bulletlist.remove(bullet)

如果敌机没有被击中(is_bomb为False),则绘制敌机。否则,播放敌机爆炸动画。

  for bullet1 in di_Bulletlist:
        bullet1.draw()
        di_bullet_rect = pygame.rect.Rect(bullet1.x,bullet1.y,9,21)

        flag = di_bullet_rect.colliderect(hero_rect)
        if flag:
            print("战机爆炸")
            hero_bomb = True
            di_Bulletlist.remove(bullet1)

遍历敌机的子弹列表,调用每个子弹的draw方法来绘制它们,并检测子弹是否与英雄战机碰撞。

if is_bomb == False:
        #
        screen.blit(di_img,(diPlaneX,diPlaneY))
    else:
        #
        if di_bomb_index == len(di_bomb_list):
            time.sleep(0.2)
            exit(0)
        di_bomb_img = pygame.image.load(di_bomb_list[di_bomb_index])
        screen.blit(di_bomb_img,(diPlaneX,diPlaneY))
        di_bomb_index += 1
        time.sleep(0.2)

如果英雄战机没有被击中(hero_bomb为False),则绘制战机。否则,播放战机爆炸动画。

7.游戏结束条件

pygame.display.update()

更新整个屏幕的显示,这是游戏循环的最后一部分。

总结分析:

1.游戏初始化:

1.1导入所需的模块:time, pygame, random。

1.2初始化游戏窗口,设置窗口大小为480x650像素。

1.3加载游戏图标和背景图片。

1.4加载英雄机和敌机的图片,并定义它们的矩形区域。

1.5设置键盘重复事件,以便在按下键时能够连续移动英雄机。

2.英雄机控制:

2.1英雄机在窗口中上下移动,并且当到达窗口底部时会重新出现在顶部。

2.2英雄机可以通过键盘的左右键来移动。

2.3按下空格键时,英雄机会发射子弹。

3.子弹和敌机:

3.1英雄机的子弹是一个单独的类 HeroBullet,它有绘制和移动子弹的方法。

3.2敌机也是一个单独的类 DiBullet,它有绘制和移动敌机子弹的方法。

3.3敌机子弹列表 enemy_Bulletlist 和英雄机子弹列表 hero_Bulletlist 用于存储所有子弹对象。

4.碰撞检测:

4.1使用 colliderect 函数来检测英雄子弹和敌机,以及敌机子弹和英雄机之间的碰撞。

4.2当发生碰撞时,相应的子弹会被移除,并且敌机或英雄机会触发爆炸效果。

5.爆炸效果:

5.1爆炸条件 is_bomb 和 hero_bomb 用于指示敌机和英雄机是否发生了爆炸。

5.2爆炸图片列表 enemy_bomb_list 和 hero_bomb_list 包含了用于显示爆炸的图片。

5.3当爆炸条件为真时,会循环显示爆炸图片,直到图片索引到达列表的末尾,然后结束游戏或重新开始。

6.游戏循环:

6.1游戏循环不断运行,处理事件、更新游戏状态、绘制图像,并更新窗口显示。

6.2循环中使用了 pygame.display.update() 来刷新屏幕显示。

7.游戏结束:

7.1游戏中设置了退出事件,当用户关闭窗口或按下退出键时,游戏会打印“游戏结束了”,并退出程序。文章来源地址https://www.toymoban.com/news/detail-856503.html

到了这里,关于飞机大战实战项目解析(超详细版)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python实验,用pygame做飞机大战游戏设计

    摘 要:根据课程要求,以及面向对象程序设计的编程思想,在Windows操作系统环境下,运用PyCharm编译程序,以Python语言为开发语言,最终实现飞机大战游戏相应的游戏操作功能。Python是一种跨平台的、开源的、免费的、解释型的高级编程语言。它具有丰富的、强大的库, 能够

    2024年02月07日
    浏览(43)
  • pygame飞机大战小游戏(python大作业)

      python大作业,在查看了老师给的链接发现教学视频不完整,所以借用了同学的《Python编程 从入门到实践》中的一个项目,学习模仿。 二、游戏具体介绍 这是一款由辉辉亲自打造的太空对战小游戏。 游戏背景:在广袤无垠的太空里有一群蓝精灵(不是)有一群邪恶的坏人,

    2024年02月11日
    浏览(59)
  • 【python】 pygame学习示例 --飞机大战小游戏制作

    python版本:3.8.5 所需模块:pygame random os pygame版本:20.1 开发环境:pycharm专业版 硬件环境:win11 8G内存以上 使用python的第三方库–pygame 制作飞机大战小游戏 小游戏的内容包括: 玩家player的移动 子弹的发射 陨石的随机掉落(包括旋转 大小 下落角度) 玩家 子弹 陨石的碰撞交互

    2024年02月04日
    浏览(55)
  • python+pygame之飞机大战-第一版源代码分析

    目录 一、源代码 二、源代码梳理分析: (一)代码的主要结构 1、引用需要的模块 2、定义的类 3、定义main()函数:主程序 (二)代码分析收获 最好的学习方法是学习别人的代码,加上自己以前比较喜欢雷电这款游戏,所以就从飞机大战入手了,从网上下的源代码和图片素材

    2023年04月10日
    浏览(42)
  • Python3+pygame实现有趣好玩的飞机大战游戏(附源码及素材)

    版权声明:原创不易,本文禁止抄袭、转载,侵权必究! 开发环境 :Windows10 Python3.6.4 第三方库 :Pygame1.9.6 IDE :PyCharm/Sublime Text 素材模块 游戏图片素材: BGM及音效素材: 字体素材: 源码模块 子弹模块 普通子弹部分源码: 超级子弹部分源码: 敌机子弹部分源码: 敌机模

    2024年02月11日
    浏览(61)
  • python飞机大战实战演练代码

    # 以下是飞机大战的精灵组函数

    2024年02月08日
    浏览(47)
  • python项目:飞机大战已封装(第一部分)第二部分在飞机大战专辑,后期合并

    图片资源已经展示在了顶部 上面我们用import进行了导包以方便后期调用,并用pygame.init()进行了初始化,pygame的所有使用都需要初始化,然后用pygame.display.set_mode创建游戏总画布注意总画布大小要与背景图相关联 英雄子弹类解析 在许多射击游戏中,子弹类是基本的组成部分之

    2024年04月17日
    浏览(39)
  • python小游戏开发(飞机大战)

    目录 一:背景       1. pygame 模块初识 二.项目设计内容 开发一款飞机大战游戏,要求: (1)实现飞机的移动、子弹发射,对本次游戏有一个初步的编写及认识。 (2)飞机的持续按键移动和飞机自爆优化。 (3)进行基类的抽取,使代码更具有层次性和简化重复代码。 (

    2024年02月16日
    浏览(49)
  • 用Python开发一个飞机大战游戏(附源码教程)

    点击蓝字 关注我们 Python是一门非常简单的语言,快速入门之后可以做很多事情!比如爬虫啊,数据分析啊,自动化运维啊,机器学习,量化分析等等!但是入门到进阶的过程有时会非常痛苦,如果有一些好玩有趣的例子就好了。 比如通过游戏来学编程是一个非常好的途径,

    2024年04月14日
    浏览(45)
  • 20个经典面试问题Python面向对象实战--飞机大战(1),Python中高级面试必知必会

    each.reset() for each in mid_enemies: if each.active: each.move() if each.hit: screen.blit(each.image_hit, each.rect) each.hit = False else: screen.blit(each.image1, each.rect) pygame.draw.line(screen, BLACK, (each.rect.left, each.rect.top - 5), (each.rect.right, each.rect.top - 5), energy_remain = each.energy / enemy.MidEnemy.energy if energy_remain 0.2: en

    2024年04月15日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包