1. 程式人生 > 其它 >python小遊戲經典坦克大戰-實驗設計

python小遊戲經典坦克大戰-實驗設計

技術標籤:python遊戲

一. 遊戲流程概述

遊戲基本規則:

  1. 按上下左右鍵移動我方坦克,按空格鍵進行發射子彈,擊中坦克,坦克爆炸消失。若我方坦克被子彈擊中或撞上,我方坦克死亡按ESC鍵可以重生。
  2. 敵方坦克功能:白色敵方坦克為一般坦克。白色較小敵方坦克速度快,射擊子彈頻繁。黃色坦克被擊中後會隨機生成白色小坦克。
  3. 地圖:白色“鐵”地圖:子彈不能穿過此地圖,坦克不能穿過此地圖。藍色“水地圖”子彈和坦克均可以穿過此地圖。

遊戲流程圖基本流程如下:

  1. 執行:run “TankGame.py”,進入初始化介面
  2. 初始化:顯示視窗大小及內容、載入圖片和背景音樂,開始遊戲。
  3. 遊戲控制元件:玩家可以通過鍵盤和空格鍵來完成移動坦克,射擊子彈。還可通過按ESC鍵重生
  4. 遊戲結束:關閉視窗

二.各功能模組

1.MainGame主類
初始化視窗,視窗標題;標題初始化我方坦克,敵方坦克;初始化牆壁;

#主類
class MainGame():
    window=None
    my_tank=None
    #儲存敵方坦克的列表
    enemyTankList=[]
    enemyTankList2=[]
    enemyTankList3=[]
    #定義敵方坦克數量
    enemyTankCount=4
    enemyTankCount2=2
    enemyTankCount3=2
    #儲存我方子彈列表
    myBulletList=
