Python学习之小游戏--坦克大作战

今天跟视频学习了Python实现坦克大作战小游戏,挺有意思的,一起来玩吧~

按空格发射子弹,上下左右键实现移动,ESC键无限复活。

import pygame,time,random
from pygame.sprite import Sprite
SCREEN_WIDTH=800
SCREEN_HEIGHT=500
BG_color=pygame.Color(45,45,48)
TEXT_COLOR=pygame.Color(0,255,0)class BaseItem(Sprite):def __init__(self,color,width,height):pygame.sprite.Sprite.__init__(self)class MainGame():window=Nonemy_tank=NoneenemyTankList=[]enemyTankCount=5myBulletList=[]enemyBulletList=[]explodeList=[]wallList=[]def __init__(self):pass#开始游戏def startGame(self):pygame.display.init()MainGame.window=pygame.display.set_mode([SCREEN_WIDTH,SCREEN_HEIGHT])#MainGame.my_tank=Tank(350,250)self.createMytank()self.createEnemyTank()self.createWall()pygame.display.set_caption('坦克大作战')while True:time.sleep(0.02)MainGame.window.fill(BG_color)self.getEvent()MainGame.window.blit(self.getTextSuface('敌方坦克数量%d'%len(MainGame.enemyTankList)),(10,10))if MainGame.my_tank and MainGame.my_tank.live:MainGame.my_tank.displayTank()else:del MainGame.my_tankMainGame.my_tank=Noneself.blitEnemyTank()self.blitMyBullet()self.blitenemyBullet()self.blitExplode()self.blitWall()if MainGame.my_tank and MainGame.my_tank.live:if not  MainGame.my_tank.stop:MainGame.my_tank.move()MainGame.my_tank.hitWall()MainGame.my_tank.myTank_hit_enemyTank()pygame.display.update()def blitWall(self):for wall in MainGame.wallList:if wall.live:wall.displayWall()else:MainGame.wallList.remove(wall)def createWall(self):for i in range(5):wall=Wall(i*170,220)MainGame.wallList.append(wall)def createMytank(self):MainGame.my_tank = MyTank(400, 250)def createEnemyTank(self):top=100for i in range(MainGame.enemyTankCount):left=random.randint(0,600)speed=random.randint(1,4)enemy=EnemyTank(left,top,speed)MainGame.enemyTankList.append(enemy)def blitExplode(self):for explode in MainGame.explodeList:if explode.live:explode.displayExplode()else:MainGame.explodeList.remove(explode)def blitEnemyTank(self):for enemyTank in MainGame.enemyTankList:if enemyTank.live:enemyTank.displayTank()enemyTank.randMove()enemyTank.hitWall()if MainGame.my_tank and MainGame.my_tank.live:enemyTank.enemyTank_hit_myTank()enemyBullet = enemyTank.shot()if enemyBullet:MainGame.enemyBulletList.append(enemyBullet)else:MainGame.enemyTankList.remove(enemyTank)def blitMyBullet(self):for myBullet in MainGame.myBulletList:if myBullet.live:myBullet.displayBullet()myBullet.move()myBullet.myBullet_hit_enemyTank()myBullet.hitWall()else:MainGame.myBulletList.remove(myBullet)def blitenemyBullet(self):for enemyBullet in MainGame.enemyBulletList:if enemyBullet.live:enemyBullet.displayBullet()enemyBullet.move()enemyBullet.enemyBullet_hit_myTank()enemyBullet.hitWall()else:MainGame.enemyBulletList.remove(enemyBullet)def endGame(self):print('谢谢您的使用!')pygame.quit()#左上角文字绘制def getTextSuface(self,text):pygame.font.init()font=pygame.font.SysFont('kaiti',18)textSurface=font.render(text,True,TEXT_COLOR)return textSurface#获取事件def getEvent(self):eventList=pygame.event.get()for event in eventList:if event.type==pygame.QUIT:#退出self.endGame()if event.type==pygame.KEYDOWN:if not MainGame.my_tank:if event.key==pygame.K_ESCAPE:self.createMytank()if MainGame.my_tank and MainGame.my_tank.live:if event.key == pygame.K_LEFT:MainGame.my_tank.direction = 'L'MainGame.my_tank.stop = False# MainGame.my_tank.move()print('向左移')elif event.key == pygame.K_RIGHT:MainGame.my_tank.direction = 'R'MainGame.my_tank.stop = False# MainGame.my_tank.move()print('向右移')elif event.key == pygame.K_UP:MainGame.my_tank.direction = 'U'MainGame.my_tank.stop = False# MainGame.my_tank.move()print('向上移')elif event.key == pygame.K_DOWN:MainGame.my_tank.direction = 'D'MainGame.my_tank.stop = False# MainGame.my_tank.move()print('向下移')elif event.key == pygame.K_SPACE:print('发射子弹')if len(MainGame.myBulletList) <= 3:myBullet = Bullet(MainGame.my_tank)MainGame.myBulletList.append(myBullet)#松开方向键停止if event.type==pygame.KEYUP:if event.key==pygame.K_UP or event.key==pygame.K_DOWN or event.key==pygame.K_RIGHT or event.key==pygame.K_LEFT:if MainGame.my_tank and MainGame.my_tank.live:MainGame.my_tank.stop=Trueclass Tank(BaseItem):def __init__(self,left,top):self.images={'U':pygame.image.load('TANK/img/p1tankU.gif'),'D': pygame.image.load('TANK/img/p1tankD.gif'),'L': pygame.image.load('TANK/img/p1tankL.gif'),'R': pygame.image.load('TANK/img/p1tankR.gif'),}self.direction='U'self.image=self.images[self.direction]self.rect=self.image.get_rect()self.rect.left=leftself.rect.top=topself.speed=5self.stop=Trueself.live=Trueself.oldLeft=self.rect.leftself.oldTop = self.rect.topdef move(self):self.oldLeft= self.rect.leftself.oldTop = self.rect.topif self.direction=='L':if self.rect.left >0:self.rect.left -= self.speedelif self.direction=='U':if self.rect.top > 0:self.rect.top -= self.speedelif self.direction=='D':if self.rect.top+self.rect.height < SCREEN_HEIGHT:self.rect.top +=self.speedelif self.direction == 'R':if self.rect.left+self.rect.height < SCREEN_WIDTH:self.rect.left += self.speeddef shot(self):return Buttle(self)def stay(self):self.rect.left=self.oldLeftself.rect.top=self.oldTopdef hitWall(self):for wall in MainGame.wallList:if pygame.sprite.collide_rect(self,wall):self.stay()def displayTank(self):self.image=self.images[self.direction]MainGame.window.blit(self.image,self.rect)
class MyTank(Tank):def __init__(self,left,top):super(MyTank,self).__init__(left,top)def myTank_hit_enemyTank(self):for enemyTank in MainGame.enemyTankList:if pygame.sprite.collide_rect(self,enemyTank):self.stay()
class EnemyTank(Tank):def __init__(self,left,top,speed):super(EnemyTank,self).__init__(left,top)self.images={'U':pygame.image.load('TANK/img/enemy1U.gif'),'D':pygame.image.load('TANK/img/enemy1D.gif'),'L':pygame.image.load('TANK/img/enemy1L.gif'),'R':pygame.image.load('TANK/img/enemy1R.gif')}#敌方坦克,方向随机self.direction=self.randDirection()self.image=self.images[self.direction]self.rect=self.image.get_rect()self.rect.left=leftself.rect.top=topself.speed=speedself.flag=Trueself.step=20def enemyTank_hit_myTank(self):if pygame.sprite.collide_rect(self,MainGame.my_tank):self.stay()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 randMove(self):if self.step <=0:self.direction=self.randDirection()self.step=60else:self.move()self.step -=1def shot(self):num=random.randint(1,100)if num < 5:return Bullet(self)
class Bullet(BaseItem):def __init__(self,tank):self.image=pygame.image.load('TANK/img/enemymissile.gif')self.direction=tank.directionself.rect=self.image.get_rect()if self.direction == 'U':self.rect.left=tank.rect.left+tank.rect.width/2-self.rect.width/2self.rect.top=tank.rect.top-self.rect.heightelif self.direction == 'D':self.rect.left = tank.rect.left + tank.rect.width / 2 - self.rect.width / 2self.rect.top = tank.rect.top + tank.rect.heightelif self.direction == 'L':self.rect.left = tank.rect.left - tank.rect.width / 2 - self.rect.width / 2self.rect.top = tank.rect.top + tank.rect.width/2 -self.rect.width/2elif self.direction == 'R':self.rect.left = tank.rect.left + tank.rect.widthself.rect.top = tank.rect.top + self.rect.width/2-self.rect.width/2self.speed=6self.live=Truedef move(self):if self.direction=='U':if self.rect.top >0:self.rect.top-=self.speedelse:self.live=Falseelif self.direction=='R':if self.rect.left +self.rect.width <SCREEN_WIDTH:self.rect.left +=self.speedelse:self.live=Falseelif self.direction =='L':if self.rect.left >0:self.rect.left -=self.speedelse:self.live=Falseelif self.direction=='D':if self.rect.top +self.rect.height <SCREEN_HEIGHT:self.rect.top +=self.speedelse:self.live=Falsedef hitWall(self):for wall in MainGame.wallList:if pygame.sprite.collide_rect(self,wall):self.live=Falsewall.hp-=1if wall.hp<=0:wall.live=Falsedef displayBullet(self):MainGame.window.blit(self.image,self.rect)def myBullet_hit_enemyTank(self):for enemyTank in MainGame.enemyTankList:if pygame.sprite.collide_rect(enemyTank,self):enemyTank.live=Falseself.live=Falseexplode=Explode(enemyTank)MainGame.explodeList.append(explode)def enemyBullet_hit_myTank(self):if MainGame.my_tank and MainGame.my_tank.live:if pygame.sprite.collide_rect(MainGame.my_tank, self):explode = Explode(MainGame.my_tank)MainGame.explodeList.append(explode)self.live = FalseMainGame.my_tank.live = Falseclass Wall():def __init__(self,left,top):self.image=pygame.image.load('TANK/img/steels.gif')self.rect=self.image.get_rect()self.rect.left=leftself.rect.top=topself.live=Trueself.hp=3def displayWall(self):MainGame.window.blit(self.image,self.rect)
class Explode():def __init__(self,tank):self.rect=tank.rectself.images=[pygame.image.load('TANK/img/blast0.gif'),pygame.image.load('TANK/img/blast1.gif'),pygame.image.load('TANK/img/blast2.gif'),pygame.image.load('TANK/img/blast3.gif'),pygame.image.load('TANK/img/blast4.gif'),]self.step=0self.image=self.images[self.step]self.live=Truedef displayExplode(self):if self.step<len(self.images):self.image=self.images[self.step]self.step+=1MainGame.window.blit(self.image,self.rect)else:self.live=Falseself.step=0
if __name__=='__main__':MainGame().startGame()

