zoukankan      html  css  js  c++  java
  • Python开发的坦克大战游戏

    Python开发的坦克大战游戏

    python开发的坦克大战游戏
      import pygame
      from pygame.sprite import Sprite
      import sys
      import time
      import random
      
      SCREEN_WIDTH = 780
      SCREEN_HEIGHT = 500
      BG_COLOR = pygame.Color(0,0,0)
     TEXT_COLOR = pygame.Color(255,0,0)
     #复活次数
     
     #定义一个精灵类
     class BaseItem(Sprite):
         def __init__(self, color, width, height):
             # Call the parent class (Sprite) constructor
            pygame.sprite.Sprite.__init__(self)
     
     class MainGame ():
     
         window = None
         my_tank = None
         REC_TIME=0
         #敌方坦克初始化
         EnemyTankList = []
         EnemyTankCount = 5
         #存储我方子弹列表
         myBulleList = []
         #存储敌方子弹
         EnemyBulletList = []
         #创建爆炸对象列表
         explodeList = []
     
         #创建墙壁列表
         wallList =[]
         def __init__(self):
             pass
     
         def starGame(self):
             #初始化,设置标题,屏幕大小
             pygame.display.init()
             MainGame.window =pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT))
             pygame.display.set_caption("坦克大战1.03")
             #初始化我方坦克
             self.creatMyTank()
             # 初始化敌方坦克
             self.creatEnemyTank()
             #初始化墙壁
             self.creatWall()
             while True:
                 #填充颜色
                 MainGame.window.fill(BG_COLOR)
                 #获取事件
                 self.getEvent()
                 #绘制文字
                 MainGame.window.blit(self.getTextSuface("敌方坦克剩余数量%d"%MainGame.EnemyTankCount),(SCREEN_HEIGHT/2,20))
                 #调用我方坦克进行显示
                 if MainGame.my_tank and MainGame.my_tank.live:
                     MainGame.my_tank.displayTank()
                 else:
                     del MainGame.my_tank
                     MainGame.my_tank =None
                 #显示我方子弹
                 self.blitMyBullet()
                 #敌方坦克进行显示
                 self.blitEnenyTank()
                 #显示墙壁
                 self.blitWall()
                 #显示敌方子弹
                 self.blitEnenyBullet()
                 #显示爆炸效果
                 self.blitExplode()
                 if MainGame.my_tank and MainGame.my_tank.live:
                     if not MainGame.my_tank.stop:
                         MainGame.my_tank.move()
                         MainGame.my_tank.hitWall()
                         MainGame.my_tank.myTank_hit_enemyTank()
                 if MainGame.EnemyTankCount == 0:
                     MainGame.window.blit(self.getTextSuface('恭喜你,顺利通过'), (SCREEN_HEIGHT/2, SCREEN_WIDTH/2))
                     time.sleep(2)
                     self.endGame()
                 pygame.display.update()
                 time.sleep(0.02)
     
     
         def creatWall(self):
             for i in range(0,SCREEN_WIDTH,SCREEN_WIDTH//6):
                 top = SCREEN_HEIGHT//3
                 left = i
                 wall = Wall(left,top)
                 MainGame.wallList.append(wall)
     
         def creatMyTank(self):
             MainGame.my_tank = MyTank(SCREEN_WIDTH/2,SCREEN_HEIGHT/3*2)
             music = Music("img/start.wav")
             music.play()
     
         def creatEnemyTank(self):
             top = 100
             for i in range(MainGame.EnemyTankCount):
                 left = random.randint(0,600)
                 speed = random.randint(1,4)
                 enmy =EnemyTank(left,top,speed)
                 MainGame.EnemyTankList.append(enmy)
     
         def blitWall(self):
             for wall in MainGame.wallList:
                 if wall.live:
                     wall.displayWall()
                 else:
                     MainGame.wallList.remove(wall)
     
         def blitEnenyTank(self):
             "循环遍历敌方坦克,展示敌方坦克"
             for enmeyTank in MainGame.EnemyTankList:
                 if enmeyTank.live:
                     enmeyTank.displayTank()
                     enmeyTank.randomMove()
                     EnemyBullet = enmeyTank.shot()
                     enmeyTank.hitWall()
                     enmeyTank.enemyTank_hit_MyTank()
                     #存储敌方子弹
                     if EnemyBullet:
                          MainGame.EnemyBulletList.append(EnemyBullet)
                 else:
                     MainGame.EnemyTankList.remove(enmeyTank)
                     MainGame.EnemyTankCount -=1
         def blitMyBullet(self):
             for bullet in MainGame.myBulleList:
                 if bullet.live:
                     bullet.displayBullet()
                     bullet.move()
                     bullet.myBullet_hit_enemyTank()
                     bullet.wall_bullet()
                 else:
                     MainGame.myBulleList.remove(bullet)
     
         def blitEnenyBullet(self):
              for bullet in MainGame.EnemyBulletList:
                  if bullet.live:  #随机会产生None
                      bullet.displayBullet()
                      bullet.move()
                      bullet.enemyBullet_hit_myTank()
                      bullet.wall_bullet()
                  else:
                      MainGame.EnemyBulletList.remove(bullet)
     
     
         def blitExplode(self):
             for explode in MainGame.explodeList:
                 if explode.live:
                     explode.displayExplode()
                 else:
                     MainGame.explodeList.remove(explode)
     
     
         def endGame(self):
             print("欢迎下次游戏")
             sys.exit()
         def getTextSuface(self,text):
             pygame.font.init()
            # print(pygame.font.get_fonts())
             font = pygame.font.SysFont('kaiti',18)
             textSurface =font.render(text,True,TEXT_COLOR)
             return  textSurface
     
     
         def getEvent(self):
             '''获取所有事件'''
             eventList= pygame.event.get()
             for event in eventList:
                 if event.type == pygame.QUIT:
                     self.endGame()
                 if event.type == pygame.KEYDOWN:
                     if not MainGame.my_tank:
                         if event.key ==pygame.K_ESCAPE:
                             if MainGame.REC_TIME < 3:
                                  self.creatMyTank()
                                  MainGame.REC_TIME +=1
                     if MainGame.my_tank and MainGame.my_tank.live:
                         if event.key ==pygame.K_DOWN:
                             MainGame.my_tank.direction ='D'
                             #MainGame.my_tank.move()
                             MainGame.my_tank.stop =False
                             print("按下向下的键,向下移动",)
                         elif event.key == pygame.K_UP:
                             MainGame.my_tank.direction = 'U'
                             #MainGame.my_tank.move()
                             MainGame.my_tank.stop = False
                             print("按下向上的键,向上移动")
                         elif event.key == pygame.K_LEFT:
                             MainGame.my_tank.direction = 'L'
                             #MainGame.my_tank.move()
                             MainGame.my_tank.stop = False
                             print("按下向左的键,向左移动", MainGame.my_tank.direction)
                         elif event.key == pygame.K_RIGHT:
                             MainGame.my_tank.direction = 'R'
                             #MainGame.my_tank.move()
                             MainGame.my_tank.stop = False
                             print("按下向右的键,向右移动", MainGame.my_tank.direction)
     
                         elif event.key == pygame.K_SPACE:
                             print("发射子弹")
                             #创建我方子弹
                             if len(MainGame.myBulleList) < 3:
                                 myBullet =  Bullet(MainGame.my_tank)
                                 MainGame.myBulleList.append(myBullet)
     
                                 # 发射子弹音效
                                 ShotMusic = Music('img/hit.wav')
                                 ShotMusic.play()
     
                 elif event.type == pygame.KEYUP:
                     if event.key ==pygame.K_UP or event.key == pygame.K_DOWN or event.key ==pygame.K_LEFT or event.key ==pygame.K_RIGHT:
                        if MainGame.my_tank and MainGame.my_tank.live:
                             MainGame.my_tank.stop=True
     
     
     
     class  Tank(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 ='U'
             self.image = self.images[self.direction]
             self.rect = self.image.get_rect()
             #设置放置的位置
             self.rect.left=left
             self.rect.top = top
             self.speed = 4
             #控制坦克开关
             self.stop = True
             self.live = True
     
             #保持原来的位置
             self.oldLeft = self.rect.left
             self.oldTop = self.rect.top
     
         def hitWall(self):
             for wall in MainGame.wallList:
                 if pygame.sprite.collide_rect(wall, self):
                     self.stay()
     
         def stay(self):
             self.rect.left = self.oldLeft
             self.rect.top = self.oldTop
     
         def shot(self):
             return Bullet(self)
         def move(self):
             #保持原来的状态
             self.oldLeft = self.rect.left
             self.oldTop = self.rect.top
             #判断坦克的方向进行移动
             if self.direction =='U':
                 if self.rect.top>0:
                    self.rect.top -= self.speed
             elif self.direction =='L':
                 if self.rect.left>0:
                  self.rect.left -=self.speed
             elif self.direction =='D':
                 if self.rect.top +self.rect.height<SCREEN_HEIGHT:
                     self.rect.top +=self.speed
             elif self.direction == 'R':
                 if self.rect.left+self.rect.height<SCREEN_WIDTH:
                     self.rect.left += self.speed
     
         def displayTank(self):
             self.image = self.images[self.direction]
             MainGame.window.blit(self.image,self.rect)
     
     class MyTank(Tank):
         def __init__(self,left,top):
             super().__init__(left,top)
     
         def myTank_hit_enemyTank(self):
             for enemyTank in MainGame.EnemyTankList:
                 if pygame.sprite.collide_rect(enemyTank, self):
                     self.stay()
     
     class EnemyTank(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.RandomDirction()
     
             self.image = self.images[self.direction]
             self.rect =self.image.get_rect()
             self.rect.left = left
             self.rect.top = top
             self.speed =speed
             self.EnemyFlag = False
     
             self.step = 60
     
         def RandomDirction(self):
             num = random.randint(1,4)
             if num ==1:
                 return "U"
             elif num == 2:
                 return "L"
             elif num == 3:
                 return "D"
             elif num == 4:
                 return "R"
         def randomMove(self):
             if self.step < 0:
                 self.direction = self.RandomDirction()
                 self.step = 60
             else:
                 self.move()
                 self.step -= 1
         def shot(self):
             num =random.randint(1,100)
             if num < 4:
                 return Bullet(self)
     
         def enemyTank_hit_MyTank(self):
             for enemy in MainGame.EnemyTankList:
                 if MainGame.my_tank and  MainGame.my_tank.live :
                     if pygame.sprite.collide_rect(MainGame.my_tank,enemy):
                         self.stay()
     
     
     
     
     class   Bullet(BaseItem):
         def __init__(self,tank):
             self.image=pygame.image.load('img/enemymissile.gif')
             self.direction = tank.direction
             self.rect = self.image.get_rect()
             if self.direction == 'U':
                 self.rect.left = tank.rect.left + tank.rect.width/2 - self.rect.width/2
                 self.rect.top = tank.rect.top -self.rect.height
             elif self.direction == 'D':
                 self.rect.left = tank.rect.left + tank.rect.width/2 - self.rect.width/2
                 self.rect.top = tank.rect.top + tank.rect.height
             elif self.direction == 'L':
                 self.rect.left = tank.rect.left  - self.rect.width/2 -self.rect.width/2
                 self.rect.top = tank.rect.top +tank.rect.height/2 - self.rect.width/2
             elif self.direction == 'R':
                 self.rect.left = tank.rect.left + tank.rect.width
                 self.rect.top = tank.rect.top + tank.rect.height/2 -self.rect.width/2
             #子弹的速度
             self.speed =6
             #子弹状态
             self.live = True
     
         def move(self):
             if self.direction == 'U':
                 if self.rect.top> 0:
                     self.rect.top -= self.speed
                 else:
                    self.live =False
             elif self.direction == 'R':
                 if self.rect.left + self.rect.width<SCREEN_WIDTH:
                     self.rect.left += self.speed
                 else:
                     self.live =False
             elif self.direction == 'D':
                 if self.rect.top + self.rect.height< SCREEN_HEIGHT:
                     self.rect.top += self.speed
                 else:
                     self.live = False
             elif self.direction == 'L':
                 if self.rect.left>0:
                     self.rect.left -= self.speed
                 else:
                     self.live =False
     
         def displayBullet(self):
             MainGame.window.blit(self.image,self.rect)
     
         def myBullet_hit_enemyTank(self):
             for enemyTank in MainGame.EnemyTankList:
                 if pygame.sprite.collide_rect(enemyTank,self):
                     enemyTank.live = False
                     self.live = False
     
                     #创建爆炸对象
                     explode = Explode(enemyTank)
                     MainGame.explodeList.append(explode)
         def enemyBullet_hit_myTank(self):
             if MainGame.my_tank and MainGame.my_tank.live:
                 if pygame.sprite.collide_rect(MainGame.my_tank,self):
                     MainGame.my_tank.live = False
                     self.live =False
     
                     explode = Explode(MainGame.my_tank)
                     MainGame.explodeList.append(explode)
     
         def wall_bullet(self):
             for wall in MainGame.wallList:
                     if pygame.sprite.collide_rect(wall,self):
                         wall.hg -=1
                         self.live =False
                         if wall.hg<=0:
                             wall.live = False
     
     
     class Wall():
         def __init__(self,left,top):
             self.image = pygame.image.load('img/steels.gif')
             self.rect = self.image.get_rect()
             self.rect.top = top
             self.rect.left =left
             self.live =True
             self.hg = 8
     
         def displayWall(self):
             if self.live ==True:
                 MainGame.window.blit(self.image,self.rect)
     
     
     class Explode():
         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')]
             self.step = 0
             self.image = self.images[self.step]
             self.live =True
     
         def displayExplode(self):
             if self.step < len(self.images):
                 self.image = self.images[self.step]
                 self.step +=1
                 MainGame.window.blit(self.image,self.rect)
             else:
                 self.live = False
                 self.step =0
     
     class Music():
         def __init__(self,filename):
             self.filename = filename
             #初始化音乐混合器
             pygame.mixer.init()
             pygame.mixer.music.load(filename)
         def play(self):
             pygame.mixer.music.play()
     
     
     if __name__ == '__main__':
         c = MainGame()
         c.starGame()
  • 相关阅读:
    数据结构与算法问题 二叉搜索树
    hdu 2066 一个人的旅行
    什么是string interning(字符串驻留)以及python中字符串的intern机制
    云计算时代告别phpMyAdmin
    HTML5吃豆豆游戏开发实战(一)使用Canvas绘制游戏主角
    菜鸟nginx源代码剖析数据结构篇(七) 哈希表 ngx_hash_t(下)
    条件传送和条件控制转移
    例题2.8 总是整数 LA4119
    leetCode 82.Remove Duplicates from Sorted List II (删除排序链表的反复II) 解题思路和方法
    什么是大数据精准营销?
  • 原文地址:https://www.cnblogs.com/ilovecpp/p/13025266.html
Copyright © 2011-2022 走看看