您好,登錄后才能下訂單哦!
這篇文章將為大家詳細講解有關如何實現Pygame坦克大戰游戲,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
游戲過程是這樣的,玩家操作坦克消滅電腦控制的坦克,并保護自己基地。基地圖標是一只傲嬌的張著翅膀的老鷹。小時候自
己失手把飛鷹轟成燒雞的慘案經常發生。
雙打的時候,為了看誰刷得分高,都爭著打坦克,大本營的老鷹被烤熟了都不管。。
坦克大戰中的寶貝有戰車、星星、時鐘等,小編當時最喜歡的是時鐘,敵不能動我能動的感覺妙極了。圖中的坦克圖標吃了是
可以加一條命的,當時為了搶寶貝都搶先把隊友的坦克打暈。。。
Python3、Pycharm、Pygame、以及自帶或自定義的模塊。
pip install +模塊名 或pip install -i https://pypi.douban.com/simple/ +模塊名
(之前不是寫過的嘛,今天的話就是修改下的,這種小游戲代碼肯定都很多的,所以這里直接貼主程序了。
需要完整的打包好的代碼跟素材哪些的話 直接滴滴我即可或者看我主頁左側哪里有源碼基地的哈!)
主程序:
import pygame from pygame.locals import * import sys import scene import bullet import food import tanks import home # 開始界面顯示 def show_start_interface(screen, width, height): tfont = pygame.font.Font('./font/simkai.ttf', width // 4) cfont = pygame.font.Font('./font/simkai.ttf', width // 20) title = tfont.render(u'坦克大戰', True, (255, 0, 0)) content1 = cfont.render(u'按1鍵進入單人游戲', True, (0, 244, 222)) content2 = cfont.render(u'按2鍵進入雙人人游戲', True, (0, 0, 255)) #顯示字體pygame.font.Font.render(text文本, antialias是否抗鋸齒, color顏色, background=None) trect = title.get_rect() # 默認title左上角的坐標是 (0, 0) trect.midtop = (width / 2, height / 5) crect1 = content1.get_rect() crect1.midtop = (width / 2, height / 1.8) crect2 = content2.get_rect() crect2.midtop = (width / 2, height / 1.6) screen.blit(title, trect) screen.blit(content1, crect1) screen.blit(content2, crect2) # 在指定位置繪制指定文字對象 pygame.display.update() # 更新界面 while True: for event in pygame.event.get(): if event.type == QUIT: sys.exit() elif event.type == pygame.KEYDOWN: if event.key == pygame.K_1: return 1 if event.key == pygame.K_2: return 2 # 結束界面顯示 def show_end_interface(screen, width, height, is_win): bg_img = pygame.image.load("./images/others/background.png") screen.blit(bg_img, (0, 0)) if is_win: font = pygame.font.Font('./font/simkai.ttf', width // 10) content = font.render(u'恭喜通關!', True, (255, 0, 0)) rect = content.get_rect() rect.midtop = (width / 2, height / 2) screen.blit(content, rect) else: fail_img = pygame.image.load("./images/others/gameover.png") rect = fail_img.get_rect() rect.midtop = (width / 2, height / 2) screen.blit(fail_img, rect) pygame.display.update() while True: for event in pygame.event.get(): if event.type == QUIT: sys.exit() # 關卡切換 def show_switch_stage(screen, width, height, stage): bg_img = pygame.image.load("./images/others/background.png") screen.blit(bg_img, (0, 0)) font = pygame.font.Font('./font/simkai.ttf', width // 10) content = font.render(u'第%d關' % stage, True, (0, 255, 0)) rect = content.get_rect() rect.midtop = (width / 2, height / 2) screen.blit(content, rect) pygame.display.update() delay_event = pygame.constants.USEREVENT pygame.time.set_timer(delay_event, 1000) #定時器延時 while True: for event in pygame.event.get(): if event.type == QUIT: sys.exit() if event.type == delay_event: return def main(): pygame.init() pygame.mixer.init() screen = pygame.display.set_mode((630, 630)) pygame.display.set_caption('坦克大戰') bg_img = pygame.image.load('./images/others/background.png') # 加載音效 add_sound = pygame.mixer.Sound("./audios/add.wav") add_sound.set_volume(1) bang_sound = pygame.mixer.Sound("./audios/bang.wav") bang_sound.set_volume(1) blast_sound = pygame.mixer.Sound("./audios/blast.wav") blast_sound.set_volume(1) fire_sound = pygame.mixer.Sound("./audios/fire.wav") fire_sound.set_volume(1) Gunfire_sound = pygame.mixer.Sound("./audios/Gunfire.wav") Gunfire_sound.set_volume(1) hit_sound = pygame.mixer.Sound("./audios/hit.wav") hit_sound.set_volume(1) start_sound = pygame.mixer.Sound("./audios/start.wav") start_sound.set_volume(1) # 開始界面 num_player = show_start_interface(screen, 630, 630) # 播放游戲開始的音樂 start_sound.play() # 關卡 stage = 0 num_stage = 2 # 游戲是否結束 is_gameover = False # 時鐘 clock = pygame.time.Clock() # 主循環 while not is_gameover: # 關卡 stage += 1 if stage > num_stage: break show_switch_stage(screen, 630, 630, stage) # 該關卡坦克總數量 enemytanks_total = min(stage * 18, 80) # 場上存在的敵方坦克總數量 enemytanks_now = 0 # 場上可以存在的敵方坦克總數量 enemytanks_now_max = min(max(stage * 2, 4), 8) # 精靈組,獨立運行的動畫組 tanksGroup = pygame.sprite.Group() mytanksGroup = pygame.sprite.Group() enemytanksGroup = pygame.sprite.Group() bulletsGroup = pygame.sprite.Group() mybulletsGroup = pygame.sprite.Group() enemybulletsGroup = pygame.sprite.Group() myfoodsGroup = pygame.sprite.Group() # 自定義事件 # -生成敵方坦克事件 genEnemyEvent = pygame.constants.USEREVENT pygame.time.set_timer(genEnemyEvent, 100) # -敵方坦克靜止恢復事件 recoverEnemyEvent = pygame.constants.USEREVENT pygame.time.set_timer(recoverEnemyEvent, 8000) # -我方坦克無敵恢復事件 noprotectMytankEvent = pygame.constants.USEREVENT pygame.time.set_timer(noprotectMytankEvent, 8000) # 關卡地圖 map_stage = scene.Map(stage) # 我方坦克 tank_player1 = tanks.myTank(1) tanksGroup.add(tank_player1) mytanksGroup.add(tank_player1) if num_player > 1: tank_player2 = tanks.myTank(2) tanksGroup.add(tank_player2) mytanksGroup.add(tank_player2) is_switch_tank = True player1_moving = False player2_moving = False # 為了輪胎的動畫效果 time = 0 # 敵方坦克 for i in range(0, 3): if enemytanks_total > 0: enemytank = tanks.enemyTank(i) tanksGroup.add(enemytank) enemytanksGroup.add(enemytank) enemytanks_now += 1 enemytanks_total -= 1 # 大本營 myhome = home.Home() # 出場特效 appearance_img = pygame.image.load("./images/others/appear.png").convert_alpha() appearances = [] appearances.append(appearance_img.subsurface((0, 0), (48, 48))) appearances.append(appearance_img.subsurface((48, 0), (48, 48))) appearances.append(appearance_img.subsurface((96, 0), (48, 48))) # 關卡主循環 while True: if is_gameover is True: break if enemytanks_total < 1 and enemytanks_now < 1: is_gameover = False break for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() if event.type == genEnemyEvent: if enemytanks_total > 0: if enemytanks_now < enemytanks_now_max: enemytank = tanks.enemyTank() if not pygame.sprite.spritecollide(enemytank, tanksGroup, False, None): tanksGroup.add(enemytank) enemytanksGroup.add(enemytank) enemytanks_now += 1 enemytanks_total -= 1 if event.type == recoverEnemyEvent: for each in enemytanksGroup: each.can_move = True if event.type == noprotectMytankEvent: for each in mytanksGroup: mytanksGroup.protected = False # 檢查用戶鍵盤操作 key_pressed = pygame.key.get_pressed() # 玩家一 # WSAD -> 上下左右 # 空格鍵射擊 if key_pressed[pygame.K_w]: tanksGroup.remove(tank_player1) tank_player1.move_up(tanksGroup, map_stage.brickGroup, map_stage.ironGroup, myhome) tanksGroup.add(tank_player1) player1_moving = True elif key_pressed[pygame.K_s]: tanksGroup.remove(tank_player1) tank_player1.move_down(tanksGroup, map_stage.brickGroup, map_stage.ironGroup, myhome) tanksGroup.add(tank_player1) player1_moving = True elif key_pressed[pygame.K_a]: tanksGroup.remove(tank_player1) tank_player1.move_left(tanksGroup, map_stage.brickGroup, map_stage.ironGroup, myhome) tanksGroup.add(tank_player1) player1_moving = True elif key_pressed[pygame.K_d]: tanksGroup.remove(tank_player1) tank_player1.move_right(tanksGroup, map_stage.brickGroup, map_stage.ironGroup, myhome) tanksGroup.add(tank_player1) player1_moving = True elif key_pressed[pygame.K_SPACE]: if not tank_player1.bullet.being: fire_sound.play() tank_player1.shoot() # 玩家二 # ↑↓←→ -> 上下左右 # 小鍵盤0鍵射擊 if num_player > 1: if key_pressed[pygame.K_UP]: tanksGroup.remove(tank_player2) tank_player2.move_up(tanksGroup, map_stage.brickGroup, map_stage.ironGroup, myhome) tanksGroup.add(tank_player2) player2_moving = True elif key_pressed[pygame.K_DOWN]: tanksGroup.remove(tank_player2) tank_player2.move_down(tanksGroup, map_stage.brickGroup, map_stage.ironGroup, myhome) tanksGroup.add(tank_player2) player2_moving = True elif key_pressed[pygame.K_LEFT]: tanksGroup.remove(tank_player2) tank_player2.move_left(tanksGroup, map_stage.brickGroup, map_stage.ironGroup, myhome) tanksGroup.add(tank_player2) player2_moving = True elif key_pressed[pygame.K_RIGHT]: tanksGroup.remove(tank_player2) tank_player2.move_right(tanksGroup, map_stage.brickGroup, map_stage.ironGroup, myhome) tanksGroup.add(tank_player2) player2_moving = True elif key_pressed[pygame.K_KP0]: if not tank_player2.bullet.being: fire_sound.play() tank_player2.shoot() # 背景 screen.blit(bg_img, (0, 0)) # 石頭墻 for each in map_stage.brickGroup: screen.blit(each.brick, each.rect) # 鋼墻 for each in map_stage.ironGroup: screen.blit(each.iron, each.rect) # 冰 for each in map_stage.iceGroup: screen.blit(each.ice, each.rect) # 河流 for each in map_stage.riverGroup: screen.blit(each.river, each.rect) # 樹 for each in map_stage.treeGroup: screen.blit(each.tree, each.rect) time += 1 if time == 5: time = 0 is_switch_tank = not is_switch_tank # 我方坦克 if tank_player1 in mytanksGroup: if is_switch_tank and player1_moving: screen.blit(tank_player1.tank_0, (tank_player1.rect.left, tank_player1.rect.top)) player1_moving = False else: screen.blit(tank_player1.tank_1, (tank_player1.rect.left, tank_player1.rect.top)) if tank_player1.protected: screen.blit(tank_player1.protected_mask1, (tank_player1.rect.left, tank_player1.rect.top)) if num_player > 1: if tank_player2 in mytanksGroup: if is_switch_tank and player2_moving: screen.blit(tank_player2.tank_0, (tank_player2.rect.left, tank_player2.rect.top)) player1_moving = False else: screen.blit(tank_player2.tank_1, (tank_player2.rect.left, tank_player2.rect.top)) if tank_player2.protected: screen.blit(tank_player1.protected_mask1, (tank_player2.rect.left, tank_player2.rect.top)) # 敵方坦克 for each in enemytanksGroup: # 出生特效 if each.born: if each.times > 0: each.times -= 1 if each.times <= 10: screen.blit(appearances[2], (3 + each.x * 12 * 24, 3)) elif each.times <= 20: screen.blit(appearances[1], (3 + each.x * 12 * 24, 3)) elif each.times <= 30: screen.blit(appearances[0], (3 + each.x * 12 * 24, 3)) elif each.times <= 40: screen.blit(appearances[2], (3 + each.x * 12 * 24, 3)) elif each.times <= 50: screen.blit(appearances[1], (3 + each.x * 12 * 24, 3)) elif each.times <= 60: screen.blit(appearances[0], (3 + each.x * 12 * 24, 3)) elif each.times <= 70: screen.blit(appearances[2], (3 + each.x * 12 * 24, 3)) elif each.times <= 80: screen.blit(appearances[1], (3 + each.x * 12 * 24, 3)) elif each.times <= 90: screen.blit(appearances[0], (3 + each.x * 12 * 24, 3)) else: each.born = False else: if is_switch_tank: screen.blit(each.tank_0, (each.rect.left, each.rect.top)) else: screen.blit(each.tank_1, (each.rect.left, each.rect.top)) if each.can_move: tanksGroup.remove(each) each.move(tanksGroup, map_stage.brickGroup, map_stage.ironGroup, myhome) tanksGroup.add(each) # 我方子彈 for tank_player in mytanksGroup: if tank_player.bullet.being: tank_player.bullet.move() screen.blit(tank_player.bullet.bullet, tank_player.bullet.rect) # 子彈碰撞敵方子彈 for each in enemybulletsGroup: if each.being: if pygame.sprite.collide_rect(tank_player.bullet, each): tank_player.bullet.being = False each.being = False enemybulletsGroup.remove(each) break else: enemybulletsGroup.remove(each) # 子彈碰撞敵方坦克 for each in enemytanksGroup: if each.being: if pygame.sprite.collide_rect(tank_player.bullet, each): if each.is_red == True: myfood = food.Food() myfood.generate() myfoodsGroup.add(myfood) each.is_red = False each.blood -= 1 each.color -= 1 if each.blood < 0: bang_sound.play() each.being = False enemytanksGroup.remove(each) enemytanks_now -= 1 tanksGroup.remove(each) else: each.reload() tank_player.bullet.being = False break else: enemytanksGroup.remove(each) tanksGroup.remove(each) # 子彈碰撞石頭墻 if pygame.sprite.spritecollide(tank_player.bullet, map_stage.brickGroup, True, None): tank_player.bullet.being = False # 子彈碰鋼墻 if tank_player.bullet.stronger: if pygame.sprite.spritecollide(tank_player.bullet, map_stage.ironGroup, True, None): tank_player.bullet.being = False else: if pygame.sprite.spritecollide(tank_player.bullet, map_stage.ironGroup, False, None): tank_player.bullet.being = False # 子彈碰大本營 if pygame.sprite.collide_rect(tank_player.bullet, myhome): tank_player.bullet.being = False myhome.set_dead() is_gameover = True # 敵方子彈 for each in enemytanksGroup: if each.being: if each.can_move and not each.bullet.being: enemybulletsGroup.remove(each.bullet) each.shoot() enemybulletsGroup.add(each.bullet) if not each.born: if each.bullet.being: each.bullet.move() screen.blit(each.bullet.bullet, each.bullet.rect) # 子彈碰撞我方坦克 for tank_player in mytanksGroup: if pygame.sprite.collide_rect(each.bullet, tank_player): if not tank_player.protected: bang_sound.play() tank_player.life -= 1 if tank_player.life < 0: mytanksGroup.remove(tank_player) tanksGroup.remove(tank_player) if len(mytanksGroup) < 1: is_gameover = True else: tank_player.reset() each.bullet.being = False enemybulletsGroup.remove(each.bullet) break # 子彈碰撞石頭墻 if pygame.sprite.spritecollide(each.bullet, map_stage.brickGroup, True, None): each.bullet.being = False enemybulletsGroup.remove(each.bullet) # 子彈碰鋼墻 if each.bullet.stronger: if pygame.sprite.spritecollide(each.bullet, map_stage.ironGroup, True, None): each.bullet.being = False else: if pygame.sprite.spritecollide(each.bullet, map_stage.ironGroup, False, None): each.bullet.being = False # 子彈碰大本營 if pygame.sprite.collide_rect(each.bullet, myhome): each.bullet.being = False myhome.set_dead() is_gameover = True else: enemytanksGroup.remove(each) tanksGroup.remove(each) # 家 screen.blit(myhome.home, myhome.rect) # 食物 for myfood in myfoodsGroup: if myfood.being and myfood.time > 0: screen.blit(myfood.food, myfood.rect) myfood.time -= 1 for tank_player in mytanksGroup: if pygame.sprite.collide_rect(tank_player, myfood): # 消滅當前所有敵人 if myfood.kind == 0: for _ in enemytanksGroup: bang_sound.play() enemytanksGroup = pygame.sprite.Group() enemytanks_total -= enemytanks_now enemytanks_now = 0 # 敵人靜止 if myfood.kind == 1: for each in enemytanksGroup: each.can_move = False # 子彈增強 if myfood.kind == 2: add_sound.play() tank_player.bullet.stronger = True # 使得大本營的墻變為鋼板 if myfood.kind == 3: map_stage.protect_home() # 坦克獲得一段時間的保護罩 if myfood.kind == 4: add_sound.play() for tank_player in mytanksGroup: tank_player.protected = True # 坦克升級 if myfood.kind == 5: add_sound.play() tank_player.up_level() # 坦克生命+1 if myfood.kind == 6: add_sound.play() tank_player.life += 1 myfood.being = False myfoodsGroup.remove(myfood) break else: myfood.being = False myfoodsGroup.remove(myfood) pygame.display.flip() clock.tick(60) if not is_gameover: show_end_interface(screen, 630, 630, True) else: show_end_interface(screen, 630, 630, False) if __name__ == '__main__': main()
視頻展示效果——
視頻播放鏈接:https://live.csdn.net/v/embed/181068
【Pygame實戰】經典的坦克大戰游戲,勾起童年無限回憶!
靜態截圖效果——
游戲界面:
第一關單人游戲:
雙人第一關游戲:
關于“如何實現Pygame坦克大戰游戲”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。