[] #儲存敵方子彈的列表 enemyBulletList=[] enemyBulletList2=[] enemyBulletList3=[] #儲存爆炸效果的列表 explodeList=[] explodeList2=[] explodeList3=[] #儲存牆壁的列表 wallList=[] wallList2=[] def __init__(self): pass #開始遊戲 def startGame(self): #載入主視窗 #初始化視窗
pygame.display.init #設定視窗的大小及顯示 MainGame.window=pygame.display.set_mode([SCREEN_WIDTH,SCREEN_HIGHt]) # 初始化我方坦克 self.createMyTank() #初始化敵方坦克,並將敵方坦克新增到列表中 self.creatEnemyTank() #初始化牆壁 self.createWall() #設定視窗標題 pygame.display.set_caption('坦克大戰1.0') #視窗一直進行顯示 while True: #使坦克的移動速度慢一點 time.sleep(0.02) #給視窗填充顏色 MainGame.window.fill(BG_COLOR) #獲取事件 self.getEvent() #繪製文字-在視窗這個表面繼續疊加繪製 MainGame.window.blit(self.getTextSurface("敵方坦克剩餘數量%d"%(len(MainGame.enemyTankList)+len(MainGame.enemyTankList2)+len(MainGame.enemyTankList3))),(10,10)) #呼叫坦克顯示的方法 #判斷我方坦克是否存活 if MainGame.my_tank and MainGame.my_tank.live: MainGame.my_tank.displayTank() else: #刪除我方坦克 del MainGame.my_tank MainGame.my_tank=None #迴圈遍歷敵方坦克列表,展示敵方坦克 self.blitEnemyTank() #迴圈遍歷顯示我方坦克子彈 self.blitMyBullet() #迴圈遍歷敵方子彈列表,展示敵方子彈 self.blitEnemyBullet() #迴圈遍歷爆炸列表,展示爆炸效果 self.blitExplode() #迴圈遍歷牆壁列表,展示牆壁 self.blitWall() #呼叫移動方法 #如果坦克的開關時開啟,才可以移動 if MainGame.my_tank and MainGame.my_tank.live: if not MainGame.my_tank.stop: MainGame.my_tank.move() #檢測我方坦克是否與牆壁發生碰撞 MainGame.my_tank.hitWall() #持續展示視窗 pygame.display.update() #迴圈遍歷牆壁列表,展示牆壁 def blitWall(self): for wall in MainGame.wallList: #呼叫牆壁的顯示方法 wall.displayWall() #迴圈遍歷水圖 for wall in MainGame.wallList2: wall.displayWall() #初始化牆壁 def createWall(self): #增加鐵圖 wall5=Wall(440,50) wall1=Wall(500,50) wall2=Wall(560,50) wall3=Wall(620,50) wall4=Wall(680,50) wall10=Wall(740,50) MainGame.wallList.append(wall1) MainGame.wallList.append(wall2) MainGame.wallList.append(wall3) MainGame.wallList.append(wall4) MainGame.wallList.append(wall5) MainGame.wallList.append(wall10) i=1 sum=50 while i<=10: i+=1 sum+=60 wall=Wall(440,sum) MainGame.wallList.append(wall) wall6=Wall(500,650) wall7=Wall(560,650) wall8=Wall(620,650) wall9=Wall(680,650) wall11=Wall(740,650) MainGame.wallList.append(wall6) MainGame.wallList.append(wall7) MainGame.wallList.append(wall8) MainGame.wallList.append(wall9) MainGame.wallList.append(wall11) wall12=Wall(500,410) wall13=Wall(560,410) wall14=Wall(620,410) wall15=Wall(680,410) wall16=Wall(740,410) MainGame.wallList.append(wall12) MainGame.wallList.append(wall13) MainGame.wallList.append(wall14) MainGame.wallList.append(wall15) MainGame.wallList.append(wall16) wall17=Wall(740,410) wall18=Wall(740,470) wall19=Wall(740,530) wall20=Wall(740,590) MainGame.wallList.append(wall17) MainGame.wallList.append(wall18) MainGame.wallList.append(wall19) MainGame.wallList.append(wall20) #迴圈遍歷增加水圖 #for i in range(6): #初始化牆壁 #wall=Wall2(i*200,100) #將牆壁新增到列表中 # MainGame.wallList2.append(wall) #迴圈遍歷增加水圖 #初始化牆壁 walla=Wall2(200,100) wallb=Wall2(360,600) wallb1=Wall2(300,600) wallb2=Wall2(2400,600) wallb3=Wall2(180,600) wallc=Wall2(800,200) walld=Wall2(900,500) walle=Wall2(1000,100) wallf=Wall2(1100,720) #將牆壁新增到列表中 MainGame.wallList2.append(walla) MainGame.wallList2.append(wallb) MainGame.wallList2.append(wallc) MainGame.wallList2.append(walld) MainGame.wallList2.append(walle) MainGame.wallList2.append(wallf) MainGame.wallList2.append(wallb1) MainGame.wallList2.append(wallb2) MainGame.wallList2.append(wallb3) #建立我方坦克的方法、 def createMyTank(self): MainGame.my_tank=Tank(600,720) #建立music物件 music=Music('img/start.wav') #播放 music.play() #初始化敵方坦克,並將敵方坦克新增到列表中 def creatEnemyTank(self): top=100 #迴圈生成第一種敵方坦克 for i in range(MainGame.enemyTankCount-1): left=random.randint(0,430) speed=random.randint(1,3) enemy=EnemyTank(left,top,speed) MainGame.enemyTankList.append(enemy) left=random.randint(780,1200) top1=random.randint(100,500) enemy=EnemyTank(left,top1,speed) MainGame.enemyTankList.append(enemy) #迴圈生成第二種敵方坦克 for i in range(MainGame.enemyTankCount2-1): left=random.randint(0,430) speed=5 enemy=EnemyTank2(left,top,speed) MainGame.enemyTankList2.append(enemy) left=random.randint(750,1200) top1=random.randint(100,500) enemya=EnemyTank(left,top1,speed) MainGame.enemyTankList2.append(enemya) #迴圈生成第三種敵方坦克 for i in range(MainGame.enemyTankCount3): left=random.randint(0,430) speed=random.randint(1,3) enemy=EnemyTank3(left,top,speed) MainGame.enemyTankList3.append(enemy) #迴圈展示爆炸效果 def blitExplode(self): for explod in MainGame.explodeList: #判斷是否活著 if explod.live: #展示 explod.displayExplode() else: #在爆炸列表中移除 MainGame.explodeList.remove(explod) for explod in MainGame.explodeList2: #判斷是否活著 if explod.live: #展示 explod.displayExplode() else: #在爆炸列表中移除 MainGame.explodeList2.remove(explod) for explod in MainGame.explodeList3: #判斷是否活著 if explod.live: #展示 explod.displayExplode() else: #在爆炸列表中移除 MainGame.explodeList3.remove(explod) #迴圈遍歷敵方坦克列表,展示敵方坦克 def blitEnemyTank(self): #迴圈展示第1種坦克 for enemyTank in MainGame.enemyTankList: #判斷當前敵方坦克是否活著 if enemyTank.live: enemyTank.displayTank() enemyTank.randMove() #呼叫檢測是否與牆壁碰撞 enemyTank.hitWall() #發射子彈 enemyBullet=enemyTank.shot() #敵方子彈是否是NOne,如果不位None則新增到敵方子彈列表中 if enemyBullet: #將敵方子彈儲存到敵方列表中 MainGame.enemyBulletList.append(enemyBullet) else:#不活著,從敵方坦克列表中移除 MainGame.enemyTankList.remove(enemyTank) music=Music('img/fire.wav') music.play() #迴圈展示第二種坦克 for enemyTank in MainGame.enemyTankList2: #判斷當前坦克是否還活著 if enemyTank.live: enemyTank.displayTank() enemyTank.randMove() #呼叫檢測是否與牆壁碰撞 enemyTank.hitWall() #發射子彈 enemyBullet2=enemyTank.shot() if enemyBullet2: #將敵方子彈儲存到敵方列表中 MainGame.enemyBulletList2.append(enemyBullet2) else:#不活著,從敵方坦克列表中移除 MainGame.enemyTankList2.remove(enemyTank) music=Music('img/fire.wav') music.play() #迴圈展示第三種坦克 for enemyTank in MainGame.enemyTankList3: #判斷當前坦克是否還活著 if enemyTank.live: enemyTank.displayTank() enemyTank.randMove() #呼叫檢測是否與牆壁碰撞 enemyTank.hitWall() #發射子彈 enemyBullet3=enemyTank.shot() if enemyBullet3: #將敵方子彈儲存到敵方列表中 MainGame.enemyBulletList3.append(enemyBullet3) else:#不活著,從敵方坦克列表中移除 MainGame.enemyTankList3.remove(enemyTank) music=Music('img/fire.wav') music.play() #迴圈生成第二種敵方坦克 top=100 left=random.randint(0,600) speed=5 enemy=EnemyTank2(left,top,speed) MainGame.enemyTankList2.append(enemy) #迴圈遍歷我方子彈儲存列表 def blitMyBullet(self): for myBullet in MainGame.myBulletList: #判斷當前的子彈是否是活的狀態,如果是則進行移動,否者在列表中刪除 if myBullet.live: myBullet.displayBullet() #呼叫子彈移動的方法 myBullet.move() #我方子彈是否與敵方坦克發生碰撞 myBullet.myBullet_hit_enemyTank() #檢測我方子彈是否與牆壁碰撞 myBullet.hitWall() #否則在列表中刪除 else: MainGame.myBulletList.remove(myBullet) #迴圈遍歷敵方子彈列表,展示敵方子彈 def blitEnemyBullet(self): for enemyBullet in MainGame.enemyBulletList: if enemyBullet.live: enemyBullet.displayBullet() enemyBullet.move() #呼叫敵方子彈與我方坦克碰撞的方法 enemyBullet.enemyBullet_hit_myTank() #檢測敵方子彈是否與牆壁碰撞 enemyBullet.hitWall() else: MainGame.enemyBulletList.remove(enemyBullet) for enemyBullet in MainGame.enemyBulletList2: if enemyBullet.live: enemyBullet.displayBullet() enemyBullet.move() #呼叫敵方子彈與我方坦克碰撞的方法 enemyBullet.enemyBullet_hit_myTank() #檢測敵方子彈是否與牆壁碰撞 enemyBullet.hitWall() else: MainGame.enemyBulletList2.remove(enemyBullet) for enemyBullet in MainGame.enemyBulletList3: if enemyBullet.live: enemyBullet.displayBullet() enemyBullet.move() #呼叫敵方子彈與我方坦克碰撞的方法 enemyBullet.enemyBullet_hit_myTank() #檢測敵方子彈是否與牆壁碰撞 enemyBullet.hitWall() else: MainGame.enemyBulletList3.remove(enemyBullet) #結束遊戲 def endGame(self): print("遊戲結束") exit() ##左上角文字的繪製 def getTextSurface(self,text): #初始化字型模組 pygame.font.init() #print(pygame.font.get_fonts())#檢視所有字型名稱 #獲取字型物件 font=pygame.font.SysFont('kaiti',18)#宋體,18號 #繪製文字資訊 textSurFace=font.render(text,True,TEXT_COLOR)#第一個引數text-文字資訊;第二個引數鋸齒;第三個引數字型顏色 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: #判斷按下的是esc,讓坦克重生 if event.key==pygame.K_ESCAPE: #讓坦克重生呼叫建立坦克的方法 self.createMyTank() if MainGame.my_tank and MainGame.my_tank.live: if event.key==pygame.K_LEFT: #切換方向 MainGame.my_tank.direction='L' #修改開關的狀態 MainGame.my_tank.stop=False #MainGame.my_tank.move() print("按下左鍵,坦克左移") elif event.key==pygame.K_RIGHT: #切換方向 MainGame.my_tank.direction='R' #修改開關的狀態 MainGame.my_tank.stop=False #MainGame.my_tank.move() print("按下右鍵,坦克右移") elif event.key==pygame.K_UP: #切換方向 MainGame.my_tank.direction='U' #修改開關的狀態 MainGame.my_tank.stop=False #MainGame.my_tank.move() print("按下上鍵,坦克上移") elif event.key==pygame.K_DOWN: #切換方向 MainGame.my_tank.direction='D' #修改開關的狀態 MainGame.my_tank.stop=False #MainGame.my_tank.move() print("按下下鍵,坦克下移") elif event.key==pygame.K_SPACE: print('子彈發射') #如果當前我方子彈列表的大小,小於等於3建立我方坦克發射子彈 if len(MainGame.myBulletList)<=3: myBullet=Bullet(MainGame.my_tank) MainGame.myBulletList.append(myBullet) #我發坦克發射子彈新增音效 music=Music('img/hit.wav') music.play() #鬆開方向鍵,坦克停止移動,修改坦克的開關狀態 if event.type==pygame.KEYUP: #判斷鬆開的鍵使上下左右時候才停止坦克移動 if event.key==pygame.K_UP or event.key==pygame.K_LEFT or event.key==pygame.K_DOWN or event.key==pygame.K_RIGHT: if MainGame.my_tank and MainGame.my_tank.live: MainGame.my_tank.stop=True

