pygame--坦克大战(二)

加载敌方坦克

敌方坦克的方向是随机的,使用随机数生成。

初始化敌方坦克。

class EnemyTank(Tank):def __init__(self,left,top,speed):self.images = {'U': pygame.image.load('img/enemy1U.gif'),'D': pygame.image.load('img/enemy1D.gif'),'L': pygame.image.load('img/enemy1L.gif'),'R': pygame.image.load('img/enemy1R.gif')}self.direction = self.randDirection()self.image = self.images[self.direction]# 坦克所在的区域  Rect->self.rect = self.image.get_rect()# 指定坦克初始化位置 分别距x,y轴的位置self.rect.left = leftself.rect.top = top# 新增速度属性self.speed = speedself.stop = True

生成随机的四个方向

  def randDirection(self):num = random.randint(1,4)if num == 1:return 'U'elif num == 2:return 'D'elif num == 3:return 'L'elif num == 4:return 'R'

创建敌方坦克

  #创建敌方坦克def creatEnemyTank(self):top = 100speed = random.randint(3,6)for i in range(MainGame.EnemTank_count):#每次都随机生成一个left值left = random.randint(1, 7)eTank = EnemyTank(left*100,top,speed)MainGame.EnemyTank_list.append(eTank)

坦克类的优化

class Tank:'''坦克类'''def display_tank(self) -> None:'''显示坦克'''# 获取最新坦克的朝向位置图片self.image = self.images.get(self.direction)MainGame.window.blit(self.image,self.rect)def move(self) -> None:'''坦克的移动'''if self.direction == "L":# 判断坦克的位置是否已左边界if self.rect.left > 0:# 修改坦克的位置 离左边的距离  - 操作self.rect.left = self.rect.left - self.speedelif self.direction == "R":# 判断坦克的位置是否已右边界if self.rect.left + self.rect.width < SCREEN_WIDTH:# 修改坦克的位置 离左边的距离  + 操作self.rect.left = self.rect.left + self.speedelif self.direction == "U":# 判断坦克的位置是否已上边界if self.rect.top > 0:# 修改坦克的位置 离上边的距离  - 操作self.rect.top = self.rect.top - self.speedelif self.direction == "D":# 判断坦克的位置是否已下边界if self.rect.top + self.rect.height < SCREEN_HEIGHT:# 修改坦克的位置 离上边的距离  + 操作self.rect.top = self.rect.top + self.speeddef shot(self) -> None:'''坦克的射击'''passclass MyTank(Tank):'''我方坦克类'''def __init__(self,left:int,top:int) -> None:# 设置我方坦克的图片资源self.images = {'U':pygame.image.load('./img/p1tankU.gif'),'D':pygame.image.load('./img/p1tankD.gif'),'L':pygame.image.load('./img/p1tankL.gif'),'R':pygame.image.load('./img/p1tankR.gif'),}# 设置我方坦克的方向self.direction = 'L'# 获取图片信息self.image = self.images.get(self.direction)# 获取图片的矩形self.rect = self.image.get_rect()# 设置我方坦克位置self.rect.left = leftself.rect.top = top# 设置移动速度self.speed = 10# 设置移动开关, False 表示不移动, True 表示移动self.remove = Falseclass MainGame:'''游戏主窗口类'''# 游戏主窗口对象window =None# 设置我放坦克my_tank = None# 存储敌方坦克的列表enemy_tank_list = []# 设置敌方坦克的数量enemy_tank_count = 6def __init__(self) -> None:passdef start_game(self) -> None:'''开始游戏'''# 初始化游戏窗口pygame.display.init()# 创建一个窗口MainGame.window = pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT))# 设置窗口标题pygame.display.set_caption('坦克大战1.0')# 创建一个我方 坦克MainGame.my_tank = MyTank(350,200)# 创建敌方坦克self.create_enemy_tank()# 刷新窗口while True:sleep(0.02)# 给窗口设置填充色MainGame.window.fill(BG_COLOR)# 增加提示文字# 1.要增加文字内容# num = 6text = self.get_text_surface(f'敌方坦克剩余数量{MainGame.enemy_tank_count}')# 2.如何把文字加上MainGame.window.blit(text,(10,10))# 增加事件self.get_event()# 显示 我方坦克MainGame.my_tank.display_tank()# 显示敌方坦克self.display_enemy_tank()# 移动坦克if MainGame.my_tank.remove:MainGame.my_tank.move()pygame.display.update()

敌方坦克随机移动

def rand_move(self):'''随机移动'''# 判断步长是否为0if self.step <= 0:# 如果小于0,更换方向self.direction = self.rand_direction()# 重置步长self.step = 20else:# 如果大于0,移动self.move()# 步长减1self.step -=1

将敌方坦克加到窗口中

  def display_enemy_tank(self) -> None:'''显示敌方坦克'''for e_tank in self.enemy_tank_list:# 显示敌方坦克e_tank.display_tank()# 移动敌方坦克e_tank.rand_move()

在开始游戏方法,加载敌方坦克

 #循环展示敌方坦克self.display_enemy_tank()

