Python实现飞机大战游戏(后附完整代码文件和素材)

2023-11-07

前言

自学Python的记录,不喜勿喷!
本程序的代码是以B站黑马程序员的视频代码为基础,个人加以总结思考,写就的博文,纯属记录自己的学习历程!

当初想到要用Python的pygame模块开发飞机大战游戏的时候,顿时就兴奋了,毕竟学以致用是最好的学习方式,何况是做一个游戏,但是当我真正上手的时候发现并没有想象中的那么轻松。当然万事开头难,有了一定的经验之后,后面的路就会轻松许多了。

pygame模块安装

开发这个游戏的第一步是安装pygame模块,当初我完全按照老师的要求在终端中使用命令行来安装好了pygame,并且也能运行其内置的小游戏,但是打开文件import pygame模块的时候,不管我咋个弄永远都是“NO module named pygame”,我是装了卸,卸了装,捣鼓过来捣鼓过去,总是弄不好,心态崩了。于是我放弃了,但是心有不甘,查阅了多方资料,功夫不负有心人,最后无意中发现了我前面博客中的解决方法。https://blog.csdn.net/qq_43779324/article/details/104594396,当然其他大佬还有更好的解决方式,怪我当初没搜到,顺便吐槽一下CSDN的搜索功能,经常搜的是牛头不对马嘴,我谷歌啥的都能搜到CSDN博客内容,软件内就搜不到?具体安装方式大家可以看这个:https://blog.csdn.net/sinat_40043477/article/details/78276460?depth_1-utm_source=distribute.pc_relevant.none-task&utm_source=distribute.pc_relevant.none-task

pygame入门

在完成好pygame模块安装之后,就要正式开始我们的游戏开发了!在这之前,我们先来认识一下Python中的pygame模块,pygame是Python中的一个2D游戏开发库,支持声音和图像的编辑,当然在现在的3D游戏的普及下,pygame逐渐没落了,但是这不妨碍我们从中学到一些东西。pygame程序的大体结构就是下面这个样子,init()函数开始,quit()函数退出,中间就是具体的游戏代码。

import pygame
pygame.init()
# 编写游戏的代码
print("游戏的代码...")
pygame.quit()

使用Rect来描述矩形区域

Python游戏中以坐标系来描述游戏中各个组件的位置,原点在左上角,x轴水平向右、y轴水平向下。描述一个矩形区域还要有宽度和高度,因为一个坐标只能表示其左上角的位置,加上宽度和高度之后位置就定死了。

import pygame
hero_rect = pygame.Rect(100, 500, 120, 125)
print("英雄的原点%d %d" % (hero_rect.x, hero_rect.y))
print("英雄的尺寸%d %d" % (hero_rect.width, hero_rect.height))
print("%d %d" % hero_rect.size)

创建游戏窗口

pygame中专门提供了一个模块pygame.display用于创建、管理游戏窗口。其中有两个方法:

  • pygame.display.set_moudle():用于初始化游戏窗口。里面有四个参数,窗口的宽和高,是否全屏,窗口的颜色。
  • pygame.display.update():用于刷新屏幕内容显示,稍后使用。
import pygame
pygame.init()
# 创建游戏的窗口
pygame.display.set_mode((480, 700))
while True:
    pass
pygame.quit()

游戏窗口宽480,高700,单位是像素,这个设定是我们后面的背景图片一致。while循环是主游戏循环,只要没有命令退出游戏,就要一直执行下去。

绘制图像

游戏窗口创建完成之后,就要来放东西了,不然你就盯着一个黑麻麻的窗口看啥呢!pygame中的load()函数加载图像数据,blit()函数绘制图像,update()函数更新屏幕显示,每绘制一次图像就要调用一次update方法,当然也可以放在最后只调用一次update方法。

