pygame飞机大战

飞机大战

  • 1.main类
  • 2.配置类
  • 3.游戏主类
  • 4.游戏资源类
  • 5.资源下载
  • 6.游戏效果

1.main类

启动游戏。

from MainWindow import MainWindow
if __name__ == '__main__':app=MainWindow()app.run()

2.配置类

该类主要存放游戏的各种设置参数。

#窗口尺寸
import random
import pygame
WINDOW=pygame.Rect(0,0,512,768)#图片资源大小刚好是512*768
#窗口名字
WINDOW_NAME="飞机大战v1.0"#地图索引
MAP_INDEX=random.randint(1,5)#英雄子弹类型
HERO_BULLET_INDEX=1
#敌人子弹类型
ENEMY_BULLET_INDEX=3#敌机事件
ENEMY_EVENT=pygame.USEREVENT#pygame用户事件(整型),有多个事件可以在后面+1以区分#英雄子弹事件
BULLET_EVENT=pygame.USEREVENT+1#+1区分事件
#敌机子弹事件
BULLET_ENEMY_EVENT=pygame.USEREVENT+2#+2区分事件#英雄移动速度
HERO_MOVE_SPEED=4
#英雄子弹移动速度
HERO_BULLET_MOVE_SPEED=4

3.游戏主类

游戏主类主要由游戏窗口创建、精灵和精灵组的创建、游戏启动函数(1.碰撞检测、2.事件处理、3.精灵组更新、4.窗口刷新)等构成。