运行结果:

image-20211126154440054

完善子弹类 

初始化子弹

 '''子弹类'''def __init__(self,tank) -> None:# 加载图片self.image = pygame.image.load('./img/enemymissile.gif')# 获取子弹的方向self.direction = tank.direction# 获取子弹的图形self.rect = self.image.get_rect()# 设置子弹的位置if self.direction == "L":# 子弹的位置 = 坦克的位置 - 子弹的宽度self.rect.left = tank.rect.left - self.rect.width# 子弹的位置 = 坦克的位置 + 坦克的高度/2 - 子弹的高度/2self.rect.top = tank.rect.top + tank.rect.height/2 - self.rect.height/2elif self.direction == "R":# 子弹的位置 = 坦克的位置 + 坦克的宽度self.rect.left = tank.rect.left + tank.rect.width# 子弹的位置 = 坦克的位置 + 坦克的高度/2 - 子弹的高度/2self.rect.top = tank.rect.top + tank.rect.height/2 - self.rect.height/2elif self.direction == "U":# 子弹的位置 = 坦克的位置 + 坦克的宽度/2 - 子弹的宽度/2self.rect.left = tank.rect.left + tank.rect.width/2 - self.rect.width/2# 子弹的位置 = 坦克的位置 - 子弹的高度self.rect.top = tank.rect.top - self.rect.heightelif self.direction == "D":# 子弹的位置 = 坦克的位置 + 坦克的宽度/2 - 子弹的宽度/2self.rect.left = tank.rect.left + tank.rect.width/2 - self.rect.width/2# 子弹的位置 = 坦克的位置 + 坦克的高度self.rect.top = tank.rect.top + tank.rect.height# 设置子弹的速度self.speed = 10

展示子弹

  #展示子弹的方法def displayBullet(self):MainGame.window.blit(self.image,self.rect)

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

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

相关文章

Golang基础-9

Go语言基础 介绍 基础 结构体 自定义类型 结构体定义 结构体声明 结构体初始化 字段访问与修改 匿名结构体 结构体嵌套 初始化函数定义 介绍 本文介绍Go语言中自定义类型、结构体定义、结构体声明、结构体初始化、字段访问与修改、匿名结构体、结构体嵌套、初始化…

clickhouse sql使用2

1、多条件选择 multiIf(cond_1, then_1, cond_2, then_2, …, else) select multiIf(true,0,1) 当第一条件不成立看第二条件判断 第一个参数条件参数&#xff0c;第二参数条件成立时走 2、clickhouse 在计算时候长出现NaN和Infinity异常处理 isNaN()和isInfinite()处理

免费图片转excel方案大全

随着信息技术的发展&#xff0c;我们经常会遇到需要将图片中的数据转换成Excel表格的情况。这种需求在数据分析、报表制作、信息整理等领域尤为常见。然而&#xff0c;许多人在面对这一任务时感到困惑&#xff0c;不知道如何进行。本文将为大家介绍几种免费的图片转Excel方案&a…

【Qt 学习笔记】如何在Qt中打印日志 | qDebug的使用 | Assistant的使用

博客主页&#xff1a;Duck Bro 博客主页系列专栏&#xff1a;Qt 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ 如何在Qt中打印日志 | qDebug的使用 文章编号&#xff1a;Qt 学习笔记…

七、Mybatis-缓存

文章目录 缓存一级缓存二级缓存1.概念2.二级缓存开启的条件:3.使二级缓存失效的情况&#xff1a;4.在mapper配置文件中添加的cache标签可以设置一些属性:5.MyBatis缓存查询的顺序 缓存 一级缓存 级别为sqlSession&#xff0c;Mybatis默认开启一级缓存。 使一级缓存失效的四种…

路径规划——搜索算法详解(七):D*lite算法详解与Matlab代码

&#xff01;&#xff01;&#xff01;注意&#xff01;&#xff01;&#xff01; 看本篇之前&#xff0c;一定要先看笔者上一篇的LPA*讲解&#xff0c;笔者统一了符号看起来过渡会更加好理解&#xff01; 到目前为止&#xff0c;我们学习了广度优先搜索Dijkstra算法、能够计…

openGauss 分布式分析能力

分布式分析能力 可获得性 本特性自openGauss 3.1.0版本开始引入。 特性简介 基于openLookeng实现分布式分析能力&#xff0c;与shardingsphere配合openGauss组成HTAP数据库。 客户价值 通过openLookeng快速实现海量数据分析。 特性描述 openLookeng复用shardingsphere中…

基于深度学习的日常场景下的人脸检测系统(网页版+YOLOv8/v7/v6/v5代码+训练数据集)

摘要&#xff1a;本文详细介绍基于YOLOv8/v7/v6/v5的日常场景下的人脸检测&#xff0c;核心采用YOLOv8并整合了YOLOv7、YOLOv6、YOLOv5算法&#xff0c;进行性能指标对比&#xff1b;详述了国内外研究现状、数据集处理、算法原理、模型构建与训练代码&#xff0c;及基于Streaml…

