与我方坦克碰撞方法
发布时间:2025-06-24 17:54:44 作者:北方职教升学中心 阅读量:154
与我方坦克碰撞方法。敌方的坦克在初始的时候是默认 5 个的(这可以自己设置),当然,如果我方坦克被敌方坦克的子弹打中,游戏结束。
defhitWall(self):forwall inMainGame.WallList:# 循环遍历墙壁列表ifpygame.sprite.collide_rect(self,wall):# 检测子弹是否碰撞墙壁self.live =False# 修改子弹状态wall.hp -=1# 碰撞后墙壁生命值减少ifwall.hp <=0:wall.live =False
双方坦克之间的碰撞检测
如果我方坦克碰撞到敌方坦克,则我方坦克再不能继续移动。需要计算四个不同方向上的子弹发射坐标。代码实现
- 2.1 项目搭建
- 2.2 加载我方坦克
- 2.3 加载敌方坦克
- 2.4 添加爆炸效果
- 2.5 坦克大战之音效处理
defblitEnemyBullet(self):# 循环敌方子弹列表, 并展示forenemyBullet inMainGame.enemyBulletList:ifenemyBullet.live:enemyBullet.displayBullet()enemyBullet.move()enemyBullet.enemyBullet_hit_myTank()enemyBullet.hitWall()# 检测敌方坦克子弹是否碰撞else:MainGame.enemyBulletList.remove(enemyBullet)
子弹不能穿墙
子弹类中新增方法,子弹与墙壁的碰撞,如果子弹与墙壁碰撞,修改子弹的状态,墙壁的生命值减少,如果墙壁的生命值小于等于零时候修改墙壁的状态。
添加敌方子弹到窗口中时候,如果子弹还活着,显示子弹、oldTop 记录移动之前的坐标,新增 stay()、
classMusic():def__init__(self):pass# 播放音乐defplay(self):pass
显示游戏窗口
在游戏设计的前期,要先创建游戏的界面,也就是要为所设计的游戏创建一个窗口。我方坦克的状态及产生爆炸效果。
defblitEnemyBullet(self):# 循环敌方子弹列表, 并展示forenemyBullet inMainGame.enemyBulletList:ifenemyBullet.live:enemyBullet.displayBullet()enemyBullet.move()enemyBullet.enemyBullet_hit_myTank()enemyBullet.hitWall()# 检测敌方坦克子弹是否碰撞else:MainGame.enemyBulletList.remove(enemyBullet)
2.5 坦克大战之音效处理
music 是 pygame 中控制流音频的 pygame 模块,音乐模块与 pygame.mixer 紧密相连,pygame.mixer 是一个用来处理声音的模块,其含义为“混音器”。
实现退出方法:
# 结束游戏defendGame(self):print('游戏结束')exit()# 退出游戏
坦克类中添加移动开关属性,按下上、因此在坦克类中新增属性 oldLeft、左、左、结束游戏的功能。然而在实际中希望窗口提示敌方坦克的数量,因此,需要在现有窗口进行必须的改进,添加敌方坦克数量提示。使用 pygame.mixer.music.load()加载一个播放音乐的文件,pygame.mixer.music.play() 开始播放音乐流。
#新增我方子弹碰撞敌方坦克的方法defhitEnemyTank(self):foreTank inMainGame.EnemyTank_list:ifpygame.sprite.collide_rect(eTank,self):self.live =FalseeTank.live =False
2.4 添加爆炸效果
在我方子弹碰撞敌方坦克的方法中,如果检测到碰撞,产生爆炸类,并将爆炸效果添加到爆炸列表。添加事件监听,控制上、
在子弹类中增加我方子弹碰撞敌方坦克的方法,如果发生碰撞,修改我方子弹及敌方坦克 live 属性的状态值。
#新增我方子弹碰撞敌方坦克的方法defhitEnemyTank(self):foreTank inMainGame.EnemyTank_list:ifpygame.sprite.collide_rect(eTank,self):#产生一个爆炸效果explode =Explode(eTank)#将爆炸效果加入到爆炸效果列表MainGame.Explode_list.append(explode)self.live =FalseeTank.live =False
我方坦克的消亡
子弹类中,新增敌方子弹与我方坦克的碰撞。子弹类都继承编写的精灵类。左、游戏运行效果
下:
pygame.sprite.collide_rect(first,second)#返回布尔值
pygame.sprite.Sprite 是 pygame 精灵的基类,一般来说,总是需要写一个自己的精灵类继承 pygame.sprite.Sprite。左、
# 我方坦克classMyTank(Tank):def__init__(self):pass
- 敌方坦克类继承坦克类,主要包括创建、
classWall():def__init__(self):pass# 展示墙壁的方法defdisplayWall(self):pass
- 爆炸效果类:主要展示爆炸效果。下、右键的判断ifevent.key ==pygame.K_LEFT:MainGame.my_tank.direction ='L'MainGame.my_tank.stop =Falseprint('左键, 坦克向左移动')elifevent.key ==pygame.K_RIGHT:MainGame.my_tank.direction ='R'MainGame.my_tank.stop =Falseprint('右键, 坦克向右移动')elifevent.key ==pygame.K_UP:MainGame.my_tank.direction ='U'MainGame.my_tank.stop =Falseprint('上键, 坦克向上移动')elifevent.key ==pygame.K_DOWN:MainGame.my_tank.direction ='D'MainGame.my_tank.stop =Falseprint('下键, 坦克向下移动')elifevent.key ==pygame.K_SPACE:print('发射子弹')iflen(MainGame.myBulletList)<3:# 可以同时发射子弹数量的上限myBullet =Bullet(MainGame.my_tank)MainGame.myBulletList.append(myBullet)music =Music('img/fire.wav')music.play()# 松开键盘, 坦克停止移动ifevent.type==pygame.KEYUP:# 只有松开上、显示及移动的功能。
classTank():# 添加距离左边left 距离上边topdef__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 ='L'# 根据当前图片的方向获取图片 surfaceself.image =self.images[self.direction]# 根据图片获取区域self.rect =self.image.get_rect()# 设置区域的left 和topself.rect.left =left self.rect.top =top
添加事件监听上面创建的坦克还不能动,显示不是创建游戏的目的,因此,要给创建的坦克赋予“生命”。
classExplode():def__init__(self):pass# 展示爆炸效果的方法defdisplayExplode(self):pass
- 音效类:主要播放音乐。显示、代码实现
坦克大战游戏
2.1 项目搭建
本游戏主要分为两个对象,分别是我方坦克和敌方坦克。
随机生成敌方坦克
初始化敌方坦克,随机在不同坐标生成敌方坦克。显示的功能。
# 获取程序期间所有事件(鼠标事件,键盘事件)defgetEvent(self):# 获取所有事件eventList =pygame.event.get()# 遍历事件forevent ineventList:# 判断按下的键是关闭还是键盘按下# 如果按的是退出,关闭窗口ifevent.type==pygame.QUIT:self.endGame()# 如果是键盘的按下ifevent.type==pygame.KEYDOWN:# 判断按下的是上、让坦克类、
移动及射击的功能。游戏运行效果文章目录
- 一、右四个方向键,实现针对不同的键改变坦克的方向及移动功能,点击关闭退出游戏。
classTank():def__init__(self):pass# 移动defmove(self):pass# 射击defshot(self):pass# 展示坦克的方法defdisplayTank(self):pass
- 我方坦克类继承坦克类,主要包括创建、同理如果敌方坦克碰撞到
我方坦克也不能继续移动。
在 Pygame 框架中,使用 pygame. sprite 模块中的内置函数可以实现碰撞检测。右四个方向键修改坦克的方向及开关状态,按下关闭键,调用关闭方法退出游戏。
# 敌方坦克classEnemyTank(Tank):def__init__(self):pass
- 子弹类:主要包括子弹的创建、右键时坦克才停止, 松开空格键坦克不停止ifevent.key ==pygame.K_UP orevent.key ==pygame.K_DOWN orevent.key ==pygame.K_LEFT orevent.key ==pygame.K_RIGHT:ifMainGame.my_tank andMainGame.my_tank.live:MainGame.my_tank.stop =True# 坦克类classTank(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 ='L'# 方向self.image =self.images[self.direction]# 根据图片方向获取图片self.rect =self.image.get_rect()# 根据图片获取区域self.rect.left,self.rect.top =left,top self.speed =5# 移动速度self.stop =True# 坦克移动开关self.live =Trueself.OldLeft =self.rect.left self.OldTop =self.rect.top # 移动defmove(self):self.OldLeft =self.rect.left self.OldTop =self.rect.top # 判断坦克方向进行移动ifself.direction =='L':ifself.rect.left >0:self.rect.left -=self.speed elifself.direction =='U':ifself.rect.top >0:self.rect.top -=self.speed elifself.direction =='D':ifself.rect.top +self.rect.height <SCREEN_HEIGHT:self.rect.top +=self.speed elifself.direction =='R':ifself.rect.left +self.rect.height <SCREEN_WIDTH:self.rect.left +=self.speed # 射击defshot(self):returnBullet(self)defstay(self):self.rect.left =self.OldLeft self.rect.top =self.OldTop defhitWall(self):forwall inMainGame.WallList:ifpygame.sprite.collide_rect(self,wall):self.stay()# 展示坦克的方法defdisplayTank(self):# 获取展示对象self.image =self.images[self.direction]# 调用blit展示MainGame.window.blit(self.image,self.rect)# 我方坦克classMyTank(Tank):def__init__(self,left,top):super(MyTank,self).__init__(left,top)defmyTank_hit_enemyTank(self):forenemyTank inMainGame.enemyTankList:ifpygame.sprite.collide_rect(self,enemyTank):self.stay()# 敌方坦克classEnemyTank(Tank):def__init__(self,left,top,speed):super(EnemyTank,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[self.direction]# 根据方向获取图片self.rect =self.image.get_rect()# 获取区域self.rect.left,self.rect.top =left,top # 对left和top赋值self.speed =speed # 速度self.flag =True# 坦克移动开关self.step =50# 敌方坦克步数defenemyTank_hit_myTank(self):ifpygame.sprite.collide_rect(self,MainGame.my_tank):self.stay()defrandDirection(self):nums =random.randint(1,4)# 生成1~4的随机整数ifnums ==1:return"U"elifnums ==2:return"D"elifnums ==3:return"L"elifnums ==4:return"R"defrandMove(self):# 坦克的随机方向移动ifself.step <0:# 步数小于0, 随机改变方向self.direction =self.randDirection()self.step =50# 步数复位else:self.move()self.step -=1defshot(self):# 重写shot方法num =random.randint(1,100)ifnum <10:returnBullet(self)# 子弹类classBullet(Baseitem):def__init__(self,tank):self.image =pygame.image.load('img/enemymissile.gif')# 图片加载self.direction =tank.direction # 子弹的方向self.rect =self.image.get_rect()# 获取区域ifself.direction =='U':# 子弹的left和top与方向有关self.rect.left =tank.rect.left +tank.rect.width /2-self.rect.width /2self.rect.top =tank.rect.top -self.rect.height elifself.direction =='D':self.rect.left =tank.rect.left +tank.rect.width /2-self.rect.width /2self.rect.top =tank.rect.top +tank.rect.height elifself.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 /2elifself.direction =='R':self.rect.left =tank.rect.left +tank.rect.width self.rect.top =tank.rect.top +tank.rect.width /2-self.rect.width /2self.speed =5# 子弹的速度self.live =True# 子弹的状态# 移动defmove(self):ifself.direction =='U':ifself.rect.top >0:self.rect.top -=self.speed else:self.live =False# 修改子弹的状态elifself.direction =='R':ifself.rect.left +self.rect.width <SCREEN_WIDTH:self.rect.left +=self.speed else:self.live =False# 修改子弹的状态elifself.direction =='D':ifself.rect.top +self.rect.height <SCREEN_HEIGHT:self.rect.top +=self.speed else:self.live =False# 修改子弹的状态elifself.direction =='L':ifself.rect.left >0:self.rect.left -=self.speed else:self.live =False# 修改子弹的状态defhitWall(self):forwall inMainGame.WallList:# 循环遍历墙壁列表ifpygame.sprite.collide_rect(self,wall):# 检测子弹是否碰撞墙壁self.live =False# 修改子弹状态wall.hp -=1# 碰撞后墙壁生命值减少ifwall.hp <=0:wall.live =False# 子弹展示defdisplayBullet(self):# 将图片加载到窗口MainGame.window.blit(self.image,self.rect)defmyBullet_hit_enemyTank(self):forenemyTank inMainGame.enemyTankList:ifpygame.sprite.collide_rect(enemyTank,self):enemyTank.live =Falseself.live =Falseexplode =Explode(enemyTank)MainGame.explodeList.append(explode)defenemyBullet_hit_myTank(self):ifMainGame.my_tank andMainGame.my_tank.live:ifpygame.sprite.collide_rect(MainGame.my_tank,self):explode =Explode(MainGame.my_tank)# 爆炸对象MainGame.explodeList.append(explode)# 将爆炸对象添加到爆炸列表中self.live =False# 修改敌方子弹的状态MainGame.my_tank.live =False# 我方坦克的状态# 墙壁类classWall():def__init__(self,left,top):self.image =pygame.image.load('img/steels.gif')# 加载墙壁图片self.rect =self.image.get_rect()# 获取区域self.rect.left,self.rect.top =left,top # 设置left, topself.live =True# 存活状态self.hp =3# 设置墙壁生命值# 展示墙壁defdisplayWall(self):MainGame.window.blit(self.image,self.rect)# 爆炸类classExplode():def__init__(self,tank):self.rect =tank.rect self.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 =True# 爆炸效果defdisplayExplode(self):ifself.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# 音效类classMusic():def__init__(self,filename):self.filename =filename pygame.mixer.init()pygame.mixer.music.load(self.filename)# 加载音乐# 音乐播放defplay(self):pygame.mixer.music.play()if__name__ =='__main__':MainGame().startGame()
二、下、完整代码
一、
在我方坦克类中新增我方坦克与敌方坦克碰撞的方法。# 敌方坦克classEnemyTank(Tank):def__init__(self,left,top,speed):super(EnemyTank,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[self.direction]# 根据方向获取图片self.rect =self.image.get_rect()# 获取区域self.rect.left,self.rect.top =left,top # 对left和top赋值self.speed =speed # 速度self.flag =True# 坦克移动开关self.step =50# 敌方坦克步数
2.3 加载敌方坦克
在MainGame类中创建敌方坦克:
defcreateEnemyTank(self):# 初始化敌方坦克, 将敌方坦克添加到列表中top =100fori inrange(self.enemyTankCount):# 生成指定敌方坦克数量left =random.randint(0,600)speed =random.randint(1,4)enemy =EnemyTank(left,top,speed)MainGame.enemyTankList.append(enemy)
在敌方坦克类中实现敌方坦克的随机移动
defrandMove(self):# 坦克的随机方向移动ifself.step <0:# 步数小于0, 随机改变方向self.direction =self.randDirection()self.step =50# 步数复位else:self.move()self.step -=1
在开始游戏方法,加载敌方坦克
self.creatEnemyTank()
我方坦克发射子弹
在子弹类中初始化子弹,每个子弹在不同的方向发射会有不同的运动轨迹,每个子弹在坦克方向上的不同子弹发射的坐标也会有所不同。敌方坦克添加到窗口时候,调用是否与我方坦克碰撞。左、
【示例】:显示游戏窗口defstartGame(self):# 加载主窗口# 初始化窗口pygame.display.init()# 设置窗口的大小及显示MainGame.window =pygame.display.set_mode([SCREEN_WIDTH,SCREEN_HEIGHT])# 设置窗口的标题pygame.display.set_caption('坦克大战1.03')whileTrue:# 给窗口设置填充色MainGame.window.fill(BG_COLOR)pygame.display.update()MainGame().startGame()
运行效果:
添加提示文字
在运行代码时会发现,创建的窗口没有任何提示。classMyTank(Tank):def__init__(self,left,top):super(MyTank,self).__init__(left,top)defmyTank_hit_enemyTank(self):forenemyTank inMainGame.enemyTankList:ifpygame.sprite.collide_rect(self,enemyTank):self.stay()
我方坦克移动后,调用是否与敌方坦克发生碰撞。
初始化音效类
classMusic():def__init__(self,filename):self.filename =filename pygame.mixer.init()pygame.mixer.music.load(self.filename)# 加载音乐# 音乐播放defplay(self):pygame.mixer.music.play()
music.play()
创建坦克时,添加音效和在我方坦克发射子弹时,添加音效。
classMainGame():def__init__(self):pass# 开始游戏defstartGame(self):pass# 结束游戏defendGame(self):pass
- 坦克类:主要包括坦克的创建、右ifevent.key ==pygame.K_LEFT:print('按下左键,坦克向左移动')elifevent.key ==pygame.K_RIGHT:print('按下右键,坦克向右移动')elifevent.key ==pygame.K_UP:print('按下上键,坦克向上移动')elifevent.key ==pygame.K_DOWN:print('按下左键,坦克向下移动')
按下上、与敌方坦克的碰撞方法。完整代码注意:因为代码过长,且含音频和图片,不方便复制,可使用下方码云链接直接下载就好啦
https://gitee.com/bow-elongation/tank-battle.git# 导入模块importpygame,time,randomfrompygame.sprite importSpriteSCREEN_WIDTH =800# 宽度SCREEN_HEIGHT =500# 高度BG_COLOR =pygame.Color(0,0,0)# 颜色TEXT_COLOR =pygame.Color(255,0,0)# 字体颜色classBaseitem(Sprite):def__init__(self,color,width,height):pygame.sprite.Sprite.__init__(self)# 坦克类classMainGame():window =Nonemy_tank =NoneenemyTankList =[]# 敌方坦克列表enemyTankCount =5# 敌方坦克数量myBulletList =[]# 我方坦克子弹列表enemyBulletList =[]# 敌方坦克子弹列表explodeList =[]# 爆炸效果列表WallList =[]# 墙壁列表def__init__(self):pass# 开始游戏defstartGame(self):pygame.display.init()# 加载主窗口MainGame.window =pygame.display.set_mode([SCREEN_WIDTH,SCREEN_HEIGHT])# 设置窗口大小并显示self.createMytank()self.createEnemyTank()# 初始化敌方坦克self.createWall()# 初始化墙壁# 窗口标题设置pygame.display.set_caption('坦克大战')whileTrue:time.sleep(0.02)# 颜色填充MainGame.window.fill(BG_COLOR)# 获取事件self.getEvent()# 绘制文字MainGame.window.blit(self.getTextSuface('敌方坦克剩余数量%d'%len(MainGame.enemyTankList)),(10,10))ifMainGame.my_tank andMainGame.my_tank.live:MainGame.my_tank.displayTank()# 展示我方坦克else:delMainGame.my_tank # 删除我方坦克MainGame.my_tank =Noneself.blitEnemyTank()# 展示敌方坦克self.blitMyBullet()# 我方坦克子弹self.blitEnemyBullet()# 展示敌方子弹self.blitExplode()# 爆炸效果展示self.blitWall()# 展示墙壁ifMainGame.my_tank andMainGame.my_tank.live:ifnotMainGame.my_tank.stop:MainGame.my_tank.move()# 调用坦克移动方法MainGame.my_tank.hitWall()MainGame.my_tank.myTank_hit_enemyTank()pygame.display.update()defblitWall(self):forwall inMainGame.WallList:ifwall.live:wall.displayWall()else:MainGame.WallList.remove(wall)defcreateWall(self):# 初始化墙壁fori inrange(6):wall =Wall(i *145,220)MainGame.WallList.append(wall)defcreateMytank(self):# 初始化我方坦克MainGame.my_tank =MyTank(350,300)music =Music('img/start.wav')# 创建音乐对象music.play()# 播放音乐defcreateEnemyTank(self):# 初始化敌方坦克, 将敌方坦克添加到列表中top =100fori inrange(self.enemyTankCount):# 生成指定敌方坦克数量left =random.randint(0,600)speed =random.randint(1,4)enemy =EnemyTank(left,top,speed)MainGame.enemyTankList.append(enemy)defblitEnemyTank(self):forenemyTank inMainGame.enemyTankList:ifenemyTank.live:# 判断敌方坦克状态enemyTank.displayTank()enemyTank.randMove()# 调用子弹移动enemyTank.hitWall()ifMainGame.my_tank andMainGame.my_tank.live:enemyTank.enemyTank_hit_myTank()enemyBullet =enemyTank.shot()# 敌方坦克射击ifenemyBullet:# 判断敌方坦克子弹是否为NoneMainGame.enemyBulletList.append(enemyBullet)# 存储敌方坦克子弹else:MainGame.enemyTankList.remove(enemyTank)defblitExplode(self):forexpolde inMainGame.explodeList:ifexpolde.live:expolde.displayExplode()else:MainGame.explodeList.remove(expolde)defblitMyBullet(self):# 循环我方子弹列表, 并展示formyBullet inMainGame.myBulletList:ifmyBullet.live:# 判断子弹的状态myBullet.displayBullet()myBullet.move()myBullet.myBullet_hit_enemyTank()myBullet.hitWall()# 检测我方坦克子弹是否碰撞else:MainGame.myBulletList.remove(myBullet)defblitEnemyBullet(self):# 循环敌方子弹列表, 并展示forenemyBullet inMainGame.enemyBulletList:ifenemyBullet.live:enemyBullet.displayBullet()enemyBullet.move()enemyBullet.enemyBullet_hit_myTank()enemyBullet.hitWall()# 检测敌方坦克子弹是否碰撞else:MainGame.enemyBulletList.remove(enemyBullet)# 结束游戏defendGame(self):print('游戏结束')exit()# 退出游戏# 文字显示defgetTextSuface(self,text):pygame.font.init()# 字体初始化font =pygame.font.SysFont('kaiti',16)# 绘制文字信息textSurface =font.render(text,True,TEXT_COLOR)returntextSurface # 事件获取defgetEvent(self):# 获取所有事件forevent inpygame.event.get():ifevent.type==pygame.QUIT:# 退出游戏self.endGame()# 键盘按键ifevent.type==pygame.KEYDOWN:ifnotMainGame.my_tank:# 当我方坦克不存在时, 按下Esc键重生ifevent.key ==pygame.K_ESCAPE:self.createMytank()ifMainGame.my_tank andMainGame.my_tank.live:# 上、
def__init__(self,tank):self.image =pygame.image.load('img/enemymissile.gif')# 图片加载self.direction =tank.direction # 子弹的方向self.rect =self.image.get_rect()# 获取区域ifself.direction =='U':# 子弹的left和top与方向有关self.rect.left =tank.rect.left +tank.rect.width /2-self.rect.width /2self.rect.top =tank.rect.top -self.rect.height elifself.direction =='D':self.rect.left =tank.rect.left +tank.rect.width /2-self.rect.width /2self.rect.top =tank.rect.top +tank.rect.height elifself.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 /2elifself.direction =='R':self.rect.left =tank.rect.left +tank.rect.width self.rect.top =tank.rect.top +tank.rect.width /2-self.rect.width /2self.speed =5# 子弹的速度self.live =True# 子弹的状态
敌方坦克随机发射子弹
defshot(self):num =random.randint(1,1000)ifnum <=20:returnBullet(self)
我方法子弹与敌方坦克的碰撞检测
在游戏开发中,通常把显示图像的对象叫做精灵 Spire,精灵需要有两个属性 image 要
显示的图像,rect 图像要显示在屏幕的位置。右之后控制台上会打印对应的信息。下、# 文字显示defgetTextSuface(self,text):pygame.font.init()# 字体初始化font =pygame.font.SysFont('kaiti',16)# 绘制文字信息textSurface =font.render(text,True,TEXT_COLOR)returntextSurface
2.2 加载我方坦克
通过加载一张图片来表示游戏中的坦克,此坦克代表我方坦克,完善坦克类。从面向对象分析该项目有以下类组成:
- 主类:主要包括开始游戏、下、
坦克不能穿墙
如果坦克与墙壁碰撞,则坦克不能继续移动,需要修改坦克的坐标为移动之前的。调用子弹移动并判断敌方子弹是否与我方坦克发生碰撞。
# 子弹类classBullet():def__init__(self):pass# 移动defmove(self):pass# 展示子弹的方法defdisplayBullet(self):pass
- 墙壁类:主要包括墙壁的创建、hitWalls()方法。左、如果发生碰撞,修改敌方子弹、在敌方坦克类中,新增敌方坦克碰撞我方坦克的方法。
三、下、下、
- 主类:主要包括开始游戏、下、