当前位置: 首页 > news >正文

建设网站成本预算可以做语文阅读题的网站

建设网站成本预算,可以做语文阅读题的网站,网站优化的基本思想与原则,wordpress文章中显示打赏学习 Python 之 Pygame 开发坦克大战#xff08;三#xff09;坦克大战物体碰撞检测编写1. 实现敌方坦克与我方坦克间的碰撞2. 实现敌方坦克间的碰撞3. 实现玩家子弹与敌方坦克间的碰撞4. 实现敌方子弹与我方坦克间的碰撞 和 玩家复活5. 爆炸效果类6. 为子弹爆炸添加爆炸效果… 学习 Python 之 Pygame 开发坦克大战三坦克大战物体碰撞检测编写1. 实现敌方坦克与我方坦克间的碰撞2. 实现敌方坦克间的碰撞3. 实现玩家子弹与敌方坦克间的碰撞4. 实现敌方子弹与我方坦克间的碰撞 和 玩家复活5. 爆炸效果类6. 为子弹爆炸添加爆炸效果7. 为坦克爆炸添加爆炸效果完整的敌方坦克类代码完整的我方坦克类代码完整的主类代码完整的子弹类代码坦克大战物体碰撞检测编写 我的素材放到了百度网盘里里面还有原版坦克大战素材我都放在一起来我的素材是从原版改的各位小伙伴可以直接用或者自己改一下再用做出适合自己的素材 素材链接百度网盘 链接https://pan.baidu.com/s/19sCyH7rp37f6DzRj0iXDCA?pwdtkdz 提取码tkdz 那我们就继续编写坦克大战吧 1. 实现敌方坦克与我方坦克间的碰撞 由于已经完成了屏幕中出现敌方和我方坦克现在的问题就是如果我方坦克碰到了敌方坦克应该是走不动的即不能穿模 在敌方坦克类和我方坦克类中加入两个属性用来记录上一次的位置如果是你用的是继承那么在父类加入 # 碰撞前的坐标 self.prvX self.rect.left self.prvY self.rect.top修改我方坦克类move()函数 def move(self):if self.accumulation 1:self.accumulation 0# 记录上一次的位置self.prvX self.rect.leftself.prvY self.rect.topif self.direction LEFT:if self.rect.left 0:self.rect.left - self.speedelif self.direction UP:if self.rect.top 0:self.rect.top - self.speedelif self.direction DOWN:if self.rect.top 555:self.rect.top self.speedelif self.direction RIGHT:if self.rect.left 855:self.rect.left self.speedelse:self.accumulation 0.20修改敌方坦克类move()函数 def move(self):新增步数变量, 当坦克移动时, 步数进行减少, 当步数小于等于0的时候, 修改地方坦克的方向:return: Noneif self.stop:if self.step 0:self.direction self.randDirection()self.step 30else:if self.accumulationMax 1:self.accumulationMax 0# 记录上一次的位置self.prvX self.rect.leftself.prvY self.rect.topif self.direction LEFT:if self.rect.left 0:self.rect.left - self.speedelif self.direction UP:if self.rect.top 0:self.rect.top - self.speedelif self.direction DOWN:if self.rect.top 555:self.rect.top self.speedelif self.direction RIGHT:if self.rect.left 855:self.rect.left self.speedself.step - 1else:self.accumulationMax self.accumulation加入碰撞检测函数 在两个类中都加入 pygame.sprite.collide_rect()函数用来检测物体碰撞该物体必须继承pygame.sprite.Sprite类 def collideEnemyTank(self, enemyTankList):# 遍历全部敌方坦克检查有没有碰撞for enemyTank in enemyTankList:if pygame.sprite.collide_rect(self, enemyTank):# 如果碰撞了就保持原来的位置self.rect.left self.prvXself.rect.top self.prvYdef collidePlayerTank(self, playerTank):# 遍历全部敌方坦克检查有没有碰撞if pygame.sprite.collide_rect(self, playerTank):# 如果碰撞了就保持原来的位置self.rect.left self.prvXself.rect.top self.prvY在坦克移动下面调用该函数 while 1:# 设置背景颜色MainGame.window.fill(BACKGROUND_COLOR)# 获取窗口事件self.getPlayingModeEvent()# 显示我方坦克MainGame.playerTank.draw(MainGame.window)# 我方坦克移动if not MainGame.playerTank.stop:MainGame.playerTank.move()MainGame.playerTank.collideEnemyTank(MainGame.enemyTankList)# 显示我方坦克子弹self.drawPlayerBullet(MainGame.playerBulletList)# 展示敌方坦克self.drawEnemyTank()# 展示敌方坦克子弹self.drawEnemyBullet()# 更新窗口pygame.display.update()# 遍历坦克列表展示坦克并且移动 for tank in MainGame.enemyTankList:# 坦克还有生命值if tank.life 0:tank.draw(MainGame.window)tank.move()tank.collidePlayerTank(MainGame.playerTank)bullet tank.shot()if bullet is not None:MainGame.enemyTankBulletList.append(bullet)# 坦克生命值为0就从列表中剔除else:MainGame.enemyTankCurrentCount - 1MainGame.enemyTankList.remove(tank)完整的我方坦克代码 import pygame as pg import pygame.image from ParentObject import ParentObject from Teach.Bullet import Bulletclass PlayerTank(ParentObject):def __init__(self, x, y, order, amour)::param x: 坦克横坐标:param y: 坦克纵坐标:param order: 玩家坦克序号1表示一号玩家2表示二号玩家:param amour: 坦克初始护甲super().__init__()self.images []if order 1:self.images.append({UP: pygame.image.load(../Image/Player1/45x45/UP1.png),DOWN: pygame.image.load(../Image/Player1/45x45/DOWN1.png),LEFT: pygame.image.load(../Image/Player1/45x45/LEFT1.png),RIGHT: pygame.image.load(../Image/Player1/45x45/RIGHT1.png)})self.images.append({UP: pygame.image.load(../Image/Player1/45x45/UP2.png),DOWN: pygame.image.load(../Image/Player1/45x45/DOWN2.png),LEFT: pygame.image.load(../Image/Player1/45x45/LEFT2.png),RIGHT: pygame.image.load(../Image/Player1/45x45/RIGHT2.png)})self.images.append({UP: pygame.image.load(../Image/Player1/45x45/UP3.png),DOWN: pygame.image.load(../Image/Player1/45x45/DOWN3.png),LEFT: pygame.image.load(../Image/Player1/45x45/LEFT3.png),RIGHT: pygame.image.load(../Image/Player1/45x45/RIGHT3.png)})self.images.append({UP: pygame.image.load(../Image/Player1/45x45/UP4.png),DOWN: pygame.image.load(../Image/Player1/45x45/DOWN4.png),LEFT: pygame.image.load(../Image/Player1/45x45/LEFT4.png),RIGHT: pygame.image.load(../Image/Player1/45x45/RIGHT4.png)})self.images.append({UP: pygame.image.load(../Image/Player1/45x45/UP5.png),DOWN: pygame.image.load(../Image/Player1/45x45/DOWN5.png),LEFT: pygame.image.load(../Image/Player1/45x45/LEFT5.png),RIGHT: pygame.image.load(../Image/Player1/45x45/RIGHT5.png)})self.images.append({UP: pygame.image.load(../Image/Player1/45x45/UP6.png),DOWN: pygame.image.load(../Image/Player1/45x45/DOWN6.png),LEFT: pygame.image.load(../Image/Player1/45x45/LEFT6.png),RIGHT: pygame.image.load(../Image/Player1/45x45/RIGHT6.png)})# 生命self.life 3# 装甲self.armor amour# 方向self.direction UP# 根据护甲选择坦克的样子self.image: pg.Surface self.images[max(self.armor - 1, 0)][self.direction]self.rect self.image.get_rect()self.rect.left xself.rect.top y# 速度self.accumulation: float 0self.speed 2# 移动开关self.stop True# 重生self.isResurrecting False# 碰撞前的坐标self.prvX self.rect.leftself.prvY self.rect.top# 等级self.level 1# 伤害self.damage 1def move(self):if self.accumulation 1:self.accumulation 0# 记录上一次的位置self.prvX self.rect.leftself.prvY self.rect.topif self.direction LEFT:if self.rect.left 0:self.rect.left - self.speedelif self.direction UP:if self.rect.top 0:self.rect.top - self.speedelif self.direction DOWN:if self.rect.top 555:self.rect.top self.speedelif self.direction RIGHT:if self.rect.left 855:self.rect.left self.speedelse:self.accumulation 0.20def shot(self):return Bullet(self)def draw(self, window):# 坦克生命中为0表示已经死亡不再展示坦克if self.life 0:return# 获取展示的对象self.image self.images[max(self.armor - 1, 0)][self.direction]# 画出图片window.blit(self.image, self.rect)def collideEnemyTank(self, enemyTankList):# 遍历全部敌方坦克检查有没有碰撞for enemyTank in enemyTankList:if pygame.sprite.collide_rect(self, enemyTank):# 如果碰撞了就保持原来的位置self.rect.left self.prvXself.rect.top self.prvY 完整的敌方坦克代码 import random import pygame import pygame.imagefrom ParentObject import ParentObject from Bullet import Bulletclass EnemyTank(ParentObject):def __init__(self, x, y):super().__init__()types [(1, 3), (2, 1), (3, 2), (4, 10)]# 随机产生一种坦克self.type types[random.randint(0, len(types) - 1)]up []down []left []right []for i in range(1, self.type[1] 1):up.append(pygame.image.load(../Image/Enemy/EnemyTank str(self.type[0]) /EnemyTank str(self.type[0]) Lv str(i) (UP).png))down.append(pygame.image.load(../Image/Enemy/EnemyTank str(self.type[0]) /EnemyTank str(self.type[0]) Lv str(i) (DOWN).png))left.append(pygame.image.load(../Image/Enemy/EnemyTank str(self.type[0]) /EnemyTank str(self.type[0]) Lv str(i) (LEFT).png))right.append(pygame.image.load(../Image/Enemy/EnemyTank str(self.type[0]) /EnemyTank str(self.type[0]) Lv str(i) (RIGHT).png))self.images {UP: up,DOWN: down,LEFT: left,RIGHT: right}# 生命self.life self.type[1]# 方向self.direction DOWNself.image: pygame.Surface self.images[self.direction][self.life - 1]self.rect self.image.get_rect()self.rect.left xself.rect.top y# 碰撞前的坐标self.prvX self.rect.leftself.prvY self.rect.top# 速度self.accumulationMax: float 0self.accumulation 0.1speed 0maxBulletCount 0damage 1# 每种坦克都有不同的属性if self.type[0] 1:speed 3self.level 1maxBulletCount 1elif self.type[0] 2:speed 5self.level 2maxBulletCount 1damage 3elif self.type[0] 3:speed 7self.level 1maxBulletCount 3damage 2elif self.type[0] 4:speed 6self.level 2maxBulletCount 3damage 1self.speed speed# 移动开关self.stop True# 开火开关self.fire True# 步数self.step 30# 伤害self.damage damage# 子弹个数self.bulletCount 0self.maxBulletCount maxBulletCountdef loseLife(self, value 1):self.life - valuedef move(self):新增步数变量, 当坦克移动时, 步数进行减少, 当步数小于等于0的时候, 修改地方坦克的方向:return: Noneif self.stop:if self.step 0:self.direction self.randDirection()self.step 30else:if self.accumulationMax 1:self.accumulationMax 0# 记录上一次的位置self.prvX self.rect.leftself.prvY self.rect.topif self.direction LEFT:if self.rect.left 0:self.rect.left - self.speedelif self.direction UP:if self.rect.top 0:self.rect.top - self.speedelif self.direction DOWN:if self.rect.top 555:self.rect.top self.speedelif self.direction RIGHT:if self.rect.left 855:self.rect.left self.speedself.step - 1else:self.accumulationMax self.accumulationdef shot(self):if self.fire:if self.bulletCount self.maxBulletCount:num random.randint(0, 100)if num 5 or num 6:self.bulletCount 1return Bullet(self)return Nonedef draw(self, window):# 获取展示的对象self.image self.images[self.direction][self.life - 1]window.blit(self.image, self.rect)def randDirection(self):directions [UP, DOWN, LEFT, RIGHT]index random.randint(0, 3)return directions[index]def collidePlayerTank(self, playerTank):# 遍历全部敌方坦克检查有没有碰撞if pygame.sprite.collide_rect(self, playerTank):# 如果碰撞了就保持原来的位置self.rect.left self.prvXself.rect.top self.prvY完整的主类代码 import pygame import sysfrom PlayerTank import PlayerTank from EnemyTank import EnemyTankSCREEN_WIDTH 1100 SCREEN_HEIGHT 600 BACKGROUND_COLOR pygame.Color(0, 0, 0) FONT_COLOR (255, 255, 255) PLAYER_TANK_POSITION (325, 550)class MainGame:# 窗口Surface对象window None# 玩家坦克playerTank None# 玩家子弹playerBulletList []playerBulletNumber 3# 敌人坦克enemyTankList []enemyTankTotalCount 5# 用来给玩家展示坦克的数量enemyTankCurrentCount 5# 敌人坦克子弹enemyTankBulletList []def __init__(self):passdef startGame(self):# 初始化展示模块pygame.display.init()# 设置窗口大小size (SCREEN_WIDTH, SCREEN_HEIGHT)# 初始化窗口MainGame.window pygame.display.set_mode(size)# 设置窗口标题pygame.display.set_caption(Tank Battle)# 初始化我方坦克MainGame.playerTank PlayerTank(PLAYER_TANK_POSITION[0], PLAYER_TANK_POSITION[1], 1, 1)while 1:# 设置背景颜色MainGame.window.fill(BACKGROUND_COLOR)# 获取窗口事件self.getPlayingModeEvent()# 展示敌方坦克self.drawEnemyTank()# 显示我方坦克MainGame.playerTank.draw(MainGame.window)# 我方坦克移动if not MainGame.playerTank.stop:MainGame.playerTank.move()MainGame.playerTank.collideEnemyTank(MainGame.enemyTankList)# 显示我方坦克子弹self.drawPlayerBullet(MainGame.playerBulletList)# 展示敌方坦克子弹self.drawEnemyBullet()# 更新窗口pygame.display.update()def getPlayingModeEvent(self):# 获取所有事件eventList pygame.event.get()for event in eventList:if event.type pygame.QUIT:sys.exit()stop属性用来控制坦克移动当键盘按键按下时坦克可以移动一直按住一直移动当按键抬起时停止移动如果没有该属性按一下按键移动一次按一下移动一下不能一直按住一直移动if event.type pygame.KEYDOWN:if event.key pygame.K_w:MainGame.playerTank.direction UPMainGame.playerTank.stop Falseelif event.key pygame.K_s:MainGame.playerTank.direction DOWNMainGame.playerTank.stop Falseelif event.key pygame.K_a:MainGame.playerTank.direction LEFTMainGame.playerTank.stop Falseelif event.key pygame.K_d:MainGame.playerTank.direction RIGHTMainGame.playerTank.stop Falseelif event.key pygame.K_j:# 判断子弹数量是否超过指定的个数if len(MainGame.playerBulletList) MainGame.playerBulletNumber:bullet MainGame.playerTank.shot()MainGame.playerBulletList.append(bullet)if event.type pygame.KEYUP:if event.key pygame.K_w:MainGame.playerTank.stop Trueelif event.key pygame.K_s:MainGame.playerTank.stop Trueelif event.key pygame.K_a:MainGame.playerTank.stop Trueelif event.key pygame.K_d:MainGame.playerTank.stop Truedef drawPlayerBullet(self, playerBulletList):# 遍历整个子弹列表如果是没有被销毁的状态就把子弹显示出来否则从列表中删除for bullet in playerBulletList:if not bullet.isDestroy:bullet.draw(MainGame.window)bullet.move()else:playerBulletList.remove(bullet)def drawEnemyTank(self):# 如果当前坦克为0那么就该重新生成坦克if len(MainGame.enemyTankList) 0:# 一次性产生三个如果剩余坦克数量超过三那只能产生三个n min(3, MainGame.enemyTankTotalCount)# 如果最小是0就说明敌人坦克没有了那么就赢了if n 0:print(赢了)return# 没有赢的话就产生n个坦克self.initEnemyTank(n)# 总个数减去产生的个数MainGame.enemyTankTotalCount - n# 遍历坦克列表展示坦克并且移动for tank in MainGame.enemyTankList:# 坦克还有生命值if tank.life 0:tank.draw(MainGame.window)tank.move()tank.collidePlayerTank(MainGame.playerTank)bullet tank.shot()if bullet is not None:MainGame.enemyTankBulletList.append(bullet)# 坦克生命值为0就从列表中剔除else:MainGame.enemyTankCurrentCount - 1MainGame.enemyTankList.remove(tank)def initEnemyTank(self, number):y 0position [0, 425, 850]index 0for i in range(number):x position[index]enemyTank EnemyTank(x, y)MainGame.enemyTankList.append(enemyTank)index 1def drawEnemyBullet(self):for bullet in MainGame.enemyTankBulletList:if not bullet.isDestroy:bullet.draw(MainGame.window)bullet.move()else:bullet.source.bulletCount - 1MainGame.enemyTankBulletList.remove(bullet)if __name__ __main__:MainGame().startGame() 运行一下看看结果 2. 实现敌方坦克间的碰撞 敌方坦克与敌方坦克也是不能穿模的需要实现一下 这个的代码跟上面的差不多 在敌方坦克类中添加敌方坦克间碰撞检测函数 def collideEnemyTank(self, enemyTankList):for tank in enemyTankList:if pygame.sprite.collide_rect(self, tank) and tank ! self:self.rect.left self.prvXself.rect.top self.prvY在主类中的drawEnemyTank()函数中调用 # 遍历坦克列表展示坦克并且移动 for tank in MainGame.enemyTankList:# 坦克还有生命值if tank.life 0:tank.draw(MainGame.window)tank.move()tank.collidePlayerTank(MainGame.playerTank)tank.collideEnemyTank(MainGame.enemyTankList)bullet tank.shot()if bullet is not None:MainGame.enemyTankBulletList.append(bullet)# 坦克生命值为0就从列表中剔除else:MainGame.enemyTankCurrentCount - 1MainGame.enemyTankList.remove(tank)完整的drawEnemyTank()函数 def drawEnemyTank(self):# 如果当前坦克为0那么就该重新生成坦克if len(MainGame.enemyTankList) 0:# 一次性产生三个如果剩余坦克数量超过三那只能产生三个n min(3, MainGame.enemyTankTotalCount)# 如果最小是0就说明敌人坦克没有了那么就赢了if n 0:print(赢了)return# 没有赢的话就产生n个坦克self.initEnemyTank(n)# 总个数减去产生的个数MainGame.enemyTankTotalCount - n# 遍历坦克列表展示坦克并且移动for tank in MainGame.enemyTankList:# 坦克还有生命值if tank.life 0:tank.draw(MainGame.window)tank.move()tank.collidePlayerTank(MainGame.playerTank)tank.collideEnemyTank(MainGame.enemyTankList)bullet tank.shot()if bullet is not None:MainGame.enemyTankBulletList.append(bullet)# 坦克生命值为0就从列表中剔除else:MainGame.enemyTankCurrentCount - 1MainGame.enemyTankList.remove(tank)运行一下看看结果 发现实现啦 3. 实现玩家子弹与敌方坦克间的碰撞 在两个坦克类中增加生命值减少函数默认情况下每次减少一点生命值 def loseLife(self, value 1):self.life - value在子弹类中增加碰撞检测函数 def playerBulletCollideEnemyTank(self, enemyTankList):# 循环遍历坦克列表检查是否发生了碰撞for tank in enemyTankList:if pygame.sprite.collide_rect(tank, self):# 坦克被击中就扣减生命值tank.loseLife(self.damage)# 把子弹设置为销毁状态self.isDestroy True在drawPlayerBullet()函数中调用 def drawPlayerBullet(self, playerBulletList):# 遍历整个子弹列表如果是没有被销毁的状态就把子弹显示出来否则从列表中删除for bullet in playerBulletList:if not bullet.isDestroy:bullet.draw(MainGame.window)bullet.move()bullet.playerBulletCollideEnemyTank(MainGame.enemyTankList)else:playerBulletList.remove(bullet)运行一下我们就可以看到击中敌方坦克时敌方坦克会变色因为生命值发生了变化 4. 实现敌方子弹与我方坦克间的碰撞 和 玩家复活 首先我们要考虑到当玩家生命值不为0时被击中了需要在出生的复活此时需要给玩家坦克类添加一个属性用来判断此时玩家是否要复活 # 重生 self.isResurrecting False在子弹类中增加碰撞检测函数 def enemyBulletCollidePlayerTank(self, playerTank):# 玩家坦克生命值为0不用检测if playerTank.life 0:return# 检测是否发生碰撞if pygame.sprite.collide_rect(playerTank, self):# 发生碰撞先减少护甲护甲为0时扣减生命值if playerTank.armor 0:playerTank.armor - self.damageplayerTank.armor max(0, playerTank.armor)else:playerTank.loseLife(self.damage)playerTank.life max(0, playerTank.life)if playerTank.life ! 0:playerTank.isResurrecting True# 让子弹销毁self.isDestroy True在drawEnemyBullet()函数中调用 def drawEnemyBullet(self):for bullet in MainGame.enemyTankBulletList:if not bullet.isDestroy:bullet.draw(MainGame.window)bullet.move()bullet.enemyBulletCollidePlayerTank(MainGame.playerTank)else:bullet.source.bulletCount - 1MainGame.enemyTankBulletList.remove(bullet)修改我方坦克类的draw()函数 def draw(self, window, x, y):# 坦克生命中为0表示已经死亡不再展示坦克if self.life 0:return# 判断坦克是否复合if self.isResurrecting:# 把坦克位置设置为指定的重生位置self.rect.left xself.rect.top yself.isResurrecting Falseself.direction UP# 获取展示的对象self.image self.images[max(self.armor - 1, 0)][self.direction]# 画出图片window.blit(self.image, self.rect)在while循环中修改draw()函数参数 # 显示我方坦克 MainGame.playerTank.draw(MainGame.window, PLAYER_TANK_POSITION[0], PLAYER_TANK_POSITION[1])测试一下看看能不能实现玩家死亡 5. 爆炸效果类 现在敌方坦克和我方坦克都可以被消灭了但是消灭的效果不是很好下面增加一个爆炸效果类更好地看到坦克被消灭 import pygame.imageclass Explode:def __init__(self, object, size):# 获取爆炸对象的位置self.rect object.rectself.images []self.images.append([pygame.image.load(../Image/Explode/Explode50x50.png),pygame.image.load(../Image/Explode/Explode50x50.png),pygame.image.load(../Image/Explode/Explode50x50.png),pygame.image.load(../Image/Explode/Explode50x50.png),pygame.image.load(../Image/Explode/Explode50x50.png)])self.images.append([pygame.image.load(../Image/Explode/Explode25x25.png),pygame.image.load(../Image/Explode/Explode25x25.png),pygame.image.load(../Image/Explode/Explode25x25.png),pygame.image.load(../Image/Explode/Explode25x25.png),pygame.image.load(../Image/Explode/Explode25x25.png)])self.mode 0if size 25:self.mode 1self.index 0self.image self.images[self.mode][self.index]self.isDestroy Falsedef draw(self, window):pass这里我分为了两种爆炸效果它们的烦恼不同即爆炸效果的图片大小不一样为了让爆炸效果能看到而不是一闪而过我让图片加载五次 修改draw()函数 def draw(self, window):# 根据索引获取爆炸对象, 添加到主窗口# 让图像加载五次这里可以换成五张大小不一样的爆炸图片可以实现让爆炸效果从小变大的效果if self.index len(self.images):self.image self.images[self.mode][self.index]self.index 1window.blit(self.image, self.rect)else:self.isDestroy Trueself.index 0在主类中添加爆炸列表 class MainGame:...# 爆炸列表explodeList []...在主类中增加显示爆炸效果函数 def drawExplode(self):for e in MainGame.explodeList:if e.isDestroy:MainGame.explodeList.remove(e)else:e.draw(MainGame.window)在while循环中调用drawExplode() while 1:# 设置背景颜色MainGame.window.fill(BACKGROUND_COLOR)# 获取窗口事件self.getPlayingModeEvent()# 展示敌方坦克self.drawEnemyTank()# 显示我方坦克MainGame.playerTank.draw(MainGame.window, PLAYER_TANK_POSITION[0], PLAYER_TANK_POSITION[1])# 我方坦克移动if not MainGame.playerTank.stop:MainGame.playerTank.move()MainGame.playerTank.collideEnemyTank(MainGame.enemyTankList)# 显示我方坦克子弹self.drawPlayerBullet(MainGame.playerBulletList)# 展示敌方坦克子弹self.drawEnemyBullet()# 展示爆炸效果self.drawExplode()# 更新窗口pygame.display.update()6. 为子弹爆炸添加爆炸效果 子弹爆炸添加爆炸效果 修改子弹类的move()函数 def move(self, explodeList):if self.accumulation 1:self.accumulation 0if self.direction LEFT:self.rect.left - self.speedelif self.direction UP:self.rect.top - self.speedelif self.direction DOWN:self.rect.top self.speedelif self.direction RIGHT:self.rect.left self.speed# 检查子弹是否出界self.checkBullet(explodeList)else:self.accumulation 0.20def checkBullet(self, explodeList):toDestroy False# 如果出界就设置为销毁if self.rect.top 0 or self.rect.top 600:toDestroy Trueif self.rect.left 0 or self.rect.right 900:toDestroy Trueif toDestroy:explode Explode(self, 25)explodeList.append(explode)self.isDestroy True此时如果子弹击中边界就会出现爆炸效果 修改调用处 def drawPlayerBullet(self, playerBulletList):# 遍历整个子弹列表如果是没有被销毁的状态就把子弹显示出来否则从列表中删除for bullet in playerBulletList:if not bullet.isDestroy:bullet.draw(MainGame.window)bullet.move(MainGame.explodeList)bullet.playerBulletCollideEnemyTank(MainGame.enemyTankList)else:playerBulletList.remove(bullet)def drawEnemyBullet(self):for bullet in MainGame.enemyTankBulletList:if not bullet.isDestroy:bullet.draw(MainGame.window)bullet.move(MainGame.explodeList)bullet.enemyBulletCollidePlayerTank(MainGame.playerTank)else:bullet.source.bulletCount - 1MainGame.enemyTankBulletList.remove(bullet)试一试效果看看子弹出界有没有爆炸效果 7. 为坦克爆炸添加爆炸效果 修改 子弹类中 playerBulletCollideEnemyTank() 函数和 enemyBulletCollidePlayerTank() 函数 def playerBulletCollideEnemyTank(self, enemyTankList, explodeList):# 循环遍历坦克列表检查是否发生了碰撞for tank in enemyTankList:if pygame.sprite.collide_rect(tank, self):tank.loseLife(self.damage)# 把子弹设置为销毁状态self.isDestroy Trueif tank.life 0:# 增加爆炸效果explode Explode(tank, 50)explodeList.append(explode)def enemyBulletCollidePlayerTank(self, playerTank, explodeList):# 玩家坦克生命值为0不用检测if playerTank.life 0:return# 检测是否发生碰撞if pygame.sprite.collide_rect(playerTank, self):# 发生碰撞先减少护甲护甲为0时扣减生命值if playerTank.armor 0:playerTank.armor - self.damageplayerTank.armor max(0, playerTank.armor)else:playerTank.loseLife(self.damage)# 增加爆炸效果explode Explode(playerTank, 50)explodeList.append(explode)playerTank.life max(0, playerTank.life)if playerTank.life ! 0:playerTank.isResurrecting True# 让子弹销毁self.isDestroy True修改调用处 def drawPlayerBullet(self, playerBulletList):# 遍历整个子弹列表如果是没有被销毁的状态就把子弹显示出来否则从列表中删除for bullet in playerBulletList:if not bullet.isDestroy:bullet.draw(MainGame.window)bullet.move(MainGame.explodeList)bullet.playerBulletCollideEnemyTank(MainGame.enemyTankList, MainGame.explodeList)else:playerBulletList.remove(bullet)def drawEnemyBullet(self):for bullet in MainGame.enemyTankBulletList:if not bullet.isDestroy:bullet.draw(MainGame.window)bullet.move(MainGame.explodeList)bullet.enemyBulletCollidePlayerTank(MainGame.playerTank, MainGame.explodeList)else:bullet.source.bulletCount - 1MainGame.enemyTankBulletList.remove(bullet)完整的敌方坦克类代码 import random import pygame import pygame.imagefrom ParentObject import ParentObject from Bullet import Bulletclass EnemyTank(ParentObject):def __init__(self, x, y):super().__init__()types [(1, 3), (2, 1), (3, 2), (4, 10)]# 随机产生一种坦克self.type types[random.randint(0, len(types) - 1)]up []down []left []right []for i in range(1, self.type[1] 1):up.append(pygame.image.load(../Image/Enemy/EnemyTank str(self.type[0]) /EnemyTank str(self.type[0]) Lv str(i) (UP).png))down.append(pygame.image.load(../Image/Enemy/EnemyTank str(self.type[0]) /EnemyTank str(self.type[0]) Lv str(i) (DOWN).png))left.append(pygame.image.load(../Image/Enemy/EnemyTank str(self.type[0]) /EnemyTank str(self.type[0]) Lv str(i) (LEFT).png))right.append(pygame.image.load(../Image/Enemy/EnemyTank str(self.type[0]) /EnemyTank str(self.type[0]) Lv str(i) (RIGHT).png))self.images {UP: up,DOWN: down,LEFT: left,RIGHT: right}# 生命self.life self.type[1]# 方向self.direction DOWNself.image: pygame.Surface self.images[self.direction][self.life - 1]self.rect self.image.get_rect()self.rect.left xself.rect.top y# 碰撞前的坐标self.prvX self.rect.leftself.prvY self.rect.top# 速度self.accumulationMax: float 0self.accumulation 0.1speed 0maxBulletCount 0damage 1# 每种坦克都有不同的属性if self.type[0] 1:speed 3self.level 1maxBulletCount 1elif self.type[0] 2:speed 5self.level 2maxBulletCount 1damage 3elif self.type[0] 3:speed 7self.level 1maxBulletCount 3damage 2elif self.type[0] 4:speed 6self.level 2maxBulletCount 3damage 1self.speed speed# 移动开关self.stop False# 开火开关self.fire False# 步数self.step 30# 伤害self.damage damage# 子弹个数self.bulletCount 0self.maxBulletCount maxBulletCountdef loseLife(self, value 1):self.life - valuedef move(self):新增步数变量, 当坦克移动时, 步数进行减少, 当步数小于等于0的时候, 修改地方坦克的方向:return: Noneif self.stop:if self.step 0:self.direction self.randDirection()self.step 30else:if self.accumulationMax 1:self.accumulationMax 0# 记录上一次的位置self.prvX self.rect.leftself.prvY self.rect.topif self.direction LEFT:if self.rect.left 0:self.rect.left - self.speedelif self.direction UP:if self.rect.top 0:self.rect.top - self.speedelif self.direction DOWN:if self.rect.top 555:self.rect.top self.speedelif self.direction RIGHT:if self.rect.left 855:self.rect.left self.speedself.step - 1else:self.accumulationMax self.accumulationdef shot(self):if self.fire:if self.bulletCount self.maxBulletCount:num random.randint(0, 100)if num 5 or num 6:self.bulletCount 1return Bullet(self)return Nonedef draw(self, window):# 获取展示的对象self.image self.images[self.direction][self.life - 1]window.blit(self.image, self.rect)def randDirection(self):directions [UP, DOWN, LEFT, RIGHT]index random.randint(0, 3)return directions[index]def collidePlayerTank(self, playerTank):# 遍历全部敌方坦克检查有没有碰撞if pygame.sprite.collide_rect(self, playerTank):# 如果碰撞了就保持原来的位置self.rect.left self.prvXself.rect.top self.prvYdef collideEnemyTank(self, enemyTankList):for tank in enemyTankList:if pygame.sprite.collide_rect(self, tank) and tank ! self:self.rect.left self.prvXself.rect.top self.prvY完整的我方坦克类代码 import pygame import pygame.image from ParentObject import ParentObject from Bullet import Bulletclass PlayerTank(ParentObject):def __init__(self, x, y, order, amour)::param x: 坦克横坐标:param y: 坦克纵坐标:param order: 玩家坦克序号1表示一号玩家2表示二号玩家:param amour: 坦克初始护甲super().__init__()self.images []if order 1:self.images.append({UP: pygame.image.load(../Image/Player1/45x45/UP1.png),DOWN: pygame.image.load(../Image/Player1/45x45/DOWN1.png),LEFT: pygame.image.load(../Image/Player1/45x45/LEFT1.png),RIGHT: pygame.image.load(../Image/Player1/45x45/RIGHT1.png)})self.images.append({UP: pygame.image.load(../Image/Player1/45x45/UP2.png),DOWN: pygame.image.load(../Image/Player1/45x45/DOWN2.png),LEFT: pygame.image.load(../Image/Player1/45x45/LEFT2.png),RIGHT: pygame.image.load(../Image/Player1/45x45/RIGHT2.png)})self.images.append({UP: pygame.image.load(../Image/Player1/45x45/UP3.png),DOWN: pygame.image.load(../Image/Player1/45x45/DOWN3.png),LEFT: pygame.image.load(../Image/Player1/45x45/LEFT3.png),RIGHT: pygame.image.load(../Image/Player1/45x45/RIGHT3.png)})self.images.append({UP: pygame.image.load(../Image/Player1/45x45/UP4.png),DOWN: pygame.image.load(../Image/Player1/45x45/DOWN4.png),LEFT: pygame.image.load(../Image/Player1/45x45/LEFT4.png),RIGHT: pygame.image.load(../Image/Player1/45x45/RIGHT4.png)})self.images.append({UP: pygame.image.load(../Image/Player1/45x45/UP5.png),DOWN: pygame.image.load(../Image/Player1/45x45/DOWN5.png),LEFT: pygame.image.load(../Image/Player1/45x45/LEFT5.png),RIGHT: pygame.image.load(../Image/Player1/45x45/RIGHT5.png)})self.images.append({UP: pygame.image.load(../Image/Player1/45x45/UP6.png),DOWN: pygame.image.load(../Image/Player1/45x45/DOWN6.png),LEFT: pygame.image.load(../Image/Player1/45x45/LEFT6.png),RIGHT: pygame.image.load(../Image/Player1/45x45/RIGHT6.png)})# 生命self.life 3# 装甲self.armor amour# 方向self.direction UP# 根据护甲选择坦克的样子self.image: pygame.Surface self.images[max(self.armor - 1, 0)][self.direction]self.rect self.image.get_rect()self.rect.left xself.rect.top y# 速度self.accumulation: float 0self.speed 2# 移动开关self.stop True# 重生self.isResurrecting False# 碰撞前的坐标self.prvX self.rect.leftself.prvY self.rect.top# 等级self.level 1# 伤害self.damage 1def move(self):if self.accumulation 1:self.accumulation 0# 记录上一次的位置self.prvX self.rect.leftself.prvY self.rect.topif self.direction LEFT:if self.rect.left 0:self.rect.left - self.speedelif self.direction UP:if self.rect.top 0:self.rect.top - self.speedelif self.direction DOWN:if self.rect.top 555:self.rect.top self.speedelif self.direction RIGHT:if self.rect.left 855:self.rect.left self.speedelse:self.accumulation 0.20def shot(self):return Bullet(self)def draw(self, window, x, y):# 坦克生命中为0表示已经死亡不再展示坦克if self.life 0:return# 判断坦克是否复合if self.isResurrecting:# 把坦克位置设置为指定的重生位置self.rect.left xself.rect.top yself.isResurrecting Falseself.direction UP# 获取展示的对象self.image self.images[max(self.armor - 1, 0)][self.direction]# 画出图片window.blit(self.image, self.rect)def collideEnemyTank(self, enemyTankList):# 遍历全部敌方坦克检查有没有碰撞for enemyTank in enemyTankList:if pygame.sprite.collide_rect(self, enemyTank):# 如果碰撞了就保持原来的位置self.rect.left self.prvXself.rect.top self.prvYdef loseLife(self, value 1):self.life - value 完整的主类代码 import pygame import sysfrom PlayerTank import PlayerTank from EnemyTank import EnemyTankSCREEN_WIDTH 1100 SCREEN_HEIGHT 600 BACKGROUND_COLOR pygame.Color(0, 0, 0) FONT_COLOR (255, 255, 255) PLAYER_TANK_POSITION (325, 550)class MainGame:# 窗口Surface对象window None# 玩家坦克playerTank None# 玩家子弹playerBulletList []playerBulletNumber 3# 敌人坦克enemyTankList []enemyTankTotalCount 5# 用来给玩家展示坦克的数量enemyTankCurrentCount 5# 敌人坦克子弹enemyTankBulletList []# 爆炸列表explodeList []def __init__(self):passdef startGame(self):# 初始化展示模块pygame.display.init()# 设置窗口大小size (SCREEN_WIDTH, SCREEN_HEIGHT)# 初始化窗口MainGame.window pygame.display.set_mode(size)# 设置窗口标题pygame.display.set_caption(Tank Battle)# 初始化我方坦克MainGame.playerTank PlayerTank(PLAYER_TANK_POSITION[0], PLAYER_TANK_POSITION[1], 1, 1)while 1:# 设置背景颜色MainGame.window.fill(BACKGROUND_COLOR)# 获取窗口事件self.getPlayingModeEvent()# 展示敌方坦克self.drawEnemyTank()# 显示我方坦克MainGame.playerTank.draw(MainGame.window, PLAYER_TANK_POSITION[0], PLAYER_TANK_POSITION[1])# 我方坦克移动if not MainGame.playerTank.stop:MainGame.playerTank.move()MainGame.playerTank.collideEnemyTank(MainGame.enemyTankList)# 显示我方坦克子弹self.drawPlayerBullet(MainGame.playerBulletList)# 展示敌方坦克子弹self.drawEnemyBullet()# 展示爆炸效果self.drawExplode()# 更新窗口pygame.display.update()def getPlayingModeEvent(self):# 获取所有事件eventList pygame.event.get()for event in eventList:if event.type pygame.QUIT:sys.exit()stop属性用来控制坦克移动当键盘按键按下时坦克可以移动一直按住一直移动当按键抬起时停止移动如果没有该属性按一下按键移动一次按一下移动一下不能一直按住一直移动if event.type pygame.KEYDOWN:if event.key pygame.K_w:MainGame.playerTank.direction UPMainGame.playerTank.stop Falseelif event.key pygame.K_s:MainGame.playerTank.direction DOWNMainGame.playerTank.stop Falseelif event.key pygame.K_a:MainGame.playerTank.direction LEFTMainGame.playerTank.stop Falseelif event.key pygame.K_d:MainGame.playerTank.direction RIGHTMainGame.playerTank.stop Falseelif event.key pygame.K_j:# 判断子弹数量是否超过指定的个数if len(MainGame.playerBulletList) MainGame.playerBulletNumber:bullet MainGame.playerTank.shot()MainGame.playerBulletList.append(bullet)if event.type pygame.KEYUP:if event.key pygame.K_w:MainGame.playerTank.stop Trueelif event.key pygame.K_s:MainGame.playerTank.stop Trueelif event.key pygame.K_a:MainGame.playerTank.stop Trueelif event.key pygame.K_d:MainGame.playerTank.stop Truedef drawPlayerBullet(self, playerBulletList):# 遍历整个子弹列表如果是没有被销毁的状态就把子弹显示出来否则从列表中删除for bullet in playerBulletList:if not bullet.isDestroy:bullet.draw(MainGame.window)bullet.move(MainGame.explodeList)bullet.playerBulletCollideEnemyTank(MainGame.enemyTankList, MainGame.explodeList)else:playerBulletList.remove(bullet)def drawEnemyTank(self):# 如果当前坦克为0那么就该重新生成坦克if len(MainGame.enemyTankList) 0:# 一次性产生三个如果剩余坦克数量超过三那只能产生三个n min(3, MainGame.enemyTankTotalCount)# 如果最小是0就说明敌人坦克没有了那么就赢了if n 0:print(赢了)return# 没有赢的话就产生n个坦克self.initEnemyTank(n)# 总个数减去产生的个数MainGame.enemyTankTotalCount - n# 遍历坦克列表展示坦克并且移动for tank in MainGame.enemyTankList:# 坦克还有生命值if tank.life 0:tank.draw(MainGame.window)tank.move()tank.collidePlayerTank(MainGame.playerTank)tank.collideEnemyTank(MainGame.enemyTankList)bullet tank.shot()if bullet is not None:MainGame.enemyTankBulletList.append(bullet)# 坦克生命值为0就从列表中剔除else:MainGame.enemyTankCurrentCount - 1MainGame.enemyTankList.remove(tank)def initEnemyTank(self, number):y 0position [0, 425, 850]index 0for i in range(number):x position[index]enemyTank EnemyTank(x, y)MainGame.enemyTankList.append(enemyTank)index 1def drawEnemyBullet(self):for bullet in MainGame.enemyTankBulletList:if not bullet.isDestroy:bullet.draw(MainGame.window)bullet.move(MainGame.explodeList)bullet.enemyBulletCollidePlayerTank(MainGame.playerTank, MainGame.explodeList)else:bullet.source.bulletCount - 1MainGame.enemyTankBulletList.remove(bullet)def drawExplode(self):for e in MainGame.explodeList:if e.isDestroy:MainGame.explodeList.remove(e)else:e.draw(MainGame.window)if __name__ __main__:MainGame().startGame() 完整的子弹类代码 import pygame from ParentObject import ParentObject from Explode import Explodeclass Bullet(ParentObject):def __init__(self, tank):super().__init__()self.images {UP: pygame.image.load(../Image/Bullet/Bullet(UP).png),DOWN: pygame.image.load(../Image/Bullet/Bullet(DOWN).png),LEFT: pygame.image.load(../Image/Bullet/Bullet(LEFT).png),RIGHT: pygame.image.load(../Image/Bullet/Bullet(RIGHT).png)}# 方向self.direction tank.directionself.image: pygame.Surface self.images[self.direction]self.rect self.image.get_rect()# 坦克发射子弹的位置if self.direction UP:self.rect.left tank.rect.left 17.5self.rect.top tank.rect.top - 25elif self.direction DOWN:self.rect.left tank.rect.left 17.5self.rect.top tank.rect.top 25elif self.direction LEFT:self.rect.left tank.rect.left - 25self.rect.top tank.rect.top 17.5elif self.direction RIGHT:self.rect.left tank.rect.left 25self.rect.top tank.rect.top 17.5# 速度self.accumulationMax: float 0self.accumulation 0.25self.speed 10# 销毁开关self.isDestroy False# 发射源self.source tank# 伤害self.damage tank.damagedef move(self, explodeList):if self.accumulation 1:self.accumulation 0if self.direction LEFT:self.rect.left - self.speedelif self.direction UP:self.rect.top - self.speedelif self.direction DOWN:self.rect.top self.speedelif self.direction RIGHT:self.rect.left self.speed# 检查子弹是否出界self.checkBullet(explodeList)else:self.accumulation 0.20def checkBullet(self, explodeList):toDestroy False# 如果出界就设置为销毁if self.rect.top 0 or self.rect.top 600:toDestroy Trueif self.rect.left 0 or self.rect.right 900:toDestroy Trueif toDestroy:explode Explode(self, 25)explodeList.append(explode)self.isDestroy Truedef draw(self, window):window.blit(self.image, self.rect)def playerBulletCollideEnemyTank(self, enemyTankList, explodeList):# 循环遍历坦克列表检查是否发生了碰撞for tank in enemyTankList:if pygame.sprite.collide_rect(tank, self):tank.loseLife(self.damage)# 把子弹设置为销毁状态self.isDestroy Trueif tank.life 0:# 增加爆炸效果explode Explode(tank, 50)explodeList.append(explode)def enemyBulletCollidePlayerTank(self, playerTank, explodeList):# 玩家坦克生命值为0不用检测if playerTank.life 0:return# 检测是否发生碰撞if pygame.sprite.collide_rect(playerTank, self):# 发生碰撞先减少护甲护甲为0时扣减生命值if playerTank.armor 0:playerTank.armor - self.damageplayerTank.armor max(0, playerTank.armor)else:playerTank.loseLife(self.damage)# 增加爆炸效果explode Explode(playerTank, 50)explodeList.append(explode)playerTank.life max(0, playerTank.life)if playerTank.life ! 0:playerTank.isResurrecting True# 让子弹销毁self.isDestroy True
http://www.dnsts.com.cn/news/137978.html