AWS-EKS 给其他IAM赋予集群管理权限

AWS EKS 设计了权限管理系统&#xff0c;A用户创建的集群 B用户是看不到并且不能管理和使用kubectl的&#xff0c;所以我们需要共同管理集群时就需要操场共享集群访问给其他IAM用户。 两种方式添加集群控制权限&#xff08;前提&#xff1a;使用有管理权限的用户操作&#xff…

速盾:cdn加速https额外收费吗?

CDN&#xff08;内容分发网络&#xff09;是一种通过在全球各地部署服务器来提供高速互联网内容传输的技术&#xff0c;它可以加速网站的访问速度&#xff0c;提高用户体验。而HTTPS&#xff08;超文本传输安全协议&#xff09;是一种通过加密技术保护网站数据传输安全的协议。…

【c++】类和对象(七)

&#x1f525;个人主页&#xff1a;Quitecoder &#x1f525;专栏&#xff1a;c笔记仓 朋友们大家好&#xff0c;本篇文章来到类和对象的最后一部分 目录 1.static成员1.1特性 2.友元2.1引入&#xff1a;<<和>>的重载2.2友元函数2.3友元类 3.内部类4.匿名对象5.拷…

【ARM 嵌入式 C 入门及渐进 20 -- 文件删除函数 remove 详细介绍】

请阅读【嵌入式开发学习必备专栏 】 文章目录 文件删除函数 remove 文件删除函数 remove 在 C 语言中&#xff0c; 可以使用 remove 函数来删除一个文件&#xff0c;但在删除之前 可能想确认该文件是否存在。 可以使用 stat 函数来检查文件是否存在。 以下是如何实现这个功能…

聚观早报 | 蔚来推出油车置换补贴;iPhone 16 Pro细节曝光

聚观早报每日整理最值得关注的行业重点事件&#xff0c;帮助大家及时了解最新行业动态&#xff0c;每日读报&#xff0c;就读聚观365资讯简报。 整理丨Cutie 4月02日消息 蔚来推出油车置换补贴 iPhone 16 Pro细节曝光 小米SU7创始版第二轮追加开售 OpenAI将在日本设立办事…

Ollama教程——入门:开启本地大型语言模型开发之旅

Ollama教程——入门&#xff1a;开启本地大型语言模型开发之旅 引言安装ollamamacOSWindows预览版LinuxDocker ollama的库和工具ollama-pythonollama-js 快速开始运行模型访问模型库 自定义模型从GGUF导入模型自定义提示 CLI参考创建模型拉取模型删除模型复制模型多行输入多模态…

ADB 命令之 模拟按键/输入

ADB 命令之 模拟按键/输入 模拟按键/输入 在 ​​adb shell​​​ 里有个很实用的命令叫 ​​input​​&#xff0c;通过它可以做一些有趣的事情。 ​​input​​ 命令的完整 help 信息如下&#xff1a; Usage: input [<source>] <command> [<arg>...] Th…

全量知识系统 程序详细设计之“ AI操作系统” (百度搜索的QA)

Q1. 今天讨论的题目是&#xff1a;全量知识系统 程序详细设计之“ AI操作系统”..本篇是基于前面的文章给出的系统核心&#xff08;一个恰当的组织&#xff09;之上的一个扩展&#xff0c;并在此基础上给出整个全量知识系统 &#xff08;以下简称“全知系统”&#xff09;程序详…

SV学习笔记(一)

SV&#xff1a;SystemVerilog 开启SV之路 数据类型 內建数据类型 四状态与双状态 &#xff1a; 四状态指0、1、X、Z&#xff0c;包括logic、integer、 reg、 wire。双状态指0、1&#xff0c;包括bit、byte、 shortint、int、longint。 有符号与无符号 &#xff1a; 有符号&am…

云计算对象存储服务

对象存储服务&#xff08;OSS&#xff09;中的存储桶(Bucket)叫做‘OBS桶 存储桶&#xff08;Bucket&#xff09;&#xff1a;存储桶式对象存储服务中用于存储对象的基本容器&#xff0c;类似于文件系统中的文件夹。每个存储桶具有唯一的名称&#xff0c;并且可以在桶中存储任…

理解Three.js的相机

大家都知道我们生活中的相机&#xff0c;可以留下美好瞬间。那Three.js的相机是什么呢&#xff1f;Three.js创建的场景是三维的&#xff0c;而我们使用的显示器显然是二维的&#xff0c;相机就是抽象的定义了三维空间到二维显示器的投影方式。Three.js常见的相机有两类&#xf…

搜索引擎-01-概览

拓展阅读 搜索引擎-01-概览 搜索引擎-02-分词与全文索引 搜索引擎-03-搜索引擎原理 Crawl htmlunit 模拟浏览器动态 js 爬虫入门使用简介 Crawl jsoup 爬虫使用 jsoup 无法抓取动态 js 生成的内容 Crawl WebMagic 爬虫入门使用简介 webmagic 详细介绍一下搜索引擎 搜索…