python 坦克大战游戏
生活随笔
收集整理的這篇文章主要介紹了
python 坦克大战游戏
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
跟著教程學習的python坦克大戰游戲,寫了一部分內容(生成敵我方坦克、子彈、運行軌跡等,另一部分的聲音,指定數量生成敵我方坦克內容后續待補充),歡迎大家參考和學習交流。
""" 新增功能:1、完善爆炸效果類2、在窗口中展示爆炸效果 """ import pygame, time, random from pygame.sprite import SpriteScreen_Width = 700 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):pygame.sprite.Sprite.__init__()class MainGame():window=Nonemy_tank=None# 存儲敵方坦克的列表enemyTankList = []# 定義敵方坦克的數量enemyTankNum = 5# 存儲我方坦克子彈的列表myBulletList = []# 存儲敵方坦克子彈的列表enemyBulletList = []def __init__(self):pass# 開始游戲def startGame(self):# 加載主窗口# 初始化窗口pygame.display.init()# 設置窗口的大小及顯示MainGame.window = pygame.display.set_mode([Screen_Width, Screen_Height])# 初始化我方坦克MainGame.my_tank = Tank(350, 250)#初始化敵方坦克self.createEnemmyTank()# 設置窗口的標題pygame.display.set_caption('坦克大戰1.01')while True:# 給窗口設置填充色MainGame.window.fill(Bg_Color)self.getEvent()# 繪制左上角文字MainGame.window.blit(self.getTextSuface('敵方剩余坦克數量%d'%len(self.enemyTankList)),(10,10))# 調用坦克顯示的方法MainGame.my_tank.displayTank()# 循環遍歷展示敵方坦克,展示敵方坦克self.blitEnemyTank()# 循環遍歷我方坦克的子彈self.blitMyBullet()# 循環遍歷敵方坦克的子彈,展示敵方坦克子彈self.blitEnemyBullet()if not MainGame.my_tank.stop:MainGame.my_tank.move()#if not MainGame.myBullet.stop:#MainGame.myBullet.move()time.sleep(0.05)pygame.display.update()# 初始化敵方坦克def createEnemmyTank(self):top = 50# 循環生成敵方坦克for i in range(MainGame.enemyTankNum):left = random.randint(0, 600)speed = random.randint(1, 4)enemy = EnemyTank(left, top, speed)MainGame.enemyTankList.append(enemy)# 循環遍歷展示敵方坦克,展示敵方坦克def blitEnemyTank(self):for enemyTank in MainGame.enemyTankList:if enemyTank.live:enemyTank.displayTank()enemyTank.randMove()enemyBullet = enemyTank.shot()# 判斷敵方子彈是否為空,如果不為空,則添加到敵方子彈列表中if enemyBullet:MainGame.enemyBulletList.append(enemyBullet)else:#如果部或者從敵方坦克列表中移除MainGame.enemyTankList.remove(enemyTank)# 循環遍歷展示敵方坦克,展示敵方坦克def blitMyBullet(self):for myBullet in MainGame.myBulletList:# 判斷當前的子彈是否是或者的狀態,如果是則進行顯示及移動,if myBullet.live:myBullet.displayBullet()# 調用子彈的移動方法myBullet.move()# 調用檢測我方子彈是否與敵方坦克發生碰撞myBullet.myBullet_hit_enemyTank()else:MainGame.myBulletList.remove(myBullet)# 循環遍歷敵方坦克的子彈,展示敵方坦克子彈def blitEnemyBullet(self):for enemyBullet in MainGame.enemyBulletList:# 判斷當前的子彈是否是或者的狀態,如果是則進行顯示及移動,if enemyBullet.live: #判斷地方子彈是否存貨enemyBullet.displayBullet()# 調用子彈的移動方法enemyBullet.move()else:MainGame.enemyBulletList.remove(enemyBullet)# 結束游戲def endGame(self):print('謝謝使用,歡迎下次使用!')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 textSurfacedef getEvent(self):# 獲取所有事件eventList = pygame.event.get()# 遍歷事件for event in eventList:# 判斷按下的鍵是關閉還是鍵盤按下# 如果按下的是退出if event.type == pygame.QUIT:self.endGame()elif event.type == pygame.KEYDOWN: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:# 如果我方當前子彈列表的大小小于等于3時,才可以創建if len(MainGame.myBulletList) < 3:print('我方坦克發射子彈')myBullet = Bullet(MainGame.my_tank)MainGame.myBulletList.append(myBullet)"""elif event.key == pygame.K_a:print('按下左鍵,坦克向左移動')elif event.key == pygame.K_s:print('按下左鍵,坦克向下移動')elif event.key == pygame.K_d:print('按下左鍵,坦克向右移動')"""#else:#print('其他內容后續支持!')# 松開方向鍵,坦克停止移動,修改移動開關if 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:MainGame.my_tank.stop = True class Tank(BaseItem):# 添加距離左邊left,距離上邊topdef __init__(self, left, top):# 保存加載的圖片self.images = {'U':pygame.image.load('img/tank_U.jpg'),'D': pygame.image.load('img/tank_D.jpg'),'L': pygame.image.load('img/tank_L.jpg'),'R': pygame.image.load('img/tank_R.jpg'),}# 方向self.direction = 'U'#根據當前圖片的方向獲取圖片self.image = self.images[self.direction]#根據圖片獲取區域self.rect = self.image.get_rect()# 設置區域的left和topself.rect.left = leftself.rect.top = top#速度,決定移動的快慢self.speed = 3self.stop = Trueself.live = True# 移動def move(self):# 判斷坦克移動的方向,來進行移動if self.direction == 'L':if self.rect.left > 0:self.rect.left -= self.speedelse:passelif self.direction == 'U':if self.rect.top > 0:self.rect.top -= self.speedelse:passelif self.direction == 'R':if self.rect.left + self.rect.height < Screen_Width:self.rect.left += self.speedelse:passelif self.direction == 'D':if self.rect.top + self.rect.width < Screen_Height:self.rect.top += self.speedelse:pass# 射擊def shot(self):return Bullet(self)# 展示坦克的方法def displayTank(self):# 獲取展示的對象self.image = self.images[self.direction]# 調用blit方法展示MainGame.window.blit(self.image, self.rect) class MyTank(Tank):def __init__(self):passclass EnemyTank(Tank):def __init__(self, left, top, speed):super(EnemyTank, self).__init__(left,top)# 加載圖片集self.images = {'U': pygame.image.load('img/E_tank_U.jpg'),'D': pygame.image.load('img/E_tank_D.jpg'),'L': pygame.image.load('img/E_tank_L.jpg'),'R': pygame.image.load('img/E_tank_R.jpg'),}# 隨機生成敵方坦克的方向self.direction = self.randDirection()# 根據當前圖片的方向獲取圖片self.image = self.images[self.direction]# 根據圖片獲取區域self.rect = self.image.get_rect()# 設置區域的left和topself.rect.left = leftself.rect.top = top# 速度,決定移動的快慢self.speed = speed# 移動開關鍵self.flag = True# 步數變量self.step = 60# 隨機生成敵方坦克的方向def randDirection(self):i = random.randint(1, 4)if i == 1:return 'U'elif i == 2:return 'D'elif i == 3:return 'L'elif i == 4:return 'R'# 敵方坦克隨機移動的方法def randMove(self):if self.step <= 0:# 修改方向self.direction = self.randDirection()self.step = 60else:self.move()self.step -= self.speeddef shot(self):# 生成隨機數100以內num = random.randint(1,100)if num < 10:return Bullet(self)class Bullet(BaseItem):def __init__(self, tank):# 加載子彈圖片self.image = pygame.image.load('img/buttle.jpg')# 坦克的方向決定了子彈的方向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/2self.rect.top = tank.rect.top - self.rect.heightelif self.direction == 'D':self.rect.left = tank.rect.left + tank.rect.width / 2 - self.rect.width / 2self.rect.top = tank.rect.top + tank.rect.heightelif self.direction == 'L':self.rect.left = tank.rect.left - self.rect.widthself.rect.top = tank.rect.top + tank.rect.height / 2 - self.rect.width/2elif self.direction == 'R':self.rect.left = tank.rect.left + tank.rect.widthself.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.speedelse:self.live = Falseelif self.direction == 'D':if self.rect.top +self.rect.height < Screen_Height:self.rect.top += self.speedelse:self.live = Falseelif self.direction == 'L':if self.rect.left > 0:self.rect.left -= self.speedelse:self.live = Falseelif self.direction == 'R':if self.rect.left +self.rect.width < Screen_Width:self.rect.left += self.speedelse:self.live = False# 展示子彈的方法def displayBullet(self):# 將圖片surface加載到窗口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 = Falseself.live = Falseclass Wall():def __init__(self):pass# 展示墻壁的方法def displayWall(self):passclass Explode():def __init__(self,tank):# 爆炸的位置由當前子彈打中的位置決定self.rect = tank.rectself.images = []# 展示爆炸效果的方法def displayExplode(self):passclass Music():def __init__(self):pass#播放音樂def playMusic(self):passif __name__ == '__main__':MainGame().startGame()程序運行效果如下圖:
坦克大戰中具體素材如下圖(素材圖片也可以自己去坦克大戰游戲中截圖保存):
截圖中的素材按照順序如下列表圖片所示(讀者使用的話,可以又圖片另存為):
總結
以上是生活随笔為你收集整理的python 坦克大战游戏的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c语言 返回函数是结构体指针变量,一个函
- 下一篇: hao123电脑版主页_hao123浏览