python坦克大战游戏_python实现坦克大战游戏

这个博客介绍了如何使用Python开发一款坦克大战游戏。游戏包括初始化屏幕、设置标题、创建坦克、墙壁、子弹等元素,并实现了坦克的移动、碰撞检测、子弹发射等功能。通过事件处理监听玩家输入,游戏循环中更新各个元素状态并显示游戏画面。
摘要由CSDN通过智能技术生成

python开发的坦克大战游戏

1 importpygame2 from pygame.sprite importSprite3 importsys4 importtime5 importrandom6

7 SCREEN_WIDTH = 780

8 SCREEN_HEIGHT = 500

9 BG_COLOR =pygame.Color(0,0,0)10 TEXT_COLOR = pygame.Color(255,0,0)11 #复活次数

12

13 #定义一个精灵类

14 classBaseItem(Sprite):15 def __init__(self, color, width, height):16 #Call the parent class (Sprite) constructor

17 pygame.sprite.Sprite.__init__(self)18

19 classMainGame ():20

21 window =None22 my_tank =None23 REC_TIME=024 #敌方坦克初始化

25 EnemyTankList =[]26 EnemyTankCount = 5

27 #存储我方子弹列表

28 myBulleList =[]29 #存储敌方子弹

30 EnemyBulletList =[]31 #创建爆炸对象列表

32 explodeList =[]33

34 #创建墙壁列表

35 wallList =[]36 def __init__(self):37 pass

38

39 defstarGame(self):40 #初始化,设置标题,屏幕大小

41 pygame.display.init()42 MainGame.window =pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT))43 pygame.display.set_caption("坦克大战1.03")44 #初始化我方坦克

45 self.creatMyTank()46 #初始化敌方坦克

47 self.creatEnemyTank()48 #初始化墙壁

49 self.creatWall()50 whileTrue:51 #填充颜色

52 MainGame.window.fill(BG_COLOR)53 #获取事件

54 self.getEvent()55 #绘制文字

56 MainGame.window.blit(self.getTextSuface("敌方坦克剩余数量%d"%MainGame.EnemyTankCount),(SCREEN_HEIGHT/2,20))57 #调用我方坦克进行显示

58 if MainGame.my_tank andMainGame.my_tank.live:59 MainGame.my_tank.displayTank()60 else:61 delMainGame.my_tank62 MainGame.my_tank =None63 #显示我方子弹

64 self.blitMyBullet()65 #敌方坦克进行显示

66 self.blitEnenyTank()67 #显示墙壁

68 self.blitWall()69 #显示敌方子弹

70 self.blitEnenyBullet()71 #显示爆炸效果

72 self.blitExplode()73 if MainGame.my_tank andMainGame.my_tank.live:74 if notMainGame.my_tank.stop:75 MainGame.my_tank.move()76 MainGame.my_tank.hitWall()77 MainGame.my_tank.myTank_hit_enemyTank()78 if MainGame.EnemyTankCount ==0:79 MainGame.window.blit(self.getTextSuface('恭喜你,顺利通过'), (SCREEN_HEIGHT/2, SCREEN_WIDTH/2))80 time.sleep(2)81 self.endGame()82 pygame.display.update()83 time.sleep(0.02)84

85