import pygame
pygame.init()
# 创建游戏的窗口
screen = pygame.display.set_mode((480, 700))
# 绘制背景图像
# 1.加载图像数据
bg = pygame.image.load("./images/background.png")
# 2.blit绘制图像
screen.blit(bg, (0, 0))
# 3.update更新屏幕显示
pygame.display.update()
# 绘制英雄的飞机
hero = pygame.image.load("./images/me1.png")
screen.blit(hero, (180,500))
pygame.display.update()
while True:
    pass
pygame.quit()

这些弄完之后就是下面这个样子:
在这里插入图片描述

游戏循环

游戏循环意味着游戏的开始,游戏循环的作用是保证游戏不会直接退出,变换图像位置来实现动画效果并检测与用户的交互内容。具体包括设置刷新帧率,检测用户交互,更新图像位置,更新屏幕显示等等。

while True:
	pass

游戏时钟

pygame中专门提供了一个类pygame.time.Clock可以非常方便的设置屏幕绘制速度——刷新帧率。在游戏初始化创建一个时钟对象,并在游戏循环中让时钟对象调用tick()方法,tick()方法会根据上次被调用的时间,自动设置游戏循环中的延时。

......
# 创建时钟对象
clock = pygame.time.Clock()
while True:
    # 可以指定循环体内部的代码执行频率
    clock.tick(60)
......

监听事件

事件就是游戏启动后,用户针对游戏所做的操作。例如:用户点击鼠标,按动键盘等等。
监听则是判断用户的具体操作,只有捕获用户具体的操作,才能针对性的做出响应。
pygame中通过pygame.event.get()可以获得当前用户所做操作的事件列表

import pygame
pygame.init()
# 创建游戏的窗口
screen = pygame.display.set_mode((480, 700))
# 绘制背景图像
bg = pygame.image.load("./images/background.png")
screen.blit(bg, (0, 0))
#  pygame.display.update()
# 绘制英雄的飞机
hero = pygame.image.load("./images/me1.png")
# screen.blit(hero, (180,500))
# 可以在所有绘制工作完成之后统一调用update方法
pygame.display.update()
# 创建时钟对象
clock = pygame.time.Clock()
# 1.定义rect记录飞机的初始位置
hero_rect = pygame.Rect(150, 300, 102, 126)
# 游戏循环->意味着游戏的正式开始
while True:
    # 可以指定循环体内部的代码执行频率
    clock.tick(60)
    # 监听事件
    event_list = pygame.event.get()
    if len(event_list) > 0:
        print(event_list)
        # 判断飞机的位置
    if hero_rect.y <= 0:
        hero_rect.y = 700
        # 2.修改飞机的位置
    hero_rect.y -= 1
    # 3.调用blit方法绘制图像
    screen.blit(bg, (0, 0))
    screen.blit(hero, hero_rect)
    # 4.调用update方法更新显示
    pygame.display.update()
pygame.quit()

在这里插入图片描述
MouseMotion就是鼠标移动,KeyDown就是按下键盘,KeyUp就是松开键盘。

精灵和精灵组

我不是在讲数码宝贝啊!精灵和精灵组是pygame中提供的两个类,是为了简化图像加载、位置变化、绘制图像等功能的开发步骤。
pygame.sprite.Sprite——用于存储图像image和位置rect的对象。
pygame.sprite.Group——包含多个精灵的对象。
精灵类中有两个属性image记录图像数据和rect位置信息,update()方法更新位置信息。
精灵组类add()方法向组中增加精灵;sprites()方法返回所用精灵列表;update()方法让组中的所有精灵调用update方法;draw()将组中所用精灵的image绘制到Surface的rect位置。

class GameSprite(pygame.sprite.Sprite):
    """飞机大战游戏精灵"""
    def __init__(self, image_name, speed=1):
        # 调用父类的初始化方法
        super().__init__()
        # 定义对象的属性
        self.image = pygame.image.load(image_name)
        self.rect = self.image.get_rect()
        self.speed = speed
    def update(self):
        # 在屏幕的垂直方向上移动
        self.rect.y += self.speed

