python实现坦克大战游戏

python开发的坦克大战游戏 


1
import pygame 2 from pygame.sprite import Sprite 3 import sys 4 import time 5 import random 6 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 class BaseItem(Sprite): 15 def __init__(self, color, width, height): 16 # Call the parent class (Sprite) constructor 17 pygame.sprite.Sprite.__init__(self) 18 19 class MainGame (): 20 21 window = None 22 my_tank = None 23 REC_TIME=0 24 #敌方坦克初始化 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 def starGame(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 while True: 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 and MainGame.my_tank.live: 59 MainGame.my_tank.displayTank() 60 else: 61 del MainGame.my_tank 62 MainGame.my_tank =None 63 #显示我方子弹 64 self.blitMyBullet() 65 #敌方坦克进行显示 66 self.blitEnenyTank() 67 #显示墙壁 68 self.blitWall() 69 #显示敌方子弹 70 self.blitEnenyBullet() 71 #显示爆炸效果 72 self.blitExplode() 73 if MainGame.my_tank and MainGame.my_tank.live: 74 if not MainGame.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 def creatWall(self): 87 for i in range(0,SCREEN_WIDTH,SCREEN_WIDTH//6): 88 top = SCREEN_HEIGHT//3 89 left = i 90 wall = Wall(left,top) 91 MainGame.wallList.append(wall) 92 93 def creatMyTank(self): 94 MainGame.my_tank = MyTank(SCREEN_WIDTH/2,SCREEN_HEIGHT/3*2) 95 music = Music("img/start.wav") 96 music.play() 97 98 def creatEnemyTank(self): 99 top = 100 100 for i in range(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 def blitWall(self): 107 for wall in MainGame.wallList: 108 if wall.live: 109 wall.displayWall() 110 else: 111 MainGame.wallList.remove(wall) 112 113 def blitEnenyTank(self): 114 "循环遍历敌方坦克,展示敌方坦克" 115 for enmeyTank in MainGame.EnemyTankList: 116 if enmeyTank.live: 117 enmeyTank.displayTank() 118 enmeyTank.randomMove() 119 EnemyBullet = enmeyTank.shot() 120 enmeyTank.hitWall() 121 enmeyTank.enemyTank_hit_MyTank() 122 #存储敌方子弹 123 if EnemyBullet: 124 MainGame.EnemyBulletList.append(EnemyBullet) 125 else: 126 MainGame.EnemyTankList.remove(enmeyTank) 127 MainGame.EnemyTankCount -=1 128 def blitMyBullet(self): 129 for bullet in MainGame.myBulleList: 130 if bullet.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 def blitEnenyBullet(self): 139 for bullet in MainGame.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 def blitExplode(self): 150 for explode in MainGame.explodeList: 151 if explode.live: 152 explode.displayExplode() 153 else: 154 MainGame.explodeList.remove(explode) 155 156 157 def endGame(self): 158 print("欢迎下次游戏") 159 sys.exit() 160 def getTextSuface(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 return textSurface 166 167 168 def getEvent(self): 169 '''获取所有事件''' 170 eventList= pygame.event.get() 171 for event in eventList: 172 if event.type == pygame.QUIT: 173 self.endGame() 174 if event.type == pygame.KEYDOWN: 175 if not MainGame.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 and MainGame.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 =False 185 print("按下向下的键,向下移动",) 186 elif event.key == pygame.K_UP: 187 MainGame.my_tank.direction = 'U' 188 #MainGame.my_tank.move() 189 MainGame.my_tank.stop = False 190 print("按下向上的键,向上移动") 191 elif event.key == pygame.K_LEFT: 192 MainGame.my_tank.direction = 'L' 193 #MainGame.my_tank.move() 194 MainGame.my_tank.stop = False 195 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 = False 200 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 and MainGame.my_tank.live: 216 MainGame.my_tank.stop=True 217 218 219 220 class Tank(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=left 233 self.rect.top = top 234 self.speed = 4 235 #控制坦克开关 236 self.stop = True 237 self.live = True 238 239 #保持原来的位置 240 self.oldLeft = self.rect.left 241 self.oldTop = self.rect.top 242 243 def hitWall(self): 244 for wall in MainGame.wallList: 245 if pygame.sprite.collide_rect(wall, self): 246 self.stay() 247 248 def stay(self): 249 self.rect.left = self.oldLeft 250 self.rect.top = self.oldTop 251 252 def shot(self): 253 return Bullet(self) 254 def move(self): 255 #保持原来的状态 256 self.oldLeft = self.rect.left 257 self.oldTop = self.rect.top 258 #判断坦克的方向进行移动 259 if self.direction =='U': 260 if self.rect.top>0: 261 self.rect.top -= self.speed 262 elif self.direction =='L': 263 if self.rect.left>0: 264 self.rect.left -=self.speed 265 elif self.direction =='D': 266 if self.rect.top +self.rect.height<SCREEN_HEIGHT: 267 self.rect.top +=self.speed 268 elif self.direction == 'R': 269 if self.rect.left+self.rect.height<SCREEN_WIDTH: 270 self.rect.left += self.speed 271 272 def displayTank(self): 273 self.image = self.images[self.direction] 274 MainGame.window.blit(self.image,self.rect) 275 276 class MyTank(Tank): 277 def __init__(self,left,top): 278 super().__init__(left,top) 279 280 def myTank_hit_enemyTank(self): 281 for enemyTank in MainGame.EnemyTankList: 282 if pygame.sprite.collide_rect(enemyTank, self): 283 self.stay() 284 285 class EnemyTank(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 = left 302 self.rect.top = top 303 self.speed =speed 304 self.EnemyFlag = False 305 306 self.step = 60 307 308 def RandomDirction(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 def randomMove(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 def shot(self): 326 num =random.randint(1,100) 327 if num < 4: 328 return Bullet(self) 329 330 def enemyTank_hit_MyTank(self): 331 for enemy in MainGame.EnemyTankList: 332 if MainGame.my_tank and MainGame.my_tank.live : 333 if pygame.sprite.collide_rect(MainGame.my_tank,enemy): 334 self.stay() 335 336 337 338 339 class Bullet(BaseItem): 340 def __init__(self,tank): 341 self.image=pygame.image.load('img/enemymissile.gif') 342 self.direction = tank.direction 343 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.height 347 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.height 350 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.width 355 self.rect.top = tank.rect.top + tank.rect.height/2 -self.rect.width/2 356 #子弹的速度 357 self.speed =6 358 #子弹状态 359 self.live = True 360 361 def move(self): 362 if self.direction == 'U': 363 if self.rect.top> 0: 364 self.rect.top -= self.speed 365 else: 366 self.live =False 367 elif self.direction == 'R': 368 if self.rect.left + self.rect.width<SCREEN_WIDTH: 369 self.rect.left += self.speed 370 else: 371 self.live =False 372 elif self.direction == 'D': 373 if self.rect.top + self.rect.height< SCREEN_HEIGHT: 374 self.rect.top += self.speed 375 else: 376 self.live = False 377 elif self.direction == 'L': 378 if self.rect.left>0: 379 self.rect.left -= self.speed 380 else: 381 self.live =False 382 383 def displayBullet(self): 384 MainGame.window.blit(self.image,self.rect) 385 386 def myBullet_hit_enemyTank(self): 387 for enemyTank in MainGame.EnemyTankList: 388 if pygame.sprite.collide_rect(enemyTank,self): 389 enemyTank.live = False 390 self.live = False 391 392 #创建爆炸对象 393 explode = Explode(enemyTank) 394 MainGame.explodeList.append(explode) 395 def enemyBullet_hit_myTank(self): 396 if MainGame.my_tank and MainGame.my_tank.live: 397 if pygame.sprite.collide_rect(MainGame.my_tank,self): 398 MainGame.my_tank.live = False 399 self.live =False 400 401 explode = Explode(MainGame.my_tank) 402 MainGame.explodeList.append(explode) 403 404 def wall_bullet(self): 405 for wall in MainGame.wallList: 406 if pygame.sprite.collide_rect(wall,self): 407 wall.hg -=1 408 self.live =False 409 if wall.hg<=0: 410 wall.live = False 411 412 413 class Wall(): 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 = top 418 self.rect.left =left 419 self.live =True 420 self.hg = 8 421 422 def displayWall(self): 423 if self.live ==True: 424 MainGame.window.blit(self.image,self.rect) 425 426 427 class Explode(): 428 def __init__(self,tank): 429 # 爆炸的位置有坦克决定 430 self.rect = tank.rect 431 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 = 0 436 self.image = self.images[self.step] 437 self.live =True 438 439 def displayExplode(self): 440 if self.step < len(self.images): 441 self.image = self.images[self.step] 442 self.step +=1 443 MainGame.window.blit(self.image,self.rect) 444 else: 445 self.live = False 446 self.step =0 447 448 class Music(): 449 def __init__(self,filename): 450 self.filename = filename 451 #初始化音乐混合器 452 pygame.mixer.init() 453 pygame.mixer.music.load(filename) 454 def play(self): 455 pygame.mixer.music.play() 456 457 458 if __name__ == '__main__': 459 c = MainGame() 460 c.starGame()

转载于:https://www.cnblogs.com/clq-study/p/11048490.html

猜你喜欢

转载自blog.csdn.net/weixin_34217773/article/details/93283910