Python pygame 坦克大战
Python pygame 坦克大战
import pygame, time, random
from pygame.sprite import SpriteSCREEN_WIDTH = 750
SCREEN_HEIGHT = 500
BG_COLOR = pygame.Color(0, 0, 0) # 背景颜色
TEXT_COLOR = pygame.Color(206, 217, 231) # 字体颜色# 新建精灵类
class BaseItem(Sprite):passclass MainGame:window = NonemyTank = NoneenemyCount = 5enemyList = []# 定义我方子弹发射列表myBulletList = []# 敌方坦克发射的子弹列表enemyBulletList = []# 定义存储爆炸效果类列表explodeList = []# 定义墙壁列表wallList = []# 初始化方法def __init__(self) -> None:pass# 创建敌方坦克def createEnemy(self):top = 100for i in range(MainGame.enemyCount):left = random.randint(0, 600)speed = random.randint(1, 4)enemyTank = EnemtTank(left, top, speed)# 添加到列表MainGame.enemyList.append(enemyTank)# 加载敌方坦克def displayEnemyTank(self):for enemyTank in MainGame.enemyList:# 判断敌方坦克是否存活if enemyTank.live:enemyTank.displayTank()# 调用move进行移动enemyTank.rankMove()# 调用检测敌方坦克是否与墙壁发生碰撞enemyTank.tank_hit_wall()# 初始化敌方坦克发射的子弹enemyBullet = enemyTank.shot()# 调用检测敌方坦克是否与墙壁发生碰撞if MainGame.myTank and MainGame.myTank.live:enemyTank.enemyTank_hit_myTank()if enemyBullet:MainGame.enemyBulletList.append(enemyBullet)# 判断子弹是否有值if enemyBullet:MainGame.enemyBulletList.append(enemyBullet)else: # 当敌方坦克已经死亡,将坦克从敌方坦克列表移除MainGame.enemyList.remove(enemyTank)# 显示我方坦克发射的子弹def displayMyBullet(self):for myBullet in MainGame.myBulletList:if myBullet.live:myBullet.displayBullet()# 调用子弹的移动方法myBullet.move()# 调用子弹是否与敌方坦克碰撞myBullet.myBullet_hit_enemyTank()# 调用我方子弹是否与墙壁碰撞myBullet.bullet_hit_wall()else:# 从子弹列表中删除子弹MainGame.myBulletList.remove(myBullet)# 显示敌方子弹发射def displayEnemyBullet(self):for enemyBullet in MainGame.enemyBulletList:if enemyBullet.live:enemyBullet.displayBullet()# 调用子弹移动enemyBullet.move()# 调用敌方子弹和我我方坦克碰撞检测enemyBullet.enemyBullet_hit_myTank()# 调用敌方子弹是否与墙壁碰撞enemyBullet.bullet_hit_wall()else:MainGame.enemyBulletList.remove(enemyBullet)# 循环遍历爆炸效果列表来展示爆炸效果def displayExplodeList(self):for explode in MainGame.explodeList:if explode.live:# 展示explode.displayExplode()else:# 从爆炸效果中移除MainGame.explodeList.remove(explode)# 创建我方坦克def createMyTank(self):MainGame.myTank = MyTank(350, 300)# 添加音效music = Music("../坦克大战/img/start.wav")# 播放music.playMusic()# 创建墙壁def createWall(self):top = 220for i in range(6):# 初始化墙壁wall = Wall(i * 130, top)# 添加到墙壁列表MainGame.wallList.append(wall)# 加载墙壁def displayWallList(self):# 循环遍历墙壁列表for wall in MainGame.wallList:if wall.live:wall.displayWall()else:MainGame.wallList.remove(wall)# 开始游戏def startGame(self):pygame.display.init()# 设置窗口大小MainGame.window = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))# 设置窗口标题pygame.display.set_caption("坦克大战1.00")# 初始化我方坦克self.createMyTank()# 调用创建敌方坦克self.createEnemy()# 创建墙壁self.createWall()while True: # 让窗口一直存在不消失time.sleep(0.01)# 给窗口设置填充色MainGame.window.fill(BG_COLOR)# 添加文字信息提示textSurface = self.getTextSurface(" Remaining number of enemy tanks is %d " % len(MainGame.enemyList))# 主窗口显示文字信息MainGame.window.blit(textSurface, (10, 10))# 添加事件监听self.getEvent()# 调用坦克的显示方法if MainGame.myTank and MainGame.myTank.live:MainGame.myTank.displayTank()else:# 删除我方坦克del MainGame.myTankMainGame.myTank = None# 调用坦克移动的方法if MainGame.myTank and MainGame.myTank.live:if not MainGame.myTank.stop:MainGame.myTank.move()# 调用检测敌方坦克是否与墙壁发生碰撞MainGame.myTank.tank_hit_wall()# 调用检测我方坦克是否与敌方坦克发生碰撞MainGame.myTank.myTank_hit_enemyTank()# 加载敌方坦克self.displayEnemyTank()# 加载我方坦克发射的子弹self.displayMyBullet()# 加载敌方坦克发射的子弹self.displayEnemyBullet()# 加载爆炸效果self.displayExplodeList()# 加载墙壁self.displayWallList()pygame.display.update()# 添加文字信息提示def getTextSurface(self, text):# 初始化字体模块pygame.font.init()# 获取字体对象font = pygame.font.SysFont('consolas', 18)# 绘制文字信息textSurface = font.render(text, True, TEXT_COLOR)# 添加事件监听self.getEvent()return textSurface# print(pygame.font.get_fonts()) # 看看字体有哪些# 添加事件监听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.myTank:# 判断键盘按下的是escif event.key == pygame.K_ESCAPE:# 调用创建我方坦克的方法self.createMyTank()# 调用创建墙壁的方法# self.createWall()if MainGame.myTank and MainGame.myTank.live:if event.key == pygame.K_LEFT:print("按下左键,坦克向左移动")MainGame.myTank.direction = 'L'# 修改坦克移动的方法MainGame.myTank.stop = Falseelif event.key == pygame.K_RIGHT:print("按下右键,坦克向右移动")# 调用坦克移动方法MainGame.myTank.direction = 'R'# 修改坦克移动的方法MainGame.myTank.stop = Falseelif event.key == pygame.K_UP:print("按下上键,坦克向上移动")# 调用坦克移动方法MainGame.myTank.direction = 'U'# 修改坦克移动的方法MainGame.myTank.stop = Falseelif event.key == pygame.K_DOWN:print("按下下键,坦克向下移动")# 调用坦克移动方法MainGame.myTank.direction = 'D'# 修改坦克移动的方法MainGame.myTank.stop = Falseelif event.key == pygame.K_SPACE:print('发射子弹')# 限制子弹数量 #子弹列表的数量如果小于3,可以初始化子弹if len(MainGame.myBulletList) <= 3:myBullet = Bullet(MainGame.myTank)MainGame.myBulletList.append(myBullet)# 添加音效music = Music('../坦克大战/img/fire.wav')music.playMusic()# 判断是否是键盘是否松开if event.type == pygame.KEYUP:if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT or event.key == pygame.K_DOWN or event.key == pygame.K_UP:if MainGame.myTank and MainGame.myTank.live:MainGame.myTank.stop = True# 结束游戏def endGame(self):print("谢谢使用,欢迎下次使用")exit()class Tank(BaseItem):def __init__(self, left, top):# 保存加载图片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 = 'R'# 根据坦克方向,加载图片self.image = self.images.get(self.direction)# 根据图片获取图片所在的矩形区域self.rect = self.image.get_rect()# 设置区域的left和topself.rect.left = leftself.rect.top = top# 速度self.speed = 5# 坦克移动的开关self.stop = True# 坦克生成状态self.live = True# 移动之前的位置self.oldleft = self.rect.leftself.oldtop = self.rect.top# 展示坦克def displayTank(self):self.image = self.images.get(self.direction)MainGame.window.blit(self.image, self.rect)# 移动坦克def move(self):# 记录移动之前的位置self.oldleft = self.rect.leftself.oldtop = self.rect.top# 判断坦克方向移动if self.direction == 'L':if self.rect.left > 0:self.rect.left -= self.speedelif self.direction == 'R':if self.rect.left + self.rect.height < SCREEN_WIDTH: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.speed# 射击def shot(self):pass# 设置坦克位置为移动之前的位置def stay(self):self.rect.left = self.oldleftself.rect.top = self.oldtop# 检测坦克是否与墙壁发生碰撞def tank_hit_wall(self):# 循环遍历墙壁列表for wall in MainGame.wallList:if pygame.sprite.collide_rect(self, wall):# 设置坦克的坐标为移动之前的位置self.stay()# 我方坦克
class MyTank(Tank):# 初始化方法def __init__(self, left, top) -> None:# 调用父类的初始方法super(MyTank, self).__init__(left, top)# 检测我方坦克是否与敌方坦克发生碰撞def myTank_hit_enemyTank(self):# 循环遍历敌方坦克列表for enemyTank in MainGame.enemyList:if pygame.sprite.collide_rect(self, enemyTank):self.stay()# 地方坦克
class EnemtTank(Tank):def __init__(self, left, top, speed):super(EnemtTank, self).__init__(left, top)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.get(self.direction)# 获取矩形区域self.rect = self.image.get_rect()# 设置left 和topself.rect.left = leftself.rect.top = topself.speed = speedself.step = 30# self.live = True# 随机生成的方向def randDirection(self):num = int(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 rankMove(self):if self.step <= 0:# 修改坦克移动方向self.direction = self.randDirection()# 让步数复位self.step = 30else:self.move()# 步数递减self.step -= 1def shot(self):# 随机生成一个100以内的数字num = random.randint(0, 100)if num < 19:return Bullet(self)# 检测敌方坦克是否与我方坦克发生碰撞def enemyTank_hit_myTank(self):if pygame.sprite.collide_rect(self, MainGame.myTank):self.stay()# 子弹类
class Bullet(BaseItem):def __init__(self, tank):# 加载图片self.image = pygame.image.load("../坦克大战/img/enemymissile.gif")# 子弹的方向self.direction = tank.direction# 根据图片获取区域self.rect = self.image.get_rect()# 设置left和topif 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 - self.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 + tank.rect.width / 2 - self.rect.width / 2# 子弹的速度self.speed = 6# 判断子弹是否存活self.live = True# 显示子弹def displayBullet(self):MainGame.window.blit(self.image, self.rect)# 子弹移动def move(self):if self.direction == 'U':if self.rect.top > 0:self.rect.top -= self.speedelse: # 碰到墙壁self.live = Falseelif self.direction == 'D':if self.rect.top + self.rect.height < SCREEN_HEIGHT:self.rect.top += self.speedelse:self.live = Falseelif self.direction == 'L':if self.rect.left > 0:self.rect.left -= self.speedelse:self.live = Falseelif self.direction == 'R':if self.rect.left + self.rect.width < SCREEN_WIDTH:self.rect.left += self.speedelse:self.live = False# 我方子弹和敌方坦克碰撞检测def myBullet_hit_enemyTank(self):# 遍历敌方坦克列表for enemyTank in MainGame.enemyList:if pygame.sprite.collide_rect(self, enemyTank):# 修改敌方坦克和我方子弹生成状态enemyTank.live = Falseself.live = False# 初始化爆炸效果类explode = Explode(enemyTank)# 添加爆炸效果类到爆炸效果列表中MainGame.explodeList.append(explode)def enemyBullet_hit_myTank(self):if MainGame.myTank and MainGame.myTank.live:if pygame.sprite.collide_rect(self, MainGame.myTank):# 产生爆炸效果explode = Explode(MainGame.myTank)# 将爆炸效果添加到爆炸效果列表MainGame.explodeList.append(explode)# 修改敌方子弹与我方坦克的生存状态self.live = FalseMainGame.myTank.live = False# 检测子弹是否与墙壁发生碰撞def bullet_hit_wall(self):# 循环遍历墙壁列表for wall in MainGame.wallList:if pygame.sprite.collide_rect(self, wall):# 设置子弹生存状态修改self.live = False# 让墙壁的生命值减减wall.hp -= 1# 判断墙壁生命值是否小于等于0if wall.hp <= 0:# 设置墙壁的生存状态wall.live = False# 墙壁类
class Wall():def __init__(self, left, top):# 加载墙壁图片self.image = pygame.image.load('../坦克大战/代码/img/steels.gif')# 根据图片获取区域self.rect = self.image.get_rect()# 设置left topself.rect.left = leftself.rect.top = top# 生存状态self.live = True# 生命值self.hp = 3# 展示墙壁方法def displayWall(self):MainGame.window.blit(self.image, self.rect)# 爆炸效果
class Explode():def __init__(self, tank):# 爆炸位置为当前击中坦克的位置self.rect = tank.rectself.images = [pygame.image.load("../坦克大战/img/blast0.gif"),pygame.image.load("../坦克大战/img/blast1.gif"),pygame.image.load("../坦克大战/img/blast2.gif"),pygame.image.load("../坦克大战/img/blast3.gif"),pygame.image.load("../坦克大战/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 += 1# 添加到主窗口MainGame.window.blit(self.image, self.rect)else:# 修改存活状态self.live = Falseself.step = 0# 音效类
class Music():def __init__(self, filename) -> None:self.filename = filename# 初始化混合器pygame.mixer.init()# 加载音乐pygame.mixer.music.load(self.filename)# 播放音乐def playMusic(self):pygame.mixer.music.play()if __name__ == '__main__':# 调用主类的startGameMainGame().startGame()
Python pygame 坦克大战相关推荐
- python坦克大战_Life is short,you need Python——Python实现坦克大战(一)
先展示一下效果 搓搓小手手,坦克大战即将开始--https://www.zhihu.com/video/1140743290784817152 一.游戏引擎的安装 安装方式有两种:1.pip安装 wi ...
- Python实现坦克大战源码
Python实现坦克大战小游戏源码,可实现单人及双人模式. import sysimport pygameimport sceneimport bulletimport foodimport tank ...
- python版坦克大战
Python版坦克大战 Python一千行代码搞定坦克大战游戏. 在开发坦克大战游戏项目中,我们使用的是pygame模块来完成的,所以得先装好pygame模块.本游戏一共封装了11个类和两个模块(py ...
- Python实现坦克大战
Python实现坦克大战 一.前言 前段时间,也就是国庆节.在寝室闲来无事,用pygame写了一个小游戏,就是标题写的<坦克大战>.这个游戏写了两个版本,第一个版本是按照书上的思想来写的, ...
- python 游戏开发框架_Python开发 基于python实现坦克大战游戏
这篇文章主要为大家详细介绍了基于python实现坦克大战游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 本文实例为大家分享了python实现坦克大战游戏的具体代码, ...
- 小甲鱼python游戏代码_【小甲鱼】零基础学习python pygame 飞机大战可执行源代码...
[实例简介] [小甲鱼]零基础学习python pygame 飞机大战可执行源代码,觉得挺有意思,故此分享. [实例截图] [核心代码] 飞机大战 └── 飞机大战 ├── bullet.py ├── ...
- 用Python实现坦克大战游戏 | 干货贴
作者 | 李秋键 出品 | AI科技大本营(rgznai100) <坦克大战>是1985年日本南梦宫Namco游戏公司在任天堂FC平台上,推出的一款多方位平面射击游戏.游戏以坦克战斗及保卫 ...
- 手把手教你用Python实现“坦克大战”,附详细代码!
小时候玩的"坦克大战",你还记得吗? 满满的回忆 ! 今天,我们使用Python以及强大的第三方库来实现一个简单的坦克大战游戏. 整体效果 环境依赖 python3.7 pygam ...
- Python实现坦克大战(TankWar)游戏
项目所有的代码与材料:代码下载 Features 双人模式 动画与音效 特殊的场景元素:草丛.河面和可以通行的冰面 各种各样的道具 Rules 玩家一 WASD 控制方向.空格键开火,玩家二上下左右控 ...
最新文章
- 《精通 ASP.NET MVC 3 框架(第三版)》----第2章 准备工作 2.1 准备工作站
- docker commit (从容器创建一个新的镜像)
- Python3序列解包
- 8086存储器编址 和 I/O编址
- 旅途人物之二:幸福的孩子们
- 我的邮局系统,欢迎大家注册!hotxf.com
- 小程序如何上传代码到服务器,云服务器怎么上传小程序代码
- SpringBoot 核心源码解读
- 考研高数笔记(数一)--pdf文档 百度网盘自取
- 根据边界坐标提取边界内部数据点坐标
- 人人网登陆(selenium、PtantomJS结合)
- 增粉的各种方法【微信 / 微博 增加粉丝的108种方法】
- data could not be sent to remote host
- GeForce Desktop Products Compute Capability
- Tackling the Qubit Mapping Problem for NISQ-Era Quantum Devices
- REINFORCEMENT LEARNING USING QUANTUM BOLTZMANN MACHINES利用量子波兹曼机进行强化学习
- torch里面的Tensor、as_tensor、tensor以及from_numpy究竟有何区别?
- HDR阴影高光图像增强
- 机电一体化T6113电气控制系统的设计(论文+DWG图纸)
- 7款产品解决宠物主人头痛的问题
热门文章
- 扁平化easyUI default皮肤
- java版溺尸刷怪塔_教程/溺尸陷阱 _ 《我的世界》中文Minecraft Wiki:最详细的官方我的世界百科...
- 电脑打印准考证图片显示不出来
- 查询成绩第三名的学生信息
- 数据结构与算法java - 03 链表,单向链表,逆序打印单向链表
- 预训练模型 PLOME
- 闲暇时间不知道如何有效利用,TapTap、触漫等五款软件帮你解决
- 文华学院大学计算机基础考试数据库ip,文华学院大学计算机基础模拟试卷
- 不要一个人吃饭---人脉就是钱脉
- A40I工控主板(SBC-X40I)USB接口读写测试