import pygame
from Config import *
from GameSprite import *
class MainWindow:def __init__(self):pygame.init()#游戏窗口初始化self.window=pygame.display.set_mode([WINDOW.width,WINDOW.height])pygame.display.set_caption(WINDOW_NAME)#背景音乐pygame.mixer.music.load("./source/music/bg.wav")pygame.mixer.music.set_volume(0.1)pygame.mixer.music.play(-1)#爆炸音效self.bomb=pygame.mixer.Sound("./source/music/bomb.wav")self.bomb.set_volume(0.2)#游戏分数self.kill_enemys=0self.hp=100#FPS时钟self.clock=pygame.time.Clock()#激活敌机定时器,参数:事件、间隔时间mspygame.time.set_timer(ENEMY_EVENT,500)# 激活英雄子弹定时器,参数:事件、间隔时间mspygame.time.set_timer(BULLET_EVENT,500)pygame.time.set_timer(BULLET_ENEMY_EVENT,2000)#创建精灵组self.create_sprite_group()#精灵组创建def create_sprite_group(self):#地图精灵组map1=GameMap()map2=GameMap(True)self.map_group=pygame.sprite.Group(map1,map2)#英雄精灵self.hero=Hero()self.hero_group=pygame.sprite.Group(self.hero)#敌机精灵组self.enemy_group=pygame.sprite.Group()#英雄子弹精灵组self.bullet_group=pygame.sprite.Group()#敌机子弹精灵组self.bullet_enemy_group=pygame.sprite.Group()#爆炸动画精灵组self.bomb_group=pygame.sprite.Group()# 碰撞检测def collie_check(self):#1.英雄子弹与敌机for bullet1 in self.bullet_group:#第一个参数是精灵、第二个参数是精灵组、第三个参数为是否删除与该精灵碰撞的所有精灵;返回值为与第一个参数碰撞的所有精灵列表eys=pygame.sprite.spritecollide(bullet1,self.enemy_group,True)#判断子弹精灵是否与敌机精灵组有碰撞,有则杀死所有敌机#表示有碰撞if len(eys)>0:self.bomb.play()#发生碰撞,播放爆炸音效self.kill_enemys+=1#记录杀死的敌机数量bullet1.kill()#杀死发生碰撞的子弹精灵bomb_enemy=Bomb(eys[0])#将发生碰撞的敌传入爆炸类,方便使用爆炸的具体位置self.bomb_group.add(bomb_enemy)#加入爆炸精灵组#2.敌机子弹与英雄bullet2=pygame.sprite.spritecollide(self.hero,self.bullet_enemy_group,True)if len(bullet2)>0:self.bomb.play()#发生碰撞,播放爆炸音效self.hp-=1#英雄与敌机子弹接触,自身HP值-1#敌机与英雄enemys=pygame.sprite.spritecollide(self.hero,self.enemy_group,True)if len(enemys)>0:self.bomb.play()#发生碰撞,播放爆炸音效self.hp-=2#英雄与敌机接触,自身HP值-2bomb_enemy2 = Bomb(enemys[0])#将发生碰撞的敌传入爆炸类,方便使用爆炸的具体位置self.bomb_group.add(bomb_enemy2)#加入爆炸精灵组pass# 更新精灵组位置并绘制def sprite_group_update_draw(self):#地图精灵组更新self.map_group.update()self.map_group.draw(self.window)#英雄精灵组更新self.hero_group.update()self.hero_group.draw(self.window)#敌机精灵组更新self.enemy_group.update()self.enemy_group.draw(self.window)#英雄子弹精灵组self.bullet_group.update()self.bullet_group.draw(self.window)#敌机子弹精灵组self.bullet_enemy_group.update()self.bullet_enemy_group.draw(self.window)#爆炸精灵组self.bomb_group.update()self.bomb_group.draw(self.window)#绘制数据 #游戏数据font=pygame.font.Font("./source/fonts/SimHei.ttf")#pygame不能直接绘制中文,先导入字体文件text=f"得分:{self.kill_enemys}  HP:{self.hp} "#编辑需要绘制的字符串self.text=font.render(text,True,(255,255,255))#渲染的文字,抗锯齿,颜色self.window.blit(self.text,[WINDOW.width/2,20])#blit()函数绘制,将text当做图片处理#英雄生命值为0退出游戏if self.hp==0:pygame.quit()# 事件处理def handle_events(self):#pygame.event.get()获取当前时间帧的所有事件,返回一个事件列表,可以对此列表遍历for event in pygame.event.get():if event.type==pygame.QUIT:pygame.quit()#用户事件1,固定时间生成敌机(时间可以在窗口初始化代码中修改)if event.type==pygame.USEREVENT:self.enemy=Enemy()self.enemy_group.add(self.enemy)#用户事件2,固定时间生成敌机子弹(时间可以在窗口初始化代码中修改)if event.type==pygame.USEREVENT+2:#固定时间生成敌机子弹,需要遍历敌机精灵组,获取所有已经存在的敌机精灵,在对应的位置上绘制敌机子弹for enemy_sprite in self.enemy_group:self.bullet_enemy = Bullet(enemy_sprite.speed + 1,True)self.bullet_enemy.rect.centerx = enemy_sprite.rect.centerxself.bullet_enemy.rect.y =enemy_sprite.rect.bottom#将敌机子弹精灵添加到敌机子弹精灵组self.bullet_enemy_group.add(self.bullet_enemy)#用户事件3,固定时间生成英雄子弹(时间可以在窗口初始化代码中修改)if event.type==pygame.USEREVENT+1:self.bullet_hero=Bullet(-HERO_BULLET_MOVE_SPEED)#英雄子弹飞行方向与敌机子弹飞行方向相反#根据英雄的当前位置来设置英雄子弹的位置self.bullet_hero.rect.centerx=self.hero.rect.centerxself.bullet_hero.rect.y=self.hero.rect.y-self.bullet_hero.rect.height# 将英雄飞机子弹精灵添加到英雄子弹精灵组self.bullet_group.add(self.bullet_hero)#pygame.key.get_pressed()获取当前时间帧的所有键盘事件并返回一个列表,遍历列表控制英雄上下左右移动keys_event=pygame.key.get_pressed()if keys_event[pygame.K_a] or keys_event[pygame.K_LEFT]:self.hero.x_speed=-HERO_MOVE_SPEEDelif keys_event[pygame.K_d] or keys_event[pygame.K_RIGHT]:self.hero.x_speed=HERO_MOVE_SPEEDelse:self.hero.x_speed = 0if keys_event[pygame.K_w] or keys_event[pygame.K_UP]:self.hero.y_speed=-HERO_MOVE_SPEEDelif keys_event[pygame.K_s] or keys_event[pygame.K_DOWN]:self.hero.y_speed=HERO_MOVE_SPEEDelse:self.hero.y_speed=0#游戏主框架def run(self):while True:#碰撞检测self.collie_check()#事件处理self.handle_events()#更新精灵组self.sprite_group_update_draw()#窗口刷新pygame.display.update()self.clock.tick(60)#FPS

4.游戏资源类

游戏资源类主要包括各种游戏相关元素精灵、主要有基础精灵类、敌机精灵类、子弹精灵类、英雄飞机精灵类、爆炸动画精灵类等。