详细资料提取:

链接:https://pan.baidu.com/s/1RN_f9WZkviudE6UlaLeUWQ?pwd=539e 
提取码:539e 

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

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

相关文章

Vue3中为Ant Design Vue中Modal.confirm自定义内容

在一次业务开发时代码时&#xff0c;碰到了一种既想要Modal.confirm样式&#xff0c;又想要定制其content内容的情况。 大部分情况下&#xff0c;使用Modal.method()这种方式时&#xff0c;可能content内容固定都是字符串&#xff0c;那如果想要做更高级的交互怎么办&#xff…

【Git-驯化】一文学会git配置用户信息,git config用法细节

【Git-驯化】一文学会git配置用户信息&#xff0c;git config用法细节 本次修炼方法请往下查看 &#x1f308; 欢迎莅临我的个人主页 &#x1f448;这里是我工作、学习、实践 IT领域、真诚分享 踩坑集合&#xff0c;智慧小天地&#xff01; &#x1f387; 免费获取相关内容文档…

Sourcecodester Fantastic Blog CMS v1.0 SQL 注入漏洞(CVE-2022-28512)

前言 CVE-2022-28512 是一个存在于 Sourcecodester Fantastic Blog CMS v1.0 中的 SQL 注入漏洞。攻击者可以通过 "/fantasticblog/single.php" 中的 id 参数注入恶意 SQL 查询&#xff0c;从而获得对数据库的未经授权的访问和控制。 漏洞详细信息 漏洞描述: 该漏…