2.Tank類
Tank的圖片載入,移動,射擊,獲取其位置,檢測坦克是否與牆壁發射碰撞,Tank的展示。

#坦克類
class Tank(BaseItem):

    #初始化,新增坦克的位置,距離左邊left,距離上邊top
    def __init__(self,left,top):
        #1.鍵值隊集合
        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'),
        }
        #2.方向
        self.direction='U'
        #3.根據當前圖片的方向獲取圖片
        self.image=self.images[self.direction]
        #4.根據圖片獲取區域
        self.rect=self.image.get_rect()
        #5.設定區域left和top
        self.rect.left=left
        self.rect.top=top
        #6.速度決定移動的快慢
        self.speed=5
        #7.坦克移動的開關
        self.stop=True
        #是否活著
        self.live=True
        #新增屬性
        self.oldLeft=self.rect.left
        self.oldTop=self.rect.top

         
    #移動
    def move(self):
        #移動後記錄原座標
        self.oldLeft=self.rect.left
        self.oldTop=self.rect.top
        #判斷坦克的方向進行移動
        if self.direction=='L':
            if self.rect.left>0:
                self.rect.left-=self.speed
        elif self.direction=='U':
            if self.rect.top>0:
                self.rect.top-=self.speed
        elif self.direction=='D':
            if self.rect.top+self.rect.height<SCREEN_HIGHt:
                self.rect.top+=self.speed
        elif self.direction=='R':
            if self.rect.left+self.rect.height<SCREEN_WIDTH:
                self.rect.left+=self.speed

    #射擊
    def shot(self):
        return Bullet(self)
    #
    def stay(self):
        self.rect.left=self.oldLeft
        self.rect.top=self.oldTop


    #檢測坦克是否與牆壁發生碰撞
    def hitWall(self):
        for wall in MainGame.wallList:
            if pygame.sprite.collide_rect(self,wall):
                #將座標設定為移動之前的座標
                self.stay()
    #展示坦克的方法
    def displayTank(self):
        #獲取展示的物件——坦克那張朝向的圖片
        self.image = self.images[self.direction]
        #呼叫blit方法展示——在大的表面上展示小的表面
        MainGame.window.blit(self.image,self.rect)


