坦克 大战游戏

2024-02-28 09:20
文章标签 游戏 大战 坦克

本文主要是介绍坦克 大战游戏,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

具体代码如下:(我的电脑一般会报错没有模板pygame)

到Anaconda 环境test中去配置pygame

(test) C:\Users\yangy>pip install --target=c:\users\yangy\anaconda3\envs\test\lib\site-packages pygame

一般使用pip intall pygame ,但是这里需要指明安装的路径pip install --target=c:\users\yangy\anaconda3\envs\test\lib\site-packages pygame

project4中代码如下

import pygame, time, random_display = pygame.display
COLOR_BLACK = pygame.Color(0, 0, 0)
COLOR_RED = pygame.Color(255, 0, 0)
version = 'v1.25'class MainGame():# 游戏主窗口window = NoneSCREEN_HEIGHT = 500SCREEN_WIDTH = 800# 创建我方坦克TANK_P1 = None# 存储所有敌方坦克EnemyTank_list = []# 要创建的敌方坦克的数量EnemTank_count = 5# 存储我方子弹的列表Bullet_list = []# 存储敌方子弹的列表Enemy_bullet_list = []# 爆炸效果列表Explode_list = []# 墙壁列表Wall_list = []# 同学清单Classmate_list = ["谭媛", "杨焱", "王兴维", "惠媛媛", "鲁全昕", "曾闽华"]# 开始游戏方法def startGame(self):_display.init()# 创建窗口加载窗口(借鉴官方文档)MainGame.window = _display.set_mode([MainGame.SCREEN_WIDTH, MainGame.SCREEN_HEIGHT])self.creatMyTank()self.creatEnemyTank()self.creatWalls()# 设置一下游戏标题_display.set_caption("坦克大战" + version)# 让窗口持续刷新操作while True:# 给窗口完成一个填充颜色MainGame.window.fill(COLOR_BLACK)# 在循环中持续完成事件的获取self.getEvent()# 将绘制文字得到的小画布,粘贴到窗口中MainGame.window.blit(self.getTextSurface("剩余敌方坦克%d辆" % len(MainGame.EnemyTank_list)), (5, 5))number = 300for Classmate in MainGame.Classmate_list:MainGame.window.blit(self.getTextSurface("诚挚感谢%s都到来,祝您活动期间心情愉快!" % Classmate),(400, number))  # 调用展示墙壁的方法number = number + 20# 调用展示墙壁的方法self.blitWalls()if MainGame.TANK_P1 and MainGame.TANK_P1.live:# 将我方坦克加入到窗口中MainGame.TANK_P1.displayTank()else:del MainGame.TANK_P1MainGame.TANK_P1 = None# 循环展示敌方坦克self.blitEnemyTank()# 根据坦克的开关状态调用坦克的移动方法if MainGame.TANK_P1 and not MainGame.TANK_P1.stop:MainGame.TANK_P1.move()# 调用碰撞墙壁的方法MainGame.TANK_P1.hitWalls()MainGame.TANK_P1.hitEnemyTank()# 调用渲染子弹列表的一个方法self.blitBullet()# 调用渲染敌方子弹列表的一个方法self.blitEnemyBullet()# 调用展示爆炸效果的方法self.displayExplodes()time.sleep(0.02)# 窗口的刷新_display.update()# 创建我方坦克的方法def creatMyTank(self):# 创建我方坦克MainGame.TANK_P1 = MyTank(400, 300)# 创建音乐对象music = Music('img/start.wav')# 调用播放音乐方法music.play()# 创建敌方坦克def creatEnemyTank(self):top = 100for i in range(MainGame.EnemTank_count):speed = random.randint(3, 6)# 每次都随机生成一个left值left = random.randint(1, 7)eTank = EnemyTank(left * 100, top, speed)MainGame.EnemyTank_list.append(eTank)# 创建墙壁的方法def creatWalls(self):for i in range(6):wall = Wall(130 * i, 240)MainGame.Wall_list.append(wall)def blitWalls(self):for wall in MainGame.Wall_list:if wall.live:wall.displayWall()else:MainGame.Wall_list.remove(wall)# 将敌方坦克加入到窗口中def blitEnemyTank(self):for eTank in MainGame.EnemyTank_list:if eTank.live:eTank.displayTank()# 坦克移动的方法eTank.randMove()# 调用敌方坦克与墙壁的碰撞方法eTank.hitWalls()# 敌方坦克是否撞到我方坦克eTank.hitMyTank()# 调用敌方坦克的射击eBullet = eTank.shot()# 如果子弹为None。不加入到列表if eBullet:# 将子弹存储敌方子弹列表MainGame.Enemy_bullet_list.append(eBullet)else:MainGame.EnemyTank_list.remove(eTank)# 将我方子弹加入到窗口中def blitBullet(self):for bullet in MainGame.Bullet_list:# 如果子弹还活着,绘制出来,否则,直接从列表中移除该子弹if bullet.live:bullet.displayBullet()# 让子弹移动bullet.bulletMove()# 调用我方子弹与敌方坦克的碰撞方法bullet.hitEnemyTank()# 调用判断我方子弹是否碰撞到墙壁的方法bullet.hitWalls()else:MainGame.Bullet_list.remove(bullet)# 将敌方子弹加入到窗口中def blitEnemyBullet(self):for eBullet in MainGame.Enemy_bullet_list:# 如果子弹还活着,绘制出来,否则,直接从列表中移除该子弹if eBullet.live:eBullet.displayBullet()# 让子弹移动eBullet.bulletMove()# 调用是否碰撞到墙壁的一个方法eBullet.hitWalls()if MainGame.TANK_P1 and MainGame.TANK_P1.live:eBullet.hitMyTank()else:MainGame.Enemy_bullet_list.remove(eBullet)# 新增方法: 展示爆炸效果列表def displayExplodes(self):for explode in MainGame.Explode_list:if explode.live:explode.displayExplode()else:MainGame.Explode_list.remove(explode)# 获取程序期间所有事件(鼠标事件,键盘事件)def getEvent(self):# 1.获取所有事件eventList = pygame.event.get()# 2.对事件进行判断处理(1、点击关闭按钮  2、按下键盘上的某个按键)for event in eventList:# 判断event.type 是否QUIT,如果是退出的话,直接调用程序结束方法if event.type == pygame.QUIT:self.endGame()# 判断事件类型是否为按键按下,如果是,继续判断按键是哪一个按键,来进行对应的处理if event.type == pygame.KEYDOWN:# 点击ESC按键让我方坦克重生if event.key == pygame.K_ESCAPE and not MainGame.TANK_P1:# 调用创建我方坦克的方法self.creatMyTank()#点击tab键让我方坦克重生if event.key == 9 and not MainGame.TANK_P1:# 调用创建我方坦克的方法self.creatMyTank()if MainGame.TANK_P1 and MainGame.TANK_P1.live:# 具体是哪一个按键的处理if event.key == pygame.K_LEFT:print("坦克向左调头,移动")# 修改坦克方向MainGame.TANK_P1.direction = 'L'MainGame.TANK_P1.stop = Falseelif event.key == pygame.K_RIGHT:print("坦克向右调头,移动")# 修改坦克方向MainGame.TANK_P1.direction = 'R'MainGame.TANK_P1.stop = Falseelif event.key == pygame.K_UP:print("坦克向上调头,移动")# 修改坦克方向MainGame.TANK_P1.direction = 'U'MainGame.TANK_P1.stop = Falseelif event.key == pygame.K_DOWN:print("坦克向下掉头,移动")# 修改坦克方向MainGame.TANK_P1.direction = 'D'MainGame.TANK_P1.stop = Falseelif event.key == pygame.K_SPACE:print("发射子弹")if len(MainGame.Bullet_list) < 2:# 产生一颗子弹m = Bullet(MainGame.TANK_P1)# 将子弹加入到子弹列表MainGame.Bullet_list.append(m)music = Music('img/fire.wav')music.play()else:print("子弹数量不足")print("当前屏幕中的子弹数量为:%d" % len(MainGame.Bullet_list))#回车发射子弹elif event.key == 13:print("发射子弹")if len(MainGame.Bullet_list) < 20:# 产生一颗子弹m = Bullet(MainGame.TANK_P1)# 将子弹加入到子弹列表MainGame.Bullet_list.append(m)music = Music('img/fire.wav')music.play()else:print("子弹数量不足")print("当前屏幕中的子弹数量为:%d" % len(MainGame.Bullet_list))# 结束游戏方法if event.type == pygame.KEYUP:# 松开的如果是方向键,才更改移动开关状态if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT or event.key == pygame.K_UP or event.key == pygame.K_DOWN:if MainGame.TANK_P1 and MainGame.TANK_P1.live:# 修改坦克的移动状态MainGame.TANK_P1.stop = True# 左上角文字绘制的功能def getTextSurface(self, text):# 初始化字体模块pygame.font.init()# 查看系统支持的所有字体# fontList = pygame.font.get_fonts()# print(fontList)# 选中一个合适的字体font = pygame.font.SysFont('kaiti', 18)# 使用对应的字符完成相关内容的绘制textSurface = font.render(text, True, COLOR_RED)return textSurfacedef endGame(self):print("谢谢使用")# 结束python解释器exit()class BaseItem(pygame.sprite.Sprite):def __init__(self):pygame.sprite.Sprite.__init__(self)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 = 'U'self.image = self.images[self.direction]# 坦克所在的区域  Rect->self.rect = self.image.get_rect()# 指定坦克初始化位置 分别距x,y轴的位置self.rect.left = leftself.rect.top = top# 新增速度属性self.speed = 5# 新增属性: 坦克的移动开关self.stop = True# 新增属性  live 用来记录,坦克是否活着self.live = True# 新增属性: 用来记录坦克移动之前的坐标(用于坐标还原时使用)self.oldLeft = self.rect.leftself.oldTop = self.rect.top# 坦克的移动方法def 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 == 'R':if self.rect.left + self.rect.height < MainGame.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 < MainGame.SCREEN_HEIGHT:self.rect.top += self.speeddef stay(self):self.rect.left = self.oldLeftself.rect.top = self.oldTop# 新增碰撞墙壁的方法def hitWalls(self):for wall in MainGame.Wall_list:if pygame.sprite.collide_rect(wall, self):self.stay()# 射击方法def shot(self):return Bullet(self)# 展示坦克(将坦克这个surface绘制到窗口中  blit())def displayTank(self):# 1.重新设置坦克的图片self.image = self.images[self.direction]# 2.将坦克加入到窗口中MainGame.window.blit(self.image, self.rect)class MyTank(Tank):def __init__(self, left, top):super(MyTank, self).__init__(left, top)# 新增主动碰撞到敌方坦克的方法def hitEnemyTank(self):for eTank in MainGame.EnemyTank_list:if pygame.sprite.collide_rect(eTank, self):self.stay()class EnemyTank(Tank):def __init__(self, left, top, speed):super(EnemyTank, self).__init__(left, top)# self.live = Trueself.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# 新增步数属性,用来控制敌方坦克随机移动self.step = 30def 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 displayEnemtTank(self):#     super().displayTank()# 随机移动def randMove(self):if self.step <= 0:self.direction = self.randDirection()self.step = 50else:self.move()self.step -= 1def shot(self):num = random.randint(1, 1000)if num <= 20:return Bullet(self)def hitMyTank(self):if MainGame.TANK_P1 and MainGame.TANK_P1.live:if pygame.sprite.collide_rect(self, MainGame.TANK_P1):# 让敌方坦克停下来  stay()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()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 - 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 = 7# 用来记录子弹是否活着self.live = True# 子弹的移动方法def bulletMove(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 < MainGame.SCREEN_HEIGHT - self.rect.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 < MainGame.SCREEN_WIDTH - self.rect.width:self.rect.left += self.speedelse:# 修改状态值self.live = False# 展示子弹的方法def displayBullet(self):MainGame.window.blit(self.image, self.rect)# 新增我方子弹碰撞敌方坦克的方法def hitEnemyTank(self):for eTank in MainGame.EnemyTank_list:if pygame.sprite.collide_rect(eTank, self):# 产生一个爆炸效果explode = Explode(eTank)# 将爆炸效果加入到爆炸效果列表MainGame.Explode_list.append(explode)self.live = FalseeTank.live = False# 新增敌方子弹与我方坦克的碰撞方法def hitMyTank(self):if pygame.sprite.collide_rect(self, MainGame.TANK_P1):# 产生爆炸效果,并加入到爆炸效果列表中explode = Explode(MainGame.TANK_P1)MainGame.Explode_list.append(explode)# 修改子弹状态self.live = False# 修改我方坦克状态MainGame.TANK_P1.live = False# 新增子弹与墙壁的碰撞def hitWalls(self):for wall in MainGame.Wall_list:if pygame.sprite.collide_rect(wall, self):# 修改子弹的live属性self.live = Falsewall.hp -= 1if wall.hp <= 0:wall.live = Falseclass Explode():def __init__(self, tank):self.rect = tank.rectself.step = 0self.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.image = self.images[self.step]self.live = True# 展示爆炸效果def displayExplode(self):if self.step < len(self.images):MainGame.window.blit(self.image, self.rect)self.image = self.images[self.step]self.step += 1else:self.live = Falseself.step = 0class Wall():def __init__(self, left, top):self.image = pygame.image.load('img/steels.gif')self.rect = self.image.get_rect()self.rect.left = leftself.rect.top = top# 用来判断墙壁是否应该在窗口中展示self.live = True# 用来记录墙壁的生命值self.hp = 3# 展示墙壁的方法def displayWall(self):MainGame.window.blit(self.image, self.rect)# 我方坦克出生
class Music():def __init__(self, fileName):self.fileName = fileName# 先初始化混合器pygame.mixer.init()pygame.mixer.music.load(self.fileName)# 开始播放音乐def play(self):pygame.mixer.music.play()MainGame().startGame()