工具发送formdata请求 Multipartfile 接收

1.需求&#xff1a; 接收到 (Multipartfile file 文件 》使用工具转发到别的请求&#xff0c;将文件传到别的接口 主要代码&#xff1a; InputStreamResource inputstreamResource new InputstreamResource(file.getInputstream(), file.getoriginalfilename());MultiReso…

全网都在疯传的最新蓝海风口项目!

最近全网都在疯传这种视频&#xff0c;想必兄弟们都见到过了&#xff01; 大家看这个号&#xff0c;1天的时间&#xff0c;2个作品&#xff0c;第2个直接就爆了&#xff0c;昨天看点赞还是3.8w&#xff0c;今天已经10w了&#xff0c;这是妥妥的风口啊&#xff01; 大家有没有想…

应用在灯带Type-C接口上的PD SINK协议芯片ECP5701/ECP5702获取充电器的5V、9V、12V、15V、20V供电

方案背景 近日&#xff0c;欧盟就统一充电器接口的提案达成了一项政治协议&#xff0c;其中规定了在欧盟地区销售的所有手机或其他便携式中小型电子设备必须采用统一的USB Type-C接口。这项决定意味着未来将会有更多的产品强制性地使用TYPE-C充电接口。 在这个背景下&#xf…

wordpress 付费主题modown分享,可实现资源付费