相关文章:

  • 找公司做网站要注意什么问题wordpress 并发量
  • 怎么做网站的内链外链影视自助建站
  • 保定 网站制作找天津网站建设公司做个网站多少钱
  • 中建西部建设网站滕州住房和城乡建设局网站
  • 网站规划与网站建设红色大气网络公司企业网站源码_适合广告设计
  • 做网站 数据库沈阳网站制作建设
  • 凡客网站登陆免费的行情软件
  • 网站建设的外国文献遵义发布官网
  • 网站建设项目教程永州企业网站开发
  • 南宁网站建设制作wordpress wp_head()
  • 301网站跳转设置电商平台的搭建
  • 做婚庆策划的网站做的比较好的法律实务培训网站
  • 安阳那里可以制作网站怎么制作网站获取他人ip
  • 做桌面端还是网站网站建设编程语言
  • 完全自建网站宁波专业seo推广价格
  • 广告制作公司员工提成济南seo快速霸屏
  • 淘宝客网站开发视频外贸网站屏蔽国内ip
  • 网站域名注册规则软件设计师难考吗
  • 建设视频网站设计意义湖北网站建设哪家专业
  • net网站是国际域名吗自己做网站的域名
  • 住房和城乡建设部网站倪虹重庆网站建设及优化公司
  • 2024网站推广网站备案核验点
  • 饿了吗外卖网站怎么做浙江省建设监理管理协会网站
  • 大兴 网站建设哪类公司做网站的最多
  • 怎么在建筑网站做翻译兼职网页设计下载方式
  • ps教程网站有哪些想学动漫设计报什么专业
  • 太原做网站多少钱学做点心上哪个网站
  • 用手机建立自己的网站设计教程
  • 网站模板侵权如何处理wordpress nginx 伪静态
  • 淮南定制网站建设公司wordpress商城主题付费