86 defcreatWall(self):87 for i in range(0,SCREEN_WIDTH,SCREEN_WIDTH//6):88 top = SCREEN_HEIGHT//3

89 left =i90 wall =Wall(left,top)91 MainGame.wallList.append(wall)92

93 defcreatMyTank(self):94 MainGame.my_tank = MyTank(SCREEN_WIDTH/2,SCREEN_HEIGHT/3*2)95 music = Music("img/start.wav")96 music.play()97

98 defcreatEnemyTank(self):99 top = 100

100 for i inrange(MainGame.EnemyTankCount):101 left = random.randint(0,600)102 speed = random.randint(1,4)103 enmy =EnemyTank(left,top,speed)104 MainGame.EnemyTankList.append(enmy)105

106 defblitWall(self):107 for wall inMainGame.wallList:108 ifwall.live:109 wall.displayWall()110 else:111 MainGame.wallList.remove(wall)112

113 defblitEnenyTank(self):114 "循环遍历敌方坦克,展示敌方坦克"

115 for enmeyTank inMainGame.EnemyTankList:116 ifenmeyTank.live:117 enmeyTank.displayTank()118 enmeyTank.randomMove()119 EnemyBullet =enmeyTank.shot()120 enmeyTank.hitWall()121 enmeyTank.enemyTank_hit_MyTank()122 #存储敌方子弹

123 ifEnemyBullet:124 MainGame.EnemyBulletList.append(EnemyBullet)125 else:126 MainGame.EnemyTankList.remove(enmeyTank)127 MainGame.EnemyTankCount -=1

128 defblitMyBullet(self):129 for bullet inMainGame.myBulleList:130 ifbullet.live:131 bullet.displayBullet()132 bullet.move()133 bullet.myBullet_hit_enemyTank()134 bullet.wall_bullet()135 else:136 MainGame.myBulleList.remove(bullet)137

138 defblitEnenyBullet(self):139 for bullet inMainGame.EnemyBulletList:140 if bullet.live: #随机会产生None

141 bullet.displayBullet()142 bullet.move()143 bullet.enemyBullet_hit_myTank()144 bullet.wall_bullet()145 else:146 MainGame.EnemyBulletList.remove(bullet)147

148

149 defblitExplode(self):150 for explode inMainGame.explodeList:151 ifexplode.live:152 explode.displayExplode()153 else:154 MainGame.explodeList.remove(explode)155

156

157 defendGame(self):158 print("欢迎下次游戏")159 sys.exit()160 defgetTextSuface(self,text):161 pygame.font.init()162 #print(pygame.font.get_fonts())

163 font = pygame.font.SysFont('kaiti',18)164 textSurface =font.render(text,True,TEXT_COLOR)165 returntextSurface166

167

168 defgetEvent(self):169 '''获取所有事件'''

170 eventList=pygame.event.get()171 for event ineventList:172 if event.type ==pygame.QUIT:173 self.endGame()174 if event.type ==pygame.KEYDOWN:175 if notMainGame.my_tank:176 if event.key ==pygame.K_ESCAPE:177 if MainGame.REC_TIME < 3:178 self.creatMyTank()179 MainGame.REC_TIME +=1

180 if MainGame.my_tank andMainGame.my_tank.live:181 if event.key ==pygame.K_DOWN:182 MainGame.my_tank.direction ='D'

183 #MainGame.my_tank.move()

184 MainGame.my_tank.stop =False185 print("按下向下的键,向下移动",)186 elif event.key ==pygame.K_UP:187 MainGame.my_tank.direction = 'U'

188 #MainGame.my_tank.move()

189 MainGame.my_tank.stop =False190 print("按下向上的键,向上移动")191 elif event.key ==pygame.K_LEFT:192 MainGame.my_tank.direction = 'L'

193 #MainGame.my_tank.move()

194 MainGame.my_tank.stop =False195 print("按下向左的键,向左移动", MainGame.my_tank.direction)196 elif event.key ==pygame.K_RIGHT:197 MainGame.my_tank.direction = 'R'

198 #MainGame.my_tank.move()

199 MainGame.my_tank.stop =False200 print("按下向右的键,向右移动", MainGame.my_tank.direction)201

202 elif event.key ==pygame.K_SPACE:203 print("发射子弹")204 #创建我方子弹

205 if len(MainGame.myBulleList) < 3:206 myBullet =Bullet(MainGame.my_tank)207 MainGame.myBulleList.append(myBullet)208

209 #发射子弹音效

210 ShotMusic = Music('img/hit.wav')211 ShotMusic.play()212

213 elif event.type ==pygame.KEYUP:214 if event.key ==pygame.K_UP or event.key == pygame.K_DOWN or event.key ==pygame.K_LEFT or event.key ==pygame.K_RIGHT:215 if MainGame.my_tank andMainGame.my_tank.live:216 MainGame.my_tank.stop=True217

218

219

220 classTank(BaseItem):221 def __init__(self,left,top):222 self.images={223 "U":pygame.image.load('img/p1tankU.gif'),224 "D": pygame.image.load('img/p1tankD.gif'),225 "L": pygame.image.load('img/p1tankL.gif'),226 "R": pygame.image.load('img/p1tankR.gif'),227 }228 self.direction ='U'

229 self.image =self.images[self.direction]230 self.rect =self.image.get_rect()231 #设置放置的位置

232 self.rect.left=left233 self.rect.top =top234 self.speed = 4

235 #控制坦克开关

236 self.stop =True237 self.live =True238

239 #保持原来的位置

240 self.oldLeft =self.rect.left241 self.oldTop =self.rect.top242

243 defhitWall(self):244 for wall inMainGame.wallList:245 ifpygame.sprite.collide_rect(wall, self):246 self.stay()247

248 defstay(self):249 self.rect.left =self.oldLeft250 self.rect.top =self.oldTop251

252 defshot(self):253 returnBullet(self)254 defmove(self):255 #保持原来的状态

256 self.oldLeft =self.rect.left257 self.oldTop =self.rect.top258 #判断坦克的方向进行移动

259 if self.direction =='U':260 if self.rect.top>0:261 self.rect.top -=self.speed262 elif self.direction =='L':263 if self.rect.left>0:264 self.rect.left -=self.speed265 elif self.direction =='D':266 if self.rect.top +self.rect.height<267 self.rect.top elif self.direction="=" if self.rect.left>

272 defdisplayTank(self):273 self.image =self.images[self.direction]274 MainGame.window.blit(self.image,self.rect)275

276 classMyTank(Tank):277 def __init__(self,left,top):278 super().__init__(left,top)279

280 defmyTank_hit_enemyTank(self):281 for enemyTank inMainGame.EnemyTankList:282 ifpygame.sprite.collide_rect(enemyTank, self):283 self.stay()284

285 classEnemyTank(Tank):286

287

288 def __init__(self,left,top,speed):289

290 super(EnemyTank,self).__init__(left,top)291 self.images ={292 "U": pygame.image.load('img/enemy1U.gif'),293 "D": pygame.image.load('img/enemy1D.gif'),294 "L": pygame.image.load('img/enemy1L.gif'),295 "R": pygame.image.load('img/enemy1R.gif'),296 }297 self.direction =self.RandomDirction()298

299 self.image =self.images[self.direction]300 self.rect =self.image.get_rect()301 self.rect.left =left302 self.rect.top =top303 self.speed =speed304 self.EnemyFlag =False305

306 self.step = 60

307

308 defRandomDirction(self):309 num = random.randint(1,4)310 if num ==1:311 return "U"

312 elif num == 2:313 return "L"

314 elif num == 3:315 return "D"

316 elif num == 4:317 return "R"

318 defrandomMove(self):319 if self.step <0:320 self.direction =self.RandomDirction()321 self.step = 60

322 else:323 self.move()324 self.step -= 1

325 defshot(self):326 num =random.randint(1,100)327 if num < 4:328 returnBullet(self)329

330 defenemyTank_hit_MyTank(self):331 for enemy inMainGame.EnemyTankList:332 if MainGame.my_tank andMainGame.my_tank.live :333 ifpygame.sprite.collide_rect(MainGame.my_tank,enemy):334 self.stay()335

336

337

338

339 classBullet(BaseItem):340 def __init__(self,tank):341 self.image=pygame.image.load('img/enemymissile.gif')342 self.direction =tank.direction343 self.rect =self.image.get_rect()344 if self.direction == 'U':345 self.rect.left = tank.rect.left + tank.rect.width/2 - self.rect.width/2

346 self.rect.top = tank.rect.top -self.rect.height347 elif self.direction == 'D':348 self.rect.left = tank.rect.left + tank.rect.width/2 - self.rect.width/2

349 self.rect.top = tank.rect.top +tank.rect.height350 elif self.direction == 'L':351 self.rect.left = tank.rect.left - self.rect.width/2 -self.rect.width/2

352 self.rect.top = tank.rect.top +tank.rect.height/2 - self.rect.width/2

353 elif self.direction == 'R':354 self.rect.left = tank.rect.left +tank.rect.width355 self.rect.top = tank.rect.top + tank.rect.height/2 -self.rect.width/2

356 #子弹的速度

357 self.speed =6

358 #子弹状态

359 self.live =True360

361 defmove(self):362 if self.direction == 'U':363 if self.rect.top>0:364 self.rect.top -=self.speed365 else:366 self.live =False367 elif self.direction == 'R':368 if self.rect.left + self.rect.width<369 self.rect.left else:371 self.live="False372" elif self.direction="=" if self.rect.top self.rect.height else:376>0:379 self.rect.left -=self.speed380 else:381 self.live =False382369>

383 defdisplayBullet(self):384 MainGame.window.blit(self.image,self.rect)385

386 defmyBullet_hit_enemyTank(self):387 for enemyTank inMainGame.EnemyTankList:388 ifpygame.sprite.collide_rect(enemyTank,self):389 enemyTank.live =False390 self.live =False391

392 #创建爆炸对象

393 explode =Explode(enemyTank)394 MainGame.explodeList.append(explode)395 defenemyBullet_hit_myTank(self):396 if MainGame.my_tank andMainGame.my_tank.live:397 ifpygame.sprite.collide_rect(MainGame.my_tank,self):398 MainGame.my_tank.live =False399 self.live =False400

401 explode =Explode(MainGame.my_tank)402 MainGame.explodeList.append(explode)403

404 defwall_bullet(self):405 for wall inMainGame.wallList:406 ifpygame.sprite.collide_rect(wall,self):407 wall.hg -=1

408 self.live =False409 if wall.hg<=0:410 wall.live =False411

412

413 classWall():414 def __init__(self,left,top):415 self.image = pygame.image.load('img/steels.gif')416 self.rect =self.image.get_rect()417 self.rect.top =top418 self.rect.left =left419 self.live =True420 self.hg = 8

421

422 defdisplayWall(self):423 if self.live ==True:424 MainGame.window.blit(self.image,self.rect)425

426

427 classExplode():428 def __init__(self,tank):429 #爆炸的位置有坦克决定

430 self.rect =tank.rect431 self.images = [pygame.image.load('img/blast0.gif'),432 pygame.image.load('img/blast1.gif'),433 pygame.image.load('img/blast2.gif'),434 pygame.image.load('img/blast3.gif')]435 self.step =0436 self.image =self.images[self.step]437 self.live =True438

439 defdisplayExplode(self):440 if self.step

443 MainGame.window.blit(self.image,self.rect)444 else:445 self.live =False446 self.step =0447

448 classMusic():449 def __init__(self,filename):450 self.filename =filename451 #初始化音乐混合器

452 pygame.mixer.init()453 pygame.mixer.music.load(filename)454 defplay(self):455 pygame.mixer.music.play()456

457

458 if __name__ == '__main__':459 c =MainGame()460 c.starGame()

267>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值