该主题下载地址 下载地址 简介 Modown是基于Erphpdown 会员下载插件开发的付费下载资源、付费下载源码、收费附件下载、付费阅读查看隐藏内容、团购下载的WordPress主题&#xff0c;一款针对收费付费下载资源/付费查看内容/付费阅读/付费视频/VIP会员免费下载查看/虚拟资源售…

在Linux上查找文件的2个好用的命令

1. locate xx &#xff08;查找带xx字符的所有文件或目录&#xff09; 在终端输入命令 locate lua&#xff0c;可以看到&#xff0c;所有带lua字符的文件或目录都会被搜索出来。 2. find / -name xx &#xff08;查找名为xx的文件或目录&#xff09; 在终端输入命令 find …

SpringBoot集成beetl模板快速入门

在pom文件引入maven依赖 <dependency><groupId>com.ibeetl</groupId><artifactId>beetl-framework-starter</artifactId><version>1.1.81.RELEASE</version></dependency>写一个controller /*** author * create * descripti…

SecureCRT--使用sftp上传和下载文件

原文网址&#xff1a;SecureCRT--使用sftp上传和下载文件_IT利刃出鞘的博客-CSDN博客 简介 本文介绍SecureCRT如何在软件内直接上传和下载文件。 SecureCRT可以用如下两种方法上传和下载文件&#xff1a; 自带的sftp插件服务器安装rz/sz命令 本文介绍第一种方法&#xff0…

【Android面试八股文】Android性能优化面试题:怎样检测函数执行是否卡顿?

文章目录 卡顿一、可重现的卡顿二、不可重现的卡顿第一种方案: 基于 Looper 的监控方法第二种方案:基于 Choreographer 的监控方法第三种方案:字节码插桩方式第四种方案: 使用 JVMTI 监听函数进入与退出总结相关大厂的方案ArgusAPMBlockCanaryQQ空间卡慢组件Matrix微信广研参…

vue目录说明

vue目录说明 主要目录说明 .vscode - - -vscode工具的配置文件夹 node_modules - - - vue项目的运行依赖文件夹 public - - -资源文件夹&#xff08;浏览器图标&#xff09; src- - -源码文件夹 .gitignore - - -git忽略文件 index.html - - -入口html文件 package.json - - -…

系统架构设计师教程(清华第2版)<第1章 绪论>解读

系统架构设计师教程 第一章 绪论 1.1 系统架构概述1.1.1 系统架构的定义及发展历程1.1.2 软件架构的常用分类及建模方法1.1.3 软件架构的应用场景1.1.4 软件架构的发展未来1.2 系统架构设计师概述1.2.1 架构设计师的定义、职责和任务1.2.2 架构设计师应具备的专业素质1.3 如何成…

上份工作不干了24年5月-6月回顾(面试+软考)需要资料的小伙伴可以关注下

前言&#xff1a; 博主在5月和6月基本没有对博客内容进行更新了&#xff0c;不是博主偷懒&#xff0c;5月份博主在全力准备24年系统分析师的软考&#xff0c;6月份在准备面试&#xff0c;现在对5月和6月进行回顾&#xff1b; 先说下软考系统分析师&#xff1a; 博主实在今年3月…

记录OSPF配置,建立邻居失败的过程

1.配置完ospf后&#xff0c;在路由表中不出现ospf相关信息 [SW2]ospf [SW2-ospf-1]are [SW2-ospf-1]area 0 [SW2-ospf-1-area-0.0.0.0]net [SW2-ospf-1-area-0.0.0.0]network 0.0.0.0 Jul 4 2024 22:11:58-08:00 SW2 DS/4/DATASYNC_CFGCHANGE:OID 1.3.6.1.4.1.2011.5.25 .1…

arm_uart4实验

#include "uart4.h" //UART //初始化 void hal_uart4_init() { //rcc_init //…

前端Debugger时复制的JS对象字符转JSON对象

前端debugger时&#xff0c;复制的对象在控制台输出时是如下格式&#xff0c;需要转换为对象格式来进行验证操作 bridgeId : 4118 createBy : null createTime : "2023-03-24 10:35:26" createUserId : 1 具体实现代码&#xff1a; // 转换transform (text) {l…

openlayers中区域掩膜的实现

概述 在前文完成了mapboxGL中区域掩膜的实现。近日有人问到说在openlayers中如何实现&#xff0c;本文就带大家看看如何在openlayers中实现区域掩膜。 实现效果 实现 1. 实现思路 在地图容器中添加一个canvas&#xff0c;设置其在map之上&#xff1b;监听map的postrender事…

文华财经T9多空波段趋势量化交易策略模型源码

// 定义变量 Vars Numeric STEP1,MVALUE1,SARVAL,C; Numeric SARLINE,COND,ZBMA1,ZBMA2; Begin CCLOSE; STEP13/11; MVALUE120/22; SARVALSAR(4, STEP1, MVALUE1); PlotLine("",IIF(SARVAL>0,SARVAL,InvalidNumeric),RED,Circledot); PlotLine("&q…

AI大模型开发入门:OpenAI API的Hello World

AI大模型时代下&#xff0c;我们也要学点大模型知识了。 前面我们简单实现了将GPT接入微信公众号&#xff1a; [【超详细&#xff01;】Python微信公众号开发&#xff08;4&#xff09;- 手把手教你接入GPT]&#xff0c;算是已经用过一点AI的知识了&#xff0c;浅尝辄止。 这还…