#我方坦克
class MyTank(Tank):
    def _int_(self):
        pass

3.EnemyTank(三種敵方坦克類)
載入每一種EnemyTank的圖片;隨機生成敵方坦克的方向;敵法坦克隨機移動的方法。

#敵方坦克
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.randDirection()
        #根據方向獲取圖片
        self.image=self.images[self.direction]
        #區域
        self.rect=self.image.get_rect()
        #對left和top進行賦值
        self.rect.top=top
        self.rect.left=left
        #速度
        self.speed=speed
        #移動開關
        self.stop=True
        #新增一個步數變數
        self.step=60


    #隨機生成敵方坦克的方向
    def randDirection(self):
        num=random.randint(1,4)
        if num==1:
            return 'U'
        elif num==2:
            return 'L'
        elif num==3:
            return 'R'
        elif num==4:
            return 'D'
    
    #敵方坦克隨機移動的方法
    def randMove(self):
        if self.step<=0:
            #修改方向
            self.direction=self.randDirection()
            #讓步數復位
            self.step=20
        else:
            self.move()
            #讓步數遞減
            self.step-=1
    #重寫shot()
    def shot(self):
        #隨機生成100以內的數
        num=random.randint(1,300)
        if num<10:
            return Bullet(self)


#敵方第二種坦克
class EnemyTank2(Tank):
    def __init__(self,left,top,speed):
        #呼叫父類的初始化方法
        super(EnemyTank2,self).__init__(left,top)
        #載入圖片集
        self.images={
            'U':pygame.image.load('img/enemy2U.gif'),
            'D':pygame.image.load('img/enemy2D.gif'),
            'L':pygame.image.load('img/enemy2L.gif'),
            'R':pygame.image.load('img/enemy2R.gif'),
        }

        #方向,隨機生成敵方坦克的方向
        self.direction=self.randDirection()
        #根據方向獲取圖片
        self.image=self.images[self.direction]
        #區域
        self.rect=self.image.get_rect()
        #對left和top進行賦值
        self.rect.top=top
        self.rect.left=left
        #速度
        self.speed=speed
        #移動開關
        self.stop=True
        #新增一個步數變數
        self.step=60

    


    #隨機生成敵方坦克的方向
    def randDirection(self):
        num=random.randint(1,4)
        if num==1:
            return 'U'
        elif num==2:
            return 'L'
        elif num==3:
            return 'R'
        elif num==4:
            return 'D'
    
    #敵方坦克隨機移動的方法
    def randMove(self):
        if self.step<=0:
            #修改方向
            self.direction=self.randDirection()
            #讓步數復位
            self.step=20
        else:
            self.move()
            #讓步數遞減
            self.step-=1
     #重寫shot()
    def  shot(self):
        #隨機生成100以內的數
        num=random.randint(1,300)
        if num<10:
            return Bullet(self)