import  pygame
from Config import *
import random
#精灵类————基类,定义了基本的导入图片操作,以及图片垂直移动操作
class GameSprite(pygame.sprite.Sprite):def __init__(self,image_url,speed=0):super().__init__()self.image=pygame.image.load(image_url)self.rect=self.image.get_rect()self.speed=speeddef update(self, *args, **kwargs):self.rect.y+=self.speed
#游戏地图类,地图由两张完全一样的图片拼接构成,其中两张图片的起始和末尾要无缝衔接
#第一张图片起始位置与窗口完全重合,第二张图片的起始位置在第一张图片的上方
class GameMap(GameSprite):#is_1表示是否是第二张图片def __init__(self,is_1=False):#地图给了5张,保证地图索引在1~5,否则随机给一个1~5self.map_index=MAP_INDEX if 1<=MAP_INDEX<=5 else random.randint(1,5)map_filename=f"./source/map/map-{self.map_index}.jpg"super().__init__(map_filename,2)if is_1:self.rect.y=-WINDOW.height#第二张图片的起始位置在第一张图片的上方def update(self):#更新图像的位置super().update()#如果地图图片完全运动到了窗口最下方,就将这张图片的位置移动到窗口的最上方,作为新的起始位置if self.rect.y>=WINDOW.height:self.rect.y=-WINDOW.height
#英雄飞机类,初始化定义比较简单
class Hero(GameSprite):def __init__(self):super().__init__("./source/plane/hero.png")#定义英雄飞机出生在窗口中的具体位置self.rect.centerx=WINDOW.centerxself.rect.y=WINDOW.height-120#初始移动速度为0,静止状态self.x_speed=0self.y_speed=0def update(self, *args, **kwargs):#水平方向移动self.rect.x+=self.x_speed#垂直方向移动self.rect.y+=self.y_speed#判断上、下、左、右四个边界条件,如果移动到了边界,让飞机停在原位if self.rect.x<=0:self.rect.x=0if self.rect.x>=WINDOW.width-self.rect.width:self.rect.x=WINDOW.width-self.rect.widthif self.rect.y<=0:self.rect.y=0if self.rect.y>=WINDOW.height-self.rect.height:self.rect.y=WINDOW.height-self.rect.height
#敌机类
class Enemy(GameSprite):def __init__(self):#敌机有7中飞机,随机生成self.enemy_url=f"./source/plane/enemy-{random.randint(1,7)}.png"#敌机的垂直速度也是随机生成(1,3)super().__init__(self.enemy_url,random.randint(1,3))#敌机的初始水平位置需要随机生成,范围就是(0,WINDOW.width-self.rect.width)self.rect.x=random.randint(0,WINDOW.width-self.rect.width)#敌机的垂直位置y是固定值,保证敌机出现的位置在窗口之外self.rect.y=-self.rect.height#敌机水平方向的移动速度随机生成self.x_speed=random.randint(-1,1)def update(self, *args, **kwargs):#调用父类的update()函数super().update()#父类函数不够用的情况下,直接补充self.rect.x+=self.x_speed#水平移动#如果到达左右边界则反向运动if self.rect.x<=0 or self.rect.x>=WINDOW.width-self.rect.width:self.x_speed=-self.x_speed#敌机出了窗口底部则杀死此敌机精灵if self.rect.y>WINDOW.height:self.kill()
#子弹类(英雄飞机子弹和敌机子弹)
class Bullet(GameSprite):#is_enemy表示是否是敌机,敌机和英雄飞机使用的子弹图片不同def __init__(self,speed,is_enemy=False):if is_enemy:self.bullet_index=ENEMY_BULLET_INDEXelse:self.bullet_index = HERO_BULLET_INDEXbullet_filename = f"./source/bullet/bullet_{self.bullet_index}.png"self.speed=speedsuper().__init__(bullet_filename,self.speed)#由于敌机和英雄飞机是相对运动,资源图片都是正向的,所以如果是敌机子弹,则需要对子弹图片做旋转180°操作if is_enemy:##flip(翻转的图片、是否绕x轴翻转、是否绕y轴翻转)self.image=pygame.transform.flip(self.image,False,True)def update(self, *args, **kwargs):#垂直方向移动super().update()#超出屏幕则杀死此精灵if self.rect.y<-self.rect.height or self.rect.y>WINDOW.height+self.rect.height:self.kill()
#爆炸动画类
class Bomb(pygame.sprite.Sprite):def __init__(self,sprite1):super().__init__()#导入所有动画的图片self.images=[pygame.image.load(f"./source/bomb/bomb-{bomb_index}.png") for bomb_index in range(1,8)]self.sprite1=sprite1self.interval = 5 # 播放每一张图片的间隔 5帧self.interval_index = 0 #帧数计数器 初始值为0self.image_index=0#图片索引 初始值为0self.image = self.images[self.image_index]self.rect = self.image.get_rect()self.rect.x = self.sprite1.rect.xself.rect.y = self.sprite1.rect.ydef update(self, *args, **kwargs):self.interval_index+=1#每一帧进入update()函数,帧计数器加1#当计数器到达设置值时,切换图片if self.interval_index>=self.interval:self.image=self.images[self.image_index]#帧计数器归零self.interval_index=0#切换图片self.image_index+=1#当所有图片都播放完毕之后杀死此精灵对象if self.image_index==len(self.images):self.kill()