这篇关于坦克 大战游戏的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/755058

相关文章

高仿精仿愤怒的小鸟android版游戏源码

这是一款很完美的高仿精仿愤怒的小鸟android版游戏源码,大家可以研究一下吧、 为了报复偷走鸟蛋的肥猪们,鸟儿以自己的身体为武器,仿佛炮弹一样去攻击肥猪们的堡垒。游戏是十分卡通的2D画面,看着愤怒的红色小鸟,奋不顾身的往绿色的肥猪的堡垒砸去,那种奇妙的感觉还真是令人感到很欢乐。而游戏的配乐同样充满了欢乐的感觉,轻松的节奏,欢快的风格。 源码下载

剑指offer(C++)--孩子们的游戏(圆圈中最后剩下的数)

题目 每年六一儿童节,牛客都会准备一些小礼物去看望孤儿院的小朋友,今年亦是如此。HF作为牛客的资深元老,自然也准备了一些小游戏。其中,有个游戏是这样的:首先,让小朋友们围成一个大圈。然后,他随机指定一个数m,让编号为0的小朋友开始报数。每次喊到m-1的那个小朋友要出列唱首歌,然后可以在礼品箱中任意的挑选礼物,并且不再回到圈中,从他的下一个小朋友开始,继续0...m-1报数....这样下去