#敵方第3種坦克
class EnemyTank3(Tank):
    def __init__(self,left,top,speed):
        #呼叫父類的初始化方法
        super(EnemyTank3,self).__init__(left,top)
        #載入圖片集
        self.images={
            'U':pygame.image.load('img/enemy3U.gif'),
            'D':pygame.image.load('img/enemy3D.gif'),
            'L':pygame.image.load('img/enemy3L.gif'),
            'R':pygame.image.load('img/enemy3R.gif'),
        }

        #方向,隨機生成敵方坦克的方向
        self.direction=self.randDirection()
        #根據方向獲取圖片
        self.image=self.images[self.direction]
        #區域
        self.rect=self.image.get_rect()
        #對left和top進行賦值
        self.rect.top=top
        self.rect.left=left
        #速度
        self.speed=speed
        #移動開關
        self.stop=True
        #新增一個步數變數
        self.step=60


    #隨機生成敵方坦克的方向
    def randDirection(self):
        num=random.randint(1,4)
        if num==1:
            return 'U'
        elif num==2:
            return 'L'
        elif num==3:
            return 'R'
        elif num==4:
            return 'D'
    
    #敵方坦克隨機移動的方法
    def randMove(self):
        if self.step<=0:
            #修改方向
            self.direction=self.randDirection()
            #讓步數復位
            self.step=20
        else:
            self.move()
            #讓步數遞減
            self.step-=1
     #重寫shot()
    def  shot(self):
        #隨機生成100以內的數
        num=random.randint(1,300)
        if num<10:
            return Bullet(self)

4.Bullet類
載入子彈的圖片,設定子彈的速度;子彈的移動方法;子彈與牆碰撞,我方子彈與敵方坦克的碰撞,敵方子彈與我方坦克的碰撞;展示子彈的方法

