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 坦克大战相关推荐

  1. python坦克大战_Life is short,you need Python——Python实现坦克大战(一)

    先展示一下效果 搓搓小手手,坦克大战即将开始--https://www.zhihu.com/video/1140743290784817152 一.游戏引擎的安装 安装方式有两种:1.pip安装 wi ...

  2. Python实现坦克大战源码

    Python实现坦克大战小游戏源码,可实现单人及双人模式. import sysimport pygameimport sceneimport bulletimport foodimport tank ...

  3. python版坦克大战

    Python版坦克大战 Python一千行代码搞定坦克大战游戏. 在开发坦克大战游戏项目中,我们使用的是pygame模块来完成的,所以得先装好pygame模块.本游戏一共封装了11个类和两个模块(py ...

  4. Python实现坦克大战

    Python实现坦克大战 一.前言 前段时间,也就是国庆节.在寝室闲来无事,用pygame写了一个小游戏,就是标题写的<坦克大战>.这个游戏写了两个版本,第一个版本是按照书上的思想来写的, ...

  5. python 游戏开发框架_Python开发 基于python实现坦克大战游戏

    这篇文章主要为大家详细介绍了基于python实现坦克大战游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 本文实例为大家分享了python实现坦克大战游戏的具体代码, ...

  6. 小甲鱼python游戏代码_【小甲鱼】零基础学习python pygame 飞机大战可执行源代码...

    [实例简介] [小甲鱼]零基础学习python pygame 飞机大战可执行源代码,觉得挺有意思,故此分享. [实例截图] [核心代码] 飞机大战 └── 飞机大战 ├── bullet.py ├── ...

  7. 用Python实现坦克大战游戏 | 干货贴

    作者 | 李秋键 出品 | AI科技大本营(rgznai100) <坦克大战>是1985年日本南梦宫Namco游戏公司在任天堂FC平台上,推出的一款多方位平面射击游戏.游戏以坦克战斗及保卫 ...

  8. 手把手教你用Python实现“坦克大战”,附详细代码!

    小时候玩的"坦克大战",你还记得吗? 满满的回忆 ! 今天,我们使用Python以及强大的第三方库来实现一个简单的坦克大战游戏. 整体效果 环境依赖 python3.7 pygam ...

  9. Python实现坦克大战(TankWar)游戏

    项目所有的代码与材料:代码下载 Features 双人模式 动画与音效 特殊的场景元素:草丛.河面和可以通行的冰面 各种各样的道具 Rules 玩家一 WASD 控制方向.空格键开火,玩家二上下左右控 ...

最新文章

  1. 《精通 ASP.NET MVC 3 框架(第三版)》----第2章 准备工作 2.1 准备工作站
  2. docker commit (从容器创建一个新的镜像)
  3. Python3序列解包
  4. 8086存储器编址 和 I/O编址
  5. 旅途人物之二:幸福的孩子们
  6. 我的邮局系统,欢迎大家注册!hotxf.com
  7. 小程序如何上传代码到服务器,云服务器怎么上传小程序代码
  8. SpringBoot 核心源码解读
  9. 考研高数笔记(数一)--pdf文档 百度网盘自取
  10. 根据边界坐标提取边界内部数据点坐标
  11. 人人网登陆(selenium、PtantomJS结合)
  12. 增粉的各种方法【微信 / 微博 增加粉丝的108种方法】
  13. data could not be sent to remote host
  14. GeForce Desktop Products Compute Capability
  15. Tackling the Qubit Mapping Problem for NISQ-Era Quantum Devices
  16. REINFORCEMENT LEARNING USING QUANTUM BOLTZMANN MACHINES利用量子波兹曼机进行强化学习
  17. torch里面的Tensor、as_tensor、tensor以及from_numpy究竟有何区别?
  18. HDR阴影高光图像增强
  19. 机电一体化T6113电气控制系统的设计(论文+DWG图纸)
  20. 7款产品解决宠物主人头痛的问题

热门文章

  1. 扁平化easyUI default皮肤
  2. java版溺尸刷怪塔_教程/溺尸陷阱 _ 《我的世界》中文Minecraft Wiki:最详细的官方我的世界百科...
  3. 电脑打印准考证图片显示不出来
  4. 查询成绩第三名的学生信息
  5. 数据结构与算法java - 03 链表,单向链表,逆序打印单向链表
  6. 预训练模型 PLOME
  7. 闲暇时间不知道如何有效利用,TapTap、触漫等五款软件帮你解决
  8. 文华学院大学计算机基础考试数据库ip,文华学院大学计算机基础模拟试卷
  9. 不要一个人吃饭---人脉就是钱脉
  10. A40I工控主板(SBC-X40I)USB接口读写测试