【服务器08】之【游戏框架】之【加载主角】

首先简单了解一下帧率 FixedUpdate( )   >   Update( )   >   LateUpdate( ) 首先FixedUpdate的设置值 默认一秒运行50次 虽然默认是0.02秒,但FiexedUpdate并不是真的0.02秒调用一次,因为在脚本的生命周期内,FixedUpdate有一个小循环,这个循环也是通过物理时间累计看是不是大于0.02了,然后调用一次。有

2024年6月24日-6月30日(ue独立游戏为核心)

试过重点放在独立游戏上,有个indienova独立游戏团队是全职的,由于他们干了几个月,节奏暂时跟不上,紧张焦虑了。五一时也有点自暴自弃了,实在没必要,按照自己的节奏走即可。精力和时间也有限,放在周末进行即可。除非哪天失业了,再也找不到工作了,再把重心放在独立游戏上。 另外,找到一个同样业余的美术,从头做肉鸽游戏,两周一次正式交流即可。节奏一定要放慢,不能影响正常工作生活。如果影响到了,还不如自

潜艇伟伟迷杂交版植物大战僵尸2024最新免费安卓+ios苹果+iPad分享

嗨,亲爱的游戏迷们!今天我要给你们种草一个超有趣的游戏——植物大战僵尸杂交版。这款游戏不仅继承了原有经典游戏的核心玩法,还加入了许多创新元素,让玩家能够体验到前所未有的乐趣。快来跟随我一起探索这个神奇的世界吧! 植物大战僵尸杂交版最新绿色版下载链接: https://pan.quark.cn/s/d60ed6e4791c 🔥 创新与经典的完美结合 植物大战僵尸杂交版在保持了原游戏经典玩