5.资源下载

链接:资源
提取码:jixb

6.游戏效果

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/501532.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Flutter中的网络请求图片存储为缓存,与定制删除本地缓存

Flutter中的网络请求图片存储为缓存&#xff0c;与定制删除本地缓存 1&#xff1a;封装请求图片函数 2&#xff1a;访问的图片都会转为本地缓存&#xff0c;当相同的请求url&#xff0c;会在本地调用图片 3&#xff1a;本地缓存管理【windows与andriod已经测试】【有页面】【有…

无线AP安装注意事项

现在的办公楼、酒店等项目中都设计含有网络无线覆盖这一项&#xff0c;在项目实施中&#xff0c;往往采用的是便捷并且后期便于网络无线设备管理的无线ap设备&#xff0c;作为前端无线信号的覆盖。在具体安装无线AP过程中&#xff0c;我们必须要注意以下几点才能保证项目实施完…

Golang的容器编排实践

Golang的容器编排实践 一、Golang中的容器编排概述 作为一种高效的编程语言&#xff0c;其在容器编排领域也有着广泛的运用。容器编排是指利用自动化工具对容器化的应用进行部署、管理和扩展的过程&#xff0c;典型的容器编排工具包括Docker Swarm、Kubernetes等。在Golang中&a…

计算机毕业设计Django+Tensorflow音乐推荐系统 音乐可视化 卷积神经网络CNN LSTM音乐情感分析 机器学习 深度学习 Flask

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 作者简介&#xff1a;Java领…

C# 在PDF中添加和删除水印注释 (Watermark Annotation)

目录 使用工具 C# 在PDF文档中添加水印注释 C# 在PDF文档中删除水印注释 PDF中的水印注释是一种独特的注释类型&#xff0c;它通常以透明的文本或图片形式叠加在页面内容之上&#xff0c;为文档添加标识或信息提示。与传统的静态水印不同&#xff0c;水印注释并不会永久嵌入…

分析服务器 systemctl 启动gozero项目报错的解决方案

### 分析 systemctl start beisen.service 报错 在 Linux 系统中&#xff0c;systemctl 是管理系统和服务的主要工具。当我们尝试重启某个服务时&#xff0c;如果服务启动失败&#xff0c;systemctl 会输出错误信息&#xff0c;帮助我们诊断和解决问题。 本文将通过一个实际的…

Dubbo扩展点加载机制

加载机制中已经存在的一些关键注解&#xff0c;如SPI、©Adaptive> ©Activateo然后介绍整个加载机制中最核心的ExtensionLoader的工作流程及实现原理。最后介绍扩展中使用的类动态编译的实 现原理。 Java SPI Java 5 中的服务提供商https://docs.oracle.com/jav…

如何利用Logo设计免费生成器创建专业级Logo

在当今的商业世界中&#xff0c;一个好的Logo是品牌身份的象征&#xff0c;它承载着公司的形象与理念。设计一个专业级的Logo不再需要花费大量的金钱和时间&#xff0c;尤其是当我们拥有Logo设计免费生成器这样的工具时。接下来&#xff0c;让我们深入探讨如何利用这些工具来创…

游戏如何检测iOS越狱