#子彈類
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()
        #子彈的left和top與方向有關
        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.width / 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.width / 2 - self.rect.width / 2

    #子彈的速度
        self.speed=7
        #子彈的狀態,是否碰到牆壁,如果碰到牆壁,修改此狀態
        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_HIGHt:
                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 hitWall(self):
        #迴圈遍歷牆壁列表
        for wall in MainGame.wallList:
            if pygame.sprite.collide_rect(self,wall):
                self.live=False
        
    #展示子彈的方法
    def displayBullet(self):
        #將圖片sufarce載入到視窗
        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)

        #迴圈遍歷第二種敵方坦克列表,判斷是否發生碰撞
        for EnemyTank in MainGame.enemyTankList2:
            if pygame.sprite.collide_rect(EnemyTank,self):
                #修改敵方坦克和我方子彈的狀態
                EnemyTank.live=False
                self.live=False
                 #建立爆炸物件
                explode=Explode(EnemyTank)
                #將爆炸物件新增到爆炸列表當中
                MainGame.explodeList2.append(explode)


        #迴圈遍歷第三種敵方坦克列表,判斷是否發生碰撞
        for EnemyTank in MainGame.enemyTankList3:
            if pygame.sprite.collide_rect(EnemyTank,self):
                #修改敵方坦克和我方子彈的狀態
                EnemyTank.live=False
                self.live=False
                 #建立爆炸物件
                explode=Explode(EnemyTank)
                #將爆炸物件新增到爆炸列表當中
                MainGame.explodeList3.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):
                # 產生爆炸物件
                explode = Explode(MainGame.my_tank)
                # 將爆炸物件新增到爆炸列表中
                MainGame.explodeList.append(explode)
                # 修改敵方子彈與我方坦克的狀態
                self.live = False
                MainGame.my_tank.live = False

        if MainGame.my_tank and MainGame.my_tank.live:
            if pygame.sprite.collide_rect(MainGame.my_tank, self):
                # 產生爆炸物件
                explode = Explode(MainGame.my_tank)
                # 將爆炸物件新增到爆炸列表中
                MainGame.explodeList2.append(explode)
                # 修改敵方子彈與我方坦克的狀態
                self.live = False
                MainGame.my_tank.live = False

        if MainGame.my_tank and MainGame.my_tank.live:
            if pygame.sprite.collide_rect(MainGame.my_tank, self):
                # 產生爆炸物件
                explode = Explode(MainGame.my_tank)
                # 將爆炸物件新增到爆炸列表中
                MainGame.explodeList3.append(explode)
                # 修改敵方子彈與我方坦克的狀態
                self.live = False
                MainGame.my_tank.live = False

5.Wall類(二種牆壁類)
載入牆壁的圖片;展示牆壁的方法

#牆類鐵
class Wall():
    def __init__(self,left,top):
        #載入牆壁圖片
        self.image=pygame.image.load('img/steels.gif')
        #獲取牆壁的區域
        self.rect=self.image.get_rect()
        #設定位置left,top
        self.rect.left=left
        self.rect.top=top
        #是否存活
        self.live=True
        #設定生命值
        self.hp=3
        
    #展示牆紙的方法
    def displayWall(self):
        MainGame.window.blit(self.image,self.rect)


#牆壁水
class Wall2():
    def __init__(self,left,top):
        #載入牆壁圖片
        self.image=pygame.image.load('img/water.gif')
        #獲取牆壁的區域
        self.rect=self.image.get_rect()
        #設定位置left,top
        self.rect.left=left
        self.rect.top=top
        #是否存活
        self.live=True
 
        
    #展示牆紙的方法
    def displayWall(self):
        MainGame.window.blit(self.image,self.rect)

6.Explode類
載入爆炸的圖片;展示爆炸效果

#爆炸類
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'),
            pygame.image.load('img/blast4.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

7.Music類
載入音樂;播放音樂

#音樂類
class Music():

    def __init__(self,filename):
        self.filename=filename
        #初始化音樂混合器
        pygame.mixer.init()
        #載入音樂
        pygame.mixer.music.load(self.filename)
    #播放音樂
    def play(self):
        pygame.mixer.music.play()

8.基類

#定義一個基類
class BaseItem(Sprite):
    def __init__(self,Color,width,height):
        pygame.sprite.Sprite.__init__(self)