植物大战僵尸杂交版2.1版本终于来啦!游戏完全免费

在这个喧嚣的城市里,我找到了一片神奇的绿色世界——植物大战僵尸杂交版。它不仅是一款游戏,更像是一扇打开自然奥秘的窗户,让我重新认识了植物和自然的力量。 植物大战僵尸杂交版最新绿色版下载链接: https://pan.quark.cn/s/d60ed6e4791c 🌱 🔥 激情介绍:不只是游戏,更是生态课 植物大战僵尸杂交版将经典的策略塔防游戏带入了一个全新的维度。这里,每一种植物都拥

游戏高度可配置化(一)通用数据引擎(data-e)及其在模块化游戏开发中的应用构想图解

游戏高度可配置化(一)通用数据引擎(data-e)及其在模块化游戏开发中的应用构想图解 码客 卢益贵 ygluu 关键词:游戏策划 可配置化 模块化配置 数据引擎 条件系统 红点系统 一、前言 在插件式模块化软件开发当中,既要模块高度独立(解耦)又要共享模块数据,最好的方法是有个中间平台(中间件)提供标准的接口来进行数据的交换,这在很多行业软件开发中已经广泛应用。但是,由于中间件的抽象和封

力扣SQL50 游戏玩法分析 IV 子查询

Problem: 550. 游戏玩法分析 IV 👨‍🏫 参考题解 这个SQL查询的目的是计算每个玩家在登录后的第二天参与活动的比例。查询使用了子查询和左连接来实现这一目的。下面是查询的详细解释,包括每个部分的作用和注释: -- 计算每个玩家登录后第二天参与活动的比例select round(avg(a.event_date is not null), 2) as fractio

博弈论(Nim 游戏)

公平组合游戏ICG 若—个游戏满足: 由两名玩家交替行动;在游戏进程的任意时刻,可以执行的合法行动与轮到哪名玩家无关;不能行动的玩家判负; 则称该游戏为一个公平组合游戏。 NIM博弈属于公平组合游戏,但城建的棋类游戏,比如围棋,就不是公平组合游戏。因为围棋交战双方分别只能落黑子和白子,胜负判定也比较复杂,不满足条件 2 2 2 和条件 3 3 3。 可以看出,公平组合游戏不存在平局,而且

C语言 | Leetcode C语言题解之第174题地下城游戏

题目: 题解: int calculateMinimumHP(int** dungeon, int dungeonSize, int* dungeonColSize) {int n = dungeonSize, m = dungeonColSize[0];int dp[n + 1][m + 1];memset(dp, 0x3f, sizeof(dp));dp[n][m - 1] = dp[