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>