不同于安卓的开源生态&#xff0c;iOS一直秉承着安全性更高的闭源生态&#xff0c;系统中的硬件、软件和服务会经过严格审核和测试&#xff0c;来保障安全性与稳定性。 据FairGurd观察&#xff0c;虽然iOS系统具备一定的安全性&#xff0c;但并非没有漏洞&#xff0c;如市面上…

智联视频超融合平台:电力行业的智能守护者

文章目录 一、远程实时监控与设备状态监测二、提高应急响应能力三、实现无人值守与减员增效四、保障电力设施安全与防范外部破坏五、提升电网运行管理效率与决策科学性六、助力电力企业数字化转型与智能化发展七、智联视频超融合平台 在当今数字化浪潮下&#xff0c;视频联网平…

卸载干净 IDEA(图文讲解)

目录 1、卸载 IDEA 程序 2、注册表清理 3、残留清理 1、卸载 IDEA 程序 点击屏幕左下角 Windows 图标 -> 设置-控制面板->intellij idea 勾选第一栏 Delete IntelliJ IDEA 2022.2 caches and local history&#xff0c;表示同时删除 IDEA 本地缓存以及历史。 Delete I…

计算机网络•自顶向下方法:路由选路算法

路由选路算法 在网络层中&#xff0c;选路是指数据包从源主机到目的主机的传输过程中&#xff0c;如何通过网络中的路由器选择一条合适的路径。路由器根据网络拓扑、路由表、协议规则等来决定如何将数据包转发到下一跳&#xff0c;直到数据包到达目的地。 选路算法分类 静态算…

Qemu配置QXL显卡支持分辨率

默认情况下&#xff0c;创建的vm的视频RAM限制为16MB。在win操作系统中分辨率最高就只能调到1024x768。 <video><model typecirrus vram16384 heads1 primaryyes/><address typepci domain0x0000 bus0x00 slot0x02 function0x0/> </video>单单修改ram…

【区块链】零知识证明基础概念详解

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 零知识证明基础概念详解引言1. 零知识证明的定义与特性1.1 基本定义1.2 三个核心…

Redis面试相关

Redis开篇 使用场景 缓存 缓存穿透 解决方法一&#xff1a; 方法二&#xff1a; 通过多次hash来获取对应的值。 小结 缓存击穿 缓存雪崩 打油诗 双写一致性 两种不同的要求 强一致 读锁代码 写锁代码 强一致&#xff0c;性能低。 延迟一致 方案一&#xff1a;消息队列 方…

以太网协议和LWIP协议详解

一、以太网协议简介 以太网是一种产生较早&#xff0c;使用相当广泛的局域网技术。目前以太网根据速度等级分类大概分为&#xff1a;标准以太网&#xff08;10Mbit/s&#xff09;&#xff0c;快速以太网&#xff08;100Mbit/s&#xff09;&#xff0c;千兆以太网&#xff08;1…

Qt|QWidget窗口支持旋转

功能实现&#xff1a;使用QWidget创建的窗口支持窗口旋转功能。 展示的示例中支持由水平方向旋转至垂直方向。至于其它角度旋转的问题&#xff0c;看完这篇文章后应该会很简单能实现的&#xff01; 开发环境&#xff1a;win VS2019 Qt 5.15.2 在实现之前也有想用使用 QProp…

微信小程序滑动解锁、滑动验证

微信小程序简单滑动解锁 效果 通过 movable-view &#xff08;可移动的视图容器&#xff0c;在页面中可以拖拽滑动&#xff09;实现的简单微信小程序滑动验证 movable-view 官方说明&#xff1a;https://developers.weixin.qq.com/miniprogram/dev/component/movable-view.ht…

微服务实战——购物车模块实战

购物车 1. 数据模型分析 1.1. 需求描述 用户可以在登录状态下将商品添加到购物车【用户购物车/在线购物车】 放入数据库mongodb放入 redis&#xff08;采用&#xff09; 登录以后&#xff0c;会将临时购物车的数据全部合并过来&#xff0c;并清空临时购物车&#xff1b; 用…

1961-2022年中国大陆多干旱指数数据集(SPI/SPEI/EDDI/PDSI/SC-PDSI/VPD)

DOI: 10.5194/essd-2024-270 干旱指数对于评估和管理缺水和农业风险至关重要;然而&#xff0c;现有数据集中缺乏统一的数据基础&#xff0c;导致不一致&#xff0c;对干旱指数的可比性提出了挑战。本研究致力于创建CHM_Drought&#xff0c;这是一个创新且全面的长期气象干旱数…