框架搭建

借用一下黑马的图片。以下就是这个游戏的大体框架:首先是游戏初始化,设置游戏窗口,创建游戏时钟,创建精灵和精灵组。再就是在游戏循环中设置刷新帧率,进行事件监听、碰撞检测、更新绘制精灵组、更新屏幕显示等等。
在这里插入图片描述
存储各种精灵的文件:
在这里插入图片描述
主程序:
在这里插入图片描述
最后的游戏窗口就是这个样子,感觉我能玩一年。
在这里插入图片描述

最后

我还找到了一个B站小甲鱼出品的飞机大战,他里面有分数,可以捡武器啥的,比这个要好玩多了,但是程序非常的复杂,一般人是看不懂的,还是黑马讲的仔细好懂一些,强烈建议大家学Python的去看看。
黑马的代码链接:链接:https://pan.baidu.com/s/1URFOEes93li-A6dTScp4RA 提取码:ww9l
小甲鱼的代码链接:https://pan.baidu.com/s/10P6xM1yPQlueO9Xy-boCtg
提取码:uicm
如不能运行,或者链接失效,欢迎私信我。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Python实现飞机大战游戏(后附完整代码文件和素材) 的相关文章

随机推荐

  • 【ESP32S2】把只有4M flash的开发板制作成一个2G的U盘(一)

    文章目录 前言 一 背景 二 制作虚拟磁盘VHD 三 生成磁盘数据 四 生成 h头文件 五 改造read10函数 六 测试 七 工具 八 参考 前言 前面的文章 使用ESP32S2开发板制作U盘 支持无线访问 讲述了如何将ESP32S2开发
  • vue用阿里云oss上传图片使用分片上传只能上传100kb以内的解决办法

    首先 vue和阿里云oss上传图片结合参考了 这位朋友的 https www jianshu com p 645 文章 成功的解决了我用阿里云oss上传图片前的一头雾水 该大神文章里有写github地址 里面的2 0分支采用vue2 0实现
  • min_faces_per_person=60 is too restrictive解决办法(人脸识别数据lfw_funneled)

    min faces per person 60 is too restrictive解决办法 在运行 faces fetch lfw people min faces per person 60 实例化 每个人需要60张图 这个代码时出现问
  • html 表格套表格_HTML表格

    html 表格套表格 A table is a set of rows and columns which could be created on a webpage in HTML by table tag The tabular rep
  • JAVA中的异常

    一 异常的分类 这是从jdk AP里简单摘出来 java中关于Exception和ERROR的一个关系 可以看出他们都来自于同一个父类Throwable Error java中的Error是比较严重的问题 非程序本身的问题 一般都是虚拟机相
  • Python tkinter Misc类+Wm类详解

    Misc类 这个类是模块中最基本的类 所有组件甚至是Tk都继承这个类 不过 组件并不直接继承这个类 而是继承Widget类 Widget类直接继承BaseWidget类 而BaseWidget类直接继承Misc 比较特殊的Toplevel继
  • 计算机二级高级应用教材,全国计算机等级考试教程 二级MS Office高级应用(教材)...

    全国计算机等级考试教程 二级MS Office高级应用 教材 依据教育部考试中心新颁布的全国计算机等级考试二级MS Office高级应用的考试大纲进行编写 全国计算机等级考试教程 二级MS Office高级应用 教材 以考点为主线 以 理论
  • Citesapace作图结果部分——文章整体思路简单分析

    Citespace相关论文 除了引言部分 一般从第二部分开始结合citespace作图软件进行分析 以下做一个该部分简要的概括 2 Materials and Methods 数据检索部分一般分为两部分 2 1 Data Collectio
  • 解决Python中的循环引用和内存泄漏问题

    在Python编程中 循环引用和内存泄漏是两个常见的问题 本文将详细介绍如何识别和解决这些问题 并提供详细的代码示例 1 什么是循环引用 循环引用是指两个或多个对象之间相互引用的情况 这种情况可能导致内存泄漏 因为Python的垃圾回收机制
  • 数据治理体系建设

    01 数据治理建设路径 1 业务数字化的目的是打造一体化的业务流 信息流与数据流 从企业整体经营管理的角度 战略制定及分解 领域业务目标制定 业务方案设计 业务需求识别 信息系统功能及数据库设计 数据汇聚及分析 业务目标监测及改善 这个过程
  • 图片在网页能打开,小程序上不显示的解决方法

    这种情况可能是图片被小程序自动加上了防盗链 导致显示不出来 解决方案 1 在img标签是上加属性 referrerPolicy no referrer
  • 使用VS Code打造Python编程与Markdown写作利器,打破知乎、WordPress和微信公众号的壁垒

    目录 1 前言 2 安装与环境搭建 2 1 VS Code安装 2 2 VS Code常用快捷键 2 3 打造Python编辑器 2 4 打造Markdown编辑器 3 一些技巧 3 1 更舒适的Python编程环境 3 2 Markdow
  • oracle数据库中选择桌面类和服务器类的区别

    在以前的学习过程中 一直用到的都是sql server数据库 之后接触到了oracle数据库 在安装过程中 有两个选项 桌面类和服务器类 当时按照网上的安装步骤 选择了桌面类 后来公司里他们安装都是用的服务器类 后来查了查两者的区别 桌面类
  • 【MyBatis】resultMap和resultType的区别

    mybatis中resultMap和resultType的区别 mybatis中在查询进行select映射的时候 返回类型可以用resultType 也可以用resultMap resultType是直接表示返回类型的 而resultMap
  • 使用jira的sprint面板进行敏捷开发——scrum master笔记(待完善)

    一 jira中sprint面板的创建 这个很简单 键入jira后 顶栏处找 面板 查看全部面板 此时页面右上侧有 创建面板 的按钮 点击 选择 创建一个Scrum面板 根据提示填信息到完成即可 二 jira中sprint面板的配置 点击进入
  • 如何清除win7系统中的开机密码

    设置系统的开机密码是很正常的事情 当然 忘记开机密码也是常有的事情 下面的方法是通过PE盘清除win7的卡机密码 首先 看一下我的电脑是有密码的 有密码的机器 二 PE盘的准备 我用的pe是we 这是我用过的最良心的PE环境 关于PE的安装
  • java查找算法:二分查找(两种方式)

    二分查找算法思想 二分查找针对的是一个有序的数据集合也就是数组 这也成为了二分查找的一个重要局限性 查找思想有点类似分治思想 每次都通过跟区间的中间元素对比 将待查找的区间缩小为之前的一半 直到找到要查找的元素 或者区间被缩小为0 一 返回
  • Cocos Creator 3D 梦想再起航!

    在 Cocos 不算长的生命历程中 我们曾多次尝试给开发者带来 3D 游戏的开发能力 2014 年 我们的 3D 团队开辟了 Cocos2d x 对 3D 的支持 至今已孵化出莉莉丝的 剑与家园 腾讯的 乱世王者 这样的超级大作 同时 Co
  • Skywalking web页面空白问题解决

    问题描述 今天微服务报错想用链路id追踪这个服务的流向 发现skywalking页面空白 查看后台进程发现skywalking oap server服务掉了 重启还是不行 tail n500 skywalking oap server lo
  • Python实现飞机大战游戏(后附完整代码文件和素材)

    前言 自学Python的记录 不喜勿喷 本程序的代码是以B站黑马程序员的视频代码为基础 个人加以总结思考 写就的博文 纯属记录自己的学习历程 当初想到要用Python的pygame模块开发飞机大战游戏的时候 顿时就兴奋了 毕竟学以致用是最好