利用python中的pygame模块开发fc坦克大战(可自定义地图,包括部分素材)
生活随笔
收集整理的這篇文章主要介紹了
利用python中的pygame模块开发fc坦克大战(可自定义地图,包括部分素材)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
剛開始學(xué)習(xí)計算機,代碼寫的良莠不齊,多擔(dān)待哈。
這個資源積分我自己修改不了,沒辦法,想直接要代碼和素材的朋友請qq我:1638179220,歡迎。
**
游戲效果圖:
**
pygame—坦克大戰(zhàn)
大體分為10個模塊:
button.py
'''游戲按鈕模塊'''import pygameclass Button():def __init__(self,screen,msg):'''初始化按鈕屬性'''self.screen = screenself.msg = msg#設(shè)置按鈕的尺寸和其它屬性self.width = 200self.height = 50self.button_color = (0,255,0)self.text_color = (255,255,255)self.font = pygame.font.Font("C:/Windows/Fonts/SIMHEI.TTF",30)#創(chuàng)建按鈕的矩形對象self.rect = pygame.Rect(0,0,self.width,self.height)self.rect.center = (450,300)#創(chuàng)建按鈕的標簽self.prep_msg(self.msg)def prep_msg(self,msg):'''將msg渲染成為圖像,并使其在按鈕上居中'''self.msg_image = self.font.render(msg,True,self.text_color,self.button_color)self.msg_image_rect = self.msg_image.get_rect()def draw_button(self):#繪制一個用顏色填充的按鈕,再繪制文本self.screen.fill(self.button_color,self.rect)self.screen.blit(self.msg_image,(self.rect.x+40,self.rect.y+10))customize_wall.py
'''自定義地圖模塊'''import pygame from pygame.sprite import Spriteclass Walls(Sprite):def __init__(self,screen):self.customize = FalseSprite.__init__(self)self.screen = screenself.stop = Falseself.step = 0self.images = [pygame.image.load("imgs\\wall\\1.gif"), \pygame.image.load("imgs\\wall\\2.gif"), \pygame.image.load("imgs\\wall\\3.gif"), \pygame.image.load("imgs\\wall\\4.gif"), \pygame.image.load("imgs\\wall\\5.gif"), \pygame.image.load("imgs\\wall\\7.gif"), \pygame.image.load("imgs\\wall\\8.png")]self.speed = 1 self.image = self.images[self.step]self.rect = self.image.get_rect()self.rect.x = 68self.rect.y = 40self.screen.blit(self.image,self.rect)def update(self):self.image = self.images[self.step]self.screen.blit(self.image,self.rect)def move_up(self):if not self.stop:self.rect.y -= self.speeddef move_under(self):if not self.stop:self.rect.y += self.speeddef move_left(self):if not self.stop:self.rect.x -= self.speeddef move_right(self):if not self.stop:self.rect.x += self.speeddef no_screen(self):if self.rect.x <= 68:self.rect.x = 68if self.rect.x >= 1008:self.rect.x = 1008if self.rect.y <= 40:self.rect.y = 40if self.rect.y >= 650:self.rect.y = 650game_interface.py
'''游戲開始前背景圖片更換模塊'''import pygameclass Game_interface():def __init__(self,screen,msg,rect):self.screen = screenself.images = [pygame.image.load("imgs\\q.jpg"), \pygame.image.load("imgs\\w.jpg"), \pygame.image.load("imgs\\e.jpg"), \pygame.image.load("imgs\\r.jpg"), \pygame.image.load("imgs\\t.jpg"), \pygame.image.load("imgs\\y.jpg"), \pygame.image.load("imgs\\314662.jpg"), \pygame.image.load("imgs\\306745.jpg"), \pygame.image.load("imgs\\271039.jpg"), \pygame.image.load("imgs\\279861.jpg")]self.step = 0self.width = 450self.height = 50self.interface_color = (0,255,0)self.text_color = (255,255,255)self.size = 30self.len = len(msg)self.font = pygame.font.Font("C:/Windows/Fonts/SIMHEI.TTF",self.size)#創(chuàng)建按鈕的矩形對象self.rect = pygame.Rect(0,0,self.width,self.height)self.rect.center = rect#創(chuàng)建按鈕的標簽self.prep_msg(msg)self.draw_interface()def prep_msg(self,msg):'''將msg渲染成為圖像,并使其在界面上居中'''self.msg_image = self.font.render(msg,True,self.text_color,self.interface_color)self.msg_image_rect = self.msg_image.get_rect()def draw_interface(self):#繪制一個用顏色填充的按鈕,再繪制文本self.screen.fill(self.interface_color,self.rect)self.screen.blit(self.msg_image,(self.rect.x+(self.width-self.len*self.size)/2,self.rect.y+(self.height-self.size)/2))def screen_bg(self):if self.step == len(self.images):self.step = 0else:self.image = self.images[self.step]self.time = pygame.time.delay(700)self.screen.blit(self.image,(0,0))pygame.display.update()self.step += 1home.py
'''坦克保護的老家模塊'''import pygame from pygame.sprite import Spriteclass Home(Sprite):def __init__(self,screen):Sprite.__init__(self)self.screen = screenself.screen_rect = self.screen.get_rect()self.live = Trueself.images = [pygame.image.load("imgs\\symbol.gif"),pygame.image.load("imgs\\destory.gif")]self.step = 0def draw_home(self):if self.live:self.image1 = self.images[self.step]self.rect = self.image1.get_rect()self.rect.width = 60self.rect.height = 45self.rect.x = 500self.rect.y = 665self.screen.blit(self.image1,self.rect)if not self.live:self.image2 = self.images[self.step+1]self.rect = self.image2.get_rect()self.rect.width = 60self.rect.height = 45self.rect.x = 500self.rect.y = 665self.screen.blit(self.image2,self.rect)tank_buff.py
'''坦克buff模塊'''import random import pygame from pygame.sprite import Spriteclass Tank_buff(Sprite):def __init__(self,screen):Sprite.__init__(self)self.screen = screenself.random_image()def random_image(self):r = random.randint(0,2)if r == 0:self.m = 0self.image = pygame.image.load("imgs\\timer.gif")self.rect = self.image.get_rect()self.rect.x = random.randint(68,1000)self.rect.y = random.randint(40,750)if r == 1:self.m = 1self.image = pygame.image.load("imgs\\star.gif")self.rect = self.image.get_rect()self.rect.x = random.randint(68,1000)self.rect.y = random.randint(40,750)if r == 2:self.m = 2self.image = pygame.image.load("imgs\\bomb.gif")self.rect = self.image.get_rect()self.rect.x = random.randint(68,1000)self.rect.y = random.randint(40,750)tank_bullet.py
'''坦克子彈模塊'''import pygamefrom pygame.sprite import Spriteclass Bullet(Sprite):def __init__(self,screen,direction,image,tank_hero):Sprite.__init__(self)self.screen = screenself.image = pygame.image.load(image)self.direction = directionself.rect = self.image.get_rect()self.speed = 5self.live = Trueself.moving = Falseif self.direction == "top":self.rect.x = tank_hero.rect.x+23self.rect.y = tank_hero.rect.y-5elif self.direction == "under":self.rect.x = tank_hero.rect.x+23self.rect.y = tank_hero.rect.y+60elif self.direction == "right":self.rect.x = tank_hero.rect.x+60self.rect.y = tank_hero.rect.y+23elif self.direction == "left":self.rect.x = tank_hero.rect.xself.rect.y = tank_hero.rect.y+23def moving_t(self):self.rect.y -= self.speeddef moving_l(self):self.rect.x -= self.speeddef moving_r(self):self.rect.x += self.speeddef moving_u(self):self.rect.y+= self.speedtank_enemy.py
'''敵方坦克模塊'''import random import pygame from pygame.sprite import Sprite#敵方坦克類 class Tank_enemy(Sprite):def __init__(self,screen,image,speed):Sprite.__init__(self)self.screen = screenself.direction = "a"self.o = 2#坦克移動的速度self.speed = speed#坦克按照某個方向移動的步數(shù)self.step = 120self.y = 0self.first = 1self.limit = 1if self.direction == "a":self.image = pygame.image.load(image)self.moving_up = Trueself.moving_down = Trueself.moving_right = Trueself.moving_left = True#坦克的圖片由方向決定self.rect = self.image.get_rect()self.rect.x = random.choice((68,538,1008))self.rect.y = 40self.image1 = self.imageself.live = Trueself.get_random()def direction_move(self):if self.direction == "a":self.image = self.image1elif self.direction == "w":if self.first > 0:self.first -= 1self.image = pygame.transform.rotate(self.image1,270)elif self.direction == "s":if self.first > 0:self.first -= 1self.image = pygame.transform.rotate(self.image1,90)elif self.direction == "d":if self.first > 0:self.first -= 1self.image = pygame.transform.rotate(self.image1,180)def get_random(self):r = random.randint(0,3)if r == 1:self.direction = "d"self.moving_right = Trueelif r == 2:self.direction = "w"self.moving_up = Trueelif r == 3:self.direction = "a"self.moving_left =Trueelif r == 0:self.direction = "s"self.moving_down = Truedef move(self):if self.direction == "a":if self.moving_left:if self.rect.x <= 68:self.rect.x = 68 else:self.rect.x -= self.speedself.direction_move()elif self.direction == "d":if self.moving_right:if self.rect.x >= 1008:self.rect.x = 1008else:self.rect.x += self.speedself.direction_move()elif self.direction == "w":if self.moving_up:if self.rect.y <= 40:self.rect.y = 40else:self.rect.y -= self.speedself.direction_move()elif self.direction == "s":if self.moving_down:if self.rect.y >= 650:self.rect.y = 650else:self.rect.y += self.speedself.direction_move()#敵方坦克,按照一個確定的隨機方向,連續(xù)移動六步,才能再次改變方向 def enemy_random_move(self):if self.live:if self.step == 0:self.first = 1self.get_random()self.step = 120else:self.move()self.step -= 1class Tank_twinkle(Sprite):def __init__(self,screen):Sprite.__init__(self)self.step1 = 0self.step = 1self.get_random()self.y = 5self.o = 1self.screen = screenself.images = [pygame.image.load("imgs\\enemy3L.gif"), \pygame.image.load("imgs\\bianshen\\tugai.net.20101117235357.gif"), \pygame.image.load("imgs\\bianshen\\tugai.net.20101117235819.gif"), \pygame.image.load("imgs\\bianshen\\tugai.net.20101118000029.gif")]self.image = self.images[self.step]self.rect = self.image.get_rect()self.rect.x = random.choice((68,538,1008))self.rect.y = 40self.live = Trueself.speed = 2self.limit = 3def direction_move(self):if self.direction == "a":self.images = [pygame.image.load("imgs\\enemy3L.gif"), \pygame.image.load("imgs\\bianshen\\tugai.net.20101117235357.gif"), \pygame.image.load("imgs\\bianshen\\tugai.net.20101117235819.gif"), \pygame.image.load("imgs\\bianshen\\tugai.net.20101118000029.gif")]self.twinkle()elif self.direction == "w":self.images = [pygame.image.load("imgs\\enemy3U.gif"), \pygame.image.load("imgs\\bianshen\\tugai.net.20101117235441.gif"), \pygame.image.load("imgs\\bianshen\\tugai.net.20101117235923.gif"), \pygame.image.load("imgs\\bianshen\\tugai.net.20101118000114.gif")]self.twinkle()elif self.direction == "s":self.images = [pygame.image.load("imgs\\enemy3D.gif"), \pygame.image.load("imgs\\bianshen\\tugai.net.20101117235303.gif"), \pygame.image.load("imgs\\bianshen\\tugai.net.20101117235754.gif"), \pygame.image.load("imgs\\bianshen\\tugai.net.20101117235941.gif")]self.twinkle()elif self.direction == "d":self.images = [pygame.image.load("imgs\\enemy3R.gif"), \pygame.image.load("imgs\\bianshen\\tugai.net.20101117235418.gif"), \pygame.image.load("imgs\\bianshen\\tugai.net.20101117235843.gif"), \pygame.image.load("imgs\\bianshen\\tugai.net.20101118000048.gif")]self.twinkle()def get_random(self):r = random.randint(0,3)if r == 1:self.direction = "d"self.moving_right = Trueelif r == 2:self.direction = "w"self.moving_up = Trueelif r == 3:self.direction = "a"self.moving_left =Trueelif r == 0:self.direction = "s"self.moving_down = Truedef move(self):if self.direction == "a":if self.moving_left:if self.rect.x <= 68:self.rect.x = 68 else:self.rect.x -= self.speedself.direction_move()elif self.direction == "d":if self.moving_right:if self.rect.x >= 1008:self.rect.x = 1008else:self.rect.x += self.speedself.direction_move()elif self.direction == "w":if self.moving_up:if self.rect.y <= 40:self.rect.y = 40else:self.rect.y -= self.speedself.direction_move()elif self.direction == "s":if self.moving_down:if self.rect.y >= 650:self.rect.y = 650else:self.rect.y += self.speedself.direction_move()#敵方坦克,按照一個確定的隨機方向,連續(xù)移動六步,才能再次改變方向 def enemy_random_move(self):if self.live:if self.step == 0:self.step1 = 0self.get_random()self.step = 120else:self.move()self.step -= 1def twinkle(self):if self.step1 == len(self.images)-1:self.step1 = 0else:self.image = self.images[self.step1]self.screen.blit(self.image,self.rect)pygame.display.update()self.step1 += 1tank_explode.py
'''爆炸模塊'''import pygameimport timeclass Explode():def __init__(self,screen,rect):self.live = Trueself.images = [pygame.image.load("imgs\\blast1.gif"), \pygame.image.load("imgs\\blast2.gif"), \pygame.image.load("imgs\\blast3.gif"), \pygame.image.load("imgs\\blast4.gif"), \pygame.image.load("imgs\\blast5.gif"), \pygame.image.load("imgs\\blast6.gif"), \pygame.image.load("imgs\\blast7.gif"), \pygame.image.load("imgs\\blast8.gif")]self.screen = screen#坦克爆炸位置self.rect = rectself.step = 0#在整個游戲過程中,循環(huán)使用,每隔0.05秒調(diào)用一次def update(self):if self.live:#最后一張爆炸圖片已經(jīng)顯示了if self.step == len(self.images):self.live = Falseelse: self.image = self.images[self.step] self.screen.blit(self.image,(self.rect.x-30,self.rect.y-30))pygame.display.update() self.step += 1else:return#刪除該對象tank_hero.py
'''己方坦克模塊'''import pygame from pygame.sprite import Sprite '''定義一個坦克英雄類''' import pygame.fontclass Tank_hero(Sprite):#初始化方法def __init__(self,screen,speed,image,x,y):Sprite.__init__(self)self.screen = screenself.screen_rect = self.screen.get_rect()self.image = pygame.image.load(image)self.rect = self.image.get_rect()self.rect.x = xself.rect.y = yself.life_limit = 3self.live1 = Trueself.live2 = Falseself.live3 = Falseself.live4 = Falseself.stop = Falseself.speed = speedself.font = pygame.font.SysFont(None,22)self.a = 1self.moving_up = Trueself.moving_down = Trueself.moving_right = Trueself.moving_left = Trueself.direction = "w"self.x = 1098self.y = 600self.color = (245,169,21)def transform_image_up(self,image):self.image = pygame.image.load(image)def transform_image_under(self,image):self.image = pygame.image.load(image)def transform_image_right(self,image):self.image = pygame.image.load(image)def transform_image_left(self,image):self.image = pygame.image.load(image)def move_up(self):self.rect.y -= self.speeddef move_under(self):self.rect.y += self.speeddef move_right(self):self.rect.x += self.speeddef move_left(self):self.rect.x -= self.speeddef no_screen(self):if self.rect.x <= 68:self.rect.x = 68if self.rect.x >= 1008:self.rect.x = 1008if self.rect.y <= 40:self.rect.y = 40if self.rect.y >= 650:self.rect.y = 650def residue_tank(self):if self.live1:self.tank_image = self.font.render(" X 3",True,self.color,(145,145,145))if self.live2:self.tank_image = self.font.render(" X 2",True,self.color,(145,145,145))if self.live3:self.tank_image = self.font.render(" X 1",True,self.color,(145,145,145))if self.live4:self.tank_image = self.font.render(" X 0",True,self.color,(145,145,145))self.screen.blit(self.tank_image,(self.x,self.y))tank_war_main.py
'''坦克大戰(zhàn)游戲'''import random import time import pygame import sys from tank_hero import Tank_hero from tank_bullet import Bullet from button import Button from tank_explode import Explode from tank_enemy import Tank_enemy,Tank_twinkle from game_interface import Game_interface from home import Home from customize_wall import Walls from tank_buff import Tank_buff import timeclass Tank_war_main():'''初始化屬性和方法'''def __init__(self):pygame.init()#播放開始音樂self.music = True#創(chuàng)建一個屏幕對象self.screen = pygame.display.set_mode((1136,750))#游戲名字self.caption = pygame.display.set_caption("坦克大戰(zhàn)增強版")#背景顏色self.bg_color = (30,30,90)#非是游戲活動狀態(tài)self.game_active = False#敵方坦克限制數(shù)量self.enemy_tank_limit = 30#閃爍坦克限制數(shù)量self.enemy_tank_limit1 = 5#游戲灰色邊框圖片self.bg_1 = pygame.image.load("imgs\\1-3.png")self.bg_2 = pygame.image.load("imgs\\1-2.png")#坦克出生顯示的圖片self.start1 = pygame.image.load("imgs\\born1.png")self.start2 = pygame.image.load("imgs\\born2.png")self.start3 = pygame.image.load("imgs\\born3.png")self.start4 = pygame.image.load("imgs\\born4.png")self.home_wall = True#定義定時器常量(敵方坦克)self.EVENT_ENEMY = pygame.USEREVENTself.event = pygame.USEREVENT + 1pygame.time.set_timer(self.event,5000)pygame.time.set_timer(self.EVENT_ENEMY,1000)#敵方坦克移動self.enemy_move = True#生成一個時鐘對象self.clock = pygame.time.Clock()#循環(huán)播放音樂self.file2 = "music\林俊杰 - 進階.mp3"self.bg_music = pygame.mixer.music.load(self.file2)#pygame.mixer.music.play(-1)#初始化游戲元素self.game_element()#執(zhí)行游戲主循環(huán)self.loop()'''游戲主循環(huán)方法'''def loop(self):#生成一個背景圖片對象,以便用于剛開始背景圖像的繪制self.screen_bg = Game_interface(self.screen,"..",(-400,-400))while True:#設(shè)置幀率self.clock.tick(120)#監(jiān)聽鼠標事件self.mouse_check()#不是游戲活動狀態(tài)if not self.game_active:#繪制按鈕self.bg_button()#繪制背景圖self.screen_bg.screen_bg()#游戲活動狀態(tài)if self.game_active:#碰撞檢測self.collide_check()#監(jiān)聽鍵盤事件self.keyboard_check()#不能讓坦克英雄1移動到屏幕外面self.tank_hero1.no_screen()self.tank_hero2.no_screen()#用于碰撞墻壁所造成的不能移動self.tank_moving()#英雄坦克移動self.bullets_moving()#這個是buff定時時使用if self.enemy_move:#敵人移動self.enemy_tank_move()#敵人子彈移動self.enemy_tank_bullet_move()#繪制圖片self.draw_image()#刷新顯示self.update()#不是造墻的時候跳到背景圖像切換if not self.home.live:self.game_active = False'''按鈕點擊和坦克英雄發(fā)射子彈事件方法'''def mouse_check(self):#如果一直按著一個鍵的時候會返回布爾類型True,反之key_pressed = pygame.key.get_pressed()#獲取所有的游戲事件for event in pygame.event.get():#游戲退出if event.type == pygame.QUIT:pygame.quit()sys.exit()#敵方坦克定時的時間if event.type == self.event:self.enemy_move = True#監(jiān)聽鼠標事件if event.type == pygame.MOUSEBUTTONDOWN:#獲取鼠標點擊的位置mouse_x,mouse_y = pygame.mouse.get_pos()#判斷鼠標點擊的位置是否是開始按鈕的位置if self.play_button.rect.collidepoint(mouse_x,mouse_y):self.game_active = Trueself.home.live = Trueself.home.wall = Trueself.wall.customize = False#播放開始音樂(初始化的時候是True)所以會播放一次(其它的時候是False)if self.music:file1 = "music\start.wav"start_music = pygame.mixer.Sound(file1)start_music.play() #判斷鼠標點擊的位置是否是游戲說明的按鈕if self.description_button.rect.collidepoint(mouse_x,mouse_y):#顯示游戲說明self.game_description_interface()#停留9秒self.screen_bg.time = pygame.time.delay(9000)#判斷鼠標點擊的位置是否是自定義地圖的按鈕if self.customize_map_button.rect.collidepoint(mouse_x,mouse_y):self.home_wall = Falseself.game_active = True#初始化敵方坦克數(shù)量self.enemy_tank_limit = 30self.enemy_tank_limit1 = 5self.game_element()self.wall.customize = Trueself.init()if self.game_active:'''定時器'''#敵方坦克定時出現(xiàn)if self.home_wall:if event.type == self.EVENT_ENEMY:if len(self.enemy_list) < 4:if self.enemy_tank_limit > 0:new_enemy_tank1 = Tank_enemy(self.screen,"imgs\\enemy1l.gif",2)new_enemy_tank1.y = 1 self.born_image(new_enemy_tank1)self.enemy_list.add(new_enemy_tank1)self.enemy_tank_limit -= 1if self.enemy_tank_limit > 0:new_enemy_tank2 = Tank_enemy(self.screen,"imgs\\enemy2L.gif",3)new_enemy_tank2.y = 2self.born_image(new_enemy_tank2)self.enemy_list.add(new_enemy_tank2)self.enemy_tank_limit -= 1if self.enemy_tank_limit > 0:new_enemy_tank3 = Tank_enemy(self.screen,"imgs\\enemy3L.gif",2)new_enemy_tank3.y = 5self.born_image(new_enemy_tank3)self.enemy_list.add(new_enemy_tank3)self.enemy_tank_limit -= 1if len(self.enemy_list) == 3 and self.enemy_tank_limit1 > 0:new_enemy_tank_twinkle = Tank_twinkle(self.screen)self.born_image(new_enemy_tank_twinkle)self.born_image(new_enemy_tank_twinkle)self.enemy_list.add(new_enemy_tank_twinkle)self.enemy_tank_limit1 -= 1for new_enemy_tank in self.enemy_list:if new_enemy_tank.direction == "w":new_enemy_bullet = Bullet(self.screen,"top","imgs\\tankmissile.gif",new_enemy_tank)self.enemy_bullet_group.add(new_enemy_bullet)if new_enemy_tank.direction == "s":new_enemy_bullet = Bullet(self.screen,"under","imgs\\tankmissile.gif",new_enemy_tank)self.enemy_bullet_group.add(new_enemy_bullet)if new_enemy_tank.direction == "a":new_enemy_bullet = Bullet(self.screen,"left","imgs\\tankmissile.gif",new_enemy_tank)self.enemy_bullet_group.add(new_enemy_bullet)if new_enemy_tank.direction == "d":new_enemy_bullet = Bullet(self.screen,"right","imgs\\tankmissile.gif",new_enemy_tank)self.enemy_bullet_group.add(new_enemy_bullet) if event.type == pygame.KEYDOWN:if self.wall.customize:if event.key == pygame.K_j:self.new_wall = Walls(self.screen)self.new_wall.rect.x = self.wall.rect.xself.new_wall.rect.y = self.wall.rect.yself.new_wall.step = self.wall.stepif self.new_wall.step == 0:self.new_wall.rect.width = 30self.new_wall.rect.height = 30if self.new_wall.step == 1:self.new_wall.rect.width = 60self.new_wall.rect.height = 30if self.new_wall.step == 2:self.new_wall.rect.width = 30self.new_wall.rect.height = 60if self.new_wall.step == 3:self.new_wall.rect.width = 60self.new_wall.rect.height = 60if self.new_wall.step == 4:self.new_wall.rect.width = 30self.new_wall.rect.height = 30if self.new_wall.step == 5 or self.new_wall.step == 6:self.new_wall.rect.width = 60self.new_wall.rect.height = 60self.walls.add(self.new_wall)if event.key == pygame.K_k:self.wall.step += 1if self.wall.step == 7:self.wall.step = 0 if self.home_wall:#坦克英雄一發(fā)射子彈if self.tank_hero1.live1 or self.tank_hero1.live2 or self.tank_hero1.live3 :if event.key == pygame.K_j and key_pressed[pygame.K_w]:self.music_fire()new_bullet = Bullet(self.screen,"top","imgs\\tankmissile.gif",self.tank_hero1)self.bullets.add(new_bullet)elif event.key == pygame.K_j and key_pressed[pygame.K_s]:self.music_fire()new_bullet = Bullet(self.screen,"under","imgs\\tankmissile.gif",self.tank_hero1)self.bullets.add(new_bullet)elif event.key == pygame.K_j and key_pressed[pygame.K_d]:self.music_fire()new_bullet = Bullet(self.screen,"right","imgs\\tankmissile.gif",self.tank_hero1)self.bullets.add(new_bullet)elif event.key == pygame.K_j and key_pressed[pygame.K_a]:self.music_fire()new_bullet = Bullet(self.screen,"left","imgs\\tankmissile.gif",self.tank_hero1)self.bullets.add(new_bullet)#坦克英雄二發(fā)射子彈if self.tank_hero2.live1 or self.tank_hero2.live2 or self.tank_hero2.live3:if event.key == pygame.K_0 and key_pressed[pygame.K_UP]:self.music_fire()new_bullet = Bullet(self.screen,"top","imgs\\tankmissile.gif",self.tank_hero2)self.bullets.add(new_bullet)elif event.key == pygame.K_0 and key_pressed[pygame.K_DOWN]:self.music_fire()new_bullet = Bullet(self.screen,"under","imgs\\tankmissile.gif",self.tank_hero2)self.bullets.add(new_bullet)elif event.key == pygame.K_0 and key_pressed[pygame.K_RIGHT]:self.music_fire()new_bullet = Bullet(self.screen,"right","imgs\\tankmissile.gif",self.tank_hero2)self.bullets.add(new_bullet)elif event.key == pygame.K_0 and key_pressed[pygame.K_LEFT]:self.music_fire()new_bullet = Bullet(self.screen,"left","imgs\\tankmissile.gif",self.tank_hero2)self.bullets.add(new_bullet)if event.key == pygame.K_SPACE:self.game_active = Falseself.music = Falseself.home_wall = Trueif self.wall.customize:key_pressed = pygame.key.get_pressed()if key_pressed[pygame.K_w]:self.wall.move_up()if key_pressed[pygame.K_s]:self.wall.move_under()if key_pressed[pygame.K_d]:self.wall.move_right()if key_pressed[pygame.K_a]:self.wall.move_left()'''坦克英雄移動檢測方法'''def keyboard_check(self):if self.home_wall:key_pressed = pygame.key.get_pressed()for event in pygame.event.get():#游戲退出if event.type == pygame.QUIT:pygame.quit()sys.exit() #坦克英雄一按鍵移動 if self.tank_hero1.live1 or self.tank_hero1.live2 or self.tank_hero1.live3:if key_pressed[pygame.K_w]:if self.tank_hero1.moving_up:self.tank_hero1.direction = "w"self.tank_hero1.move_up()self.tank_hero1.transform_image_up("imgs\\p1tankU.gif")elif key_pressed[pygame.K_s]:if self.tank_hero1.moving_down:self.tank_hero1.direction = "s"self.tank_hero1.move_under()self.tank_hero1.transform_image_under("imgs\\p1tankD.gif")elif key_pressed[pygame.K_d]:if self.tank_hero1.moving_right:self.tank_hero1.direction = "d"self.tank_hero1.move_right()self.tank_hero1.transform_image_right("imgs\\p1tankR.png")elif key_pressed[pygame.K_a]:if self.tank_hero1.moving_left:self.tank_hero1.direction = "a"self.tank_hero1.move_left()self.tank_hero1.transform_image_left("imgs\\p1tankL.gif")#坦克英雄二移動if self.tank_hero2.live1 or self.tank_hero2.live2 or self.tank_hero2.live3:if key_pressed[pygame.K_UP]:if self.tank_hero2.moving_up:self.tank_hero2.direction = "w"self.tank_hero2.move_up()self.tank_hero2.transform_image_up("imgs\\p2tankU.gif")elif key_pressed[pygame.K_DOWN]:if self.tank_hero2.moving_down:self.tank_hero2.direction = "s"self.tank_hero2.move_under()self.tank_hero2.transform_image_under("imgs\\p2tankD.gif")elif key_pressed[pygame.K_RIGHT]:if self.tank_hero2.moving_right:self.tank_hero2.direction = "d"self.tank_hero2.move_right()self.tank_hero2.transform_image_right("imgs\\p2tankR.gif")elif key_pressed[pygame.K_LEFT]:if self.tank_hero2.moving_left:self.tank_hero2.direction = "a"self.tank_hero2.move_left() self.tank_hero2.transform_image_left("imgs\\p2tankL.gif")'''坦克英雄子彈移動和刪除方法'''def bullets_moving(self):for bullet in self.bullets.sprites():if bullet.direction == "top":bullet.moving_t()elif bullet.direction == "under":bullet.moving_u()elif bullet.direction == "right":bullet.moving_r()elif bullet.direction == "left":bullet.moving_l()for bullet in self.bullets.copy():if bullet.rect.bottom <= 0 or bullet.rect.bottom >=750 or bullet.rect.right >= 1136 or bullet.rect.right <= 0:self.bullets.remove(bullet)'''敵軍坦克出現(xiàn)移動'''def enemy_tank_move(self):if self.home_wall:for enemy in self.enemy_list.sprites():enemy.enemy_random_move()enemy.update()'''敵方坦克子彈移動'''def enemy_tank_bullet_move(self):if self.home_wall:for bullet in self.enemy_bullet_group.sprites():if bullet.direction == "top":bullet.moving_t()if bullet.direction == "under":bullet.moving_u()if bullet.direction == "right":bullet.moving_r()if bullet.direction == "left":bullet.moving_l()for bullet in self.enemy_bullet_group.copy():if bullet.rect.bottom <= 0 or bullet.rect.bottom >=750 or bullet.rect.right >= 1136 or bullet.rect.right <= 0:self.enemy_bullet_group.remove(bullet)'''碰撞檢測'''def collide_check(self):for enemy_bullet in self.enemy_bullet_group:hit_list = pygame.sprite.spritecollide(enemy_bullet,self.tank_hero_group,False)for hero_explode in hit_list:self.enemy_bullet_group.remove(enemy_bullet)tank_explode = Explode(self.screen,hero_explode.rect)if hero_explode.live1:hero_explode.live1 = Falsehero_explode.live2 = Trueself.tank_hero_group.remove(hero_explode)self.music_explode()for i in range(1,10):tank_explode.update()if hero_explode.a == 1:hero_explode.rect.x = 341else:hero_explode.rect.x = 674hero_explode.rect.y = 650elif hero_explode.live2:hero_explode.live2 = Falsehero_explode.live3 = Trueself.tank_hero_group.remove(hero_explode)self.music_explode()for i in range(1,10):tank_explode.update()if hero_explode.a == 1:hero_explode.rect.x = 341else:hero_explode.rect.x = 674hero_explode.rect.y = 650elif hero_explode.live3:hero_explode.live3 = Falsehero_explode.live4 = Trueself.music_explode()self.tank_hero_group.remove(hero_explode)for i in range(1,10):tank_explode.update()if hero_explode.a == 1:hero_explode.rect.x = 341else:hero_explode.rect.x = 674hero_explode.rect.y = 650for hero_bullet in self.bullets:hit_list = pygame.sprite.spritecollide(hero_bullet,self.enemy_list,False)for enemy_explode in hit_list:if enemy_explode.y >= 3:self.bullets.remove(hero_bullet)enemy_explode.y -= 1file1 = "music\\hit.wav"start_music = pygame.mixer.Sound(file1)start_music.play()tank_explode = Explode(self.screen,enemy_explode.rect)for i in range(1,10):tank_explode.update()if enemy_explode.y == 1 or enemy_explode.y == 2:self.bullets.remove(hero_bullet)enemy_explode.live = Falsetank_explode = Explode(self.screen,enemy_explode.rect)for i in range(1,10):tank_explode.update()self.enemy_list.remove(enemy_explode)self.music_explode()if enemy_explode.o == 1:if not enemy_explode.live:tank_buff = Tank_buff(self.screen)self.tank_buff_list.add(tank_buff)for hero_tank in self.tank_hero_group:collide_buff_list = pygame.sprite.spritecollide(hero_tank,self.tank_buff_list,False)for buff in collide_buff_list:if buff.m == 0:self.enemy_move = Falseif buff.m == 1:hero_tank.speed = 3for bullet in self.bullets:bullet.speed = 6if buff.m == 2:for enemy in self.enemy_list:file1 = "music\\blast.wav"start_music = pygame.mixer.Sound(file1)start_music.play()tank_explode = Explode(self.screen,enemy.rect)for i in range(1,10):tank_explode.update()self.enemy_list.remove(enemy)file1 = "music\\add.wav"start_music = pygame.mixer.Sound(file1)start_music.play()self.tank_buff_list.remove(buff)hit_list = pygame.sprite.spritecollide(self.home,self.enemy_bullet_group,False)for hit in hit_list:self.init()self.game_element()self.home.live = Falsefor hero_bullet in self.bullets:hit_wall_list = pygame.sprite.spritecollide(hero_bullet,self.walls,False)for wall in hit_wall_list:if wall.step == 0 or wall.step == 1 or wall.step == 2 or wall.step == 3: wall_explode = Explode(self.screen,wall.rect)for i in range(1,10):wall_explode.update()file1 = "music\hit.wav"start_music = pygame.mixer.Sound(file1)start_music.play()self.bullets.remove(hero_bullet)if wall.step == 4:wall_explode = Explode(self.screen,wall.rect)for i in range(1,10):wall_explode.update()self.walls.remove(wall)self.bullets.remove(hero_bullet)for bullet in self.enemy_bullet_group:hit_wall_list = pygame.sprite.spritecollide(bullet,self.walls,False)for wall in hit_wall_list:if wall.step == 0 or wall.step == 1 or wall.step == 2 or wall.step == 3:wall_explode = Explode(self.screen,wall.rect)for i in range(1,10):wall_explode.update()file1 = "music\hit.wav"start_music = pygame.mixer.Sound(file1)start_music.play()self.enemy_bullet_group.remove(bullet)if wall.step == 4:wall_explode = Explode(self.screen,wall.rect)for i in range(1,10):wall_explode.update()self.walls.remove(wall)self.enemy_bullet_group.remove(bullet)#英雄坦克碰撞墻壁不能繼續(xù)向前走for hero_tank in self.tank_hero_group:collide_tank_list = pygame.sprite.spritecollide(hero_tank,self.walls,False)for wall in collide_tank_list:if wall.step == 0 or wall.step == 1 or wall.step == 2 or wall.step == 3 or wall.step == 4 or wall.step == 5:if hero_tank.direction == "w" and wall.rect.bottom == hero_tank.rect.top + 1 or wall.rect.bottom == hero_tank.rect.top + 2 or wall.rect.bottom == hero_tank.rect.top + 3:hero_tank.moving_up = Falseelif hero_tank.direction == "s" and wall.rect.top + 1 == hero_tank.rect.bottom or wall.rect.top + 2 == hero_tank.rect.bottom or wall.rect.top + 3 == hero_tank.rect.bottom:hero_tank.moving_down = Falseelif hero_tank.direction == "d" and wall.rect.left + 1 == hero_tank.rect.right or wall.rect.left + 2 == hero_tank.rect.right or wall.rect.left + 3 == hero_tank.rect.right:hero_tank.moving_right = Falseelif hero_tank.direction == "a" and wall.rect.right == hero_tank.rect.left + 1 or wall.rect.right == hero_tank.rect.left + 2 or wall.rect.right == hero_tank.rect.left + 3:hero_tank.moving_left = False#敵方坦克碰撞墻壁不能繼續(xù)向前走for enemy_tank in self.enemy_list:collide_tank_list = pygame.sprite.spritecollide(enemy_tank,self.walls,False)for wall in collide_tank_list:if wall.step == 0 or wall.step == 1 or wall.step == 2 or wall.step == 3 or wall.step == 4 or wall.step == 5:if enemy_tank.direction == "w" and wall.rect.bottom == enemy_tank.rect.top + 1 or wall.rect.bottom == enemy_tank.rect.top + 2 or wall.rect.bottom == enemy_tank.rect.top + 3:enemy_tank.moving_up = Falseelif enemy_tank.direction == "s" and wall.rect.top + 1 == enemy_tank.rect.bottom or wall.rect.top + 2 == enemy_tank.rect.bottom or wall.rect.top + 3 == enemy_tank.rect.bottom:enemy_tank.moving_down = Falseelif enemy_tank.direction == "d" and wall.rect.left + 1 == enemy_tank.rect.right or wall.rect.left + 2 == enemy_tank.rect.right or wall.rect.left + 3 == enemy_tank.rect.right:enemy_tank.moving_right = Falseelif enemy_tank.direction == "a" and wall.rect.right == enemy_tank.rect.left + 1 or wall.rect.right == enemy_tank.rect.left + 2 or wall.rect.right == enemy_tank.rect.left + 3:enemy_tank.moving_left = False'''讓坦克英雄能移動問題(也就是照應(yīng)碰撞墻壁)'''def tank_moving(self):self.tank_hero1.moving_up = Trueself.tank_hero1.moving_down = Trueself.tank_hero1.moving_right = Trueself.tank_hero1.moving_left = Trueself.tank_hero2.moving_up = Trueself.tank_hero2.moving_down = Trueself.tank_hero2.moving_right = Trueself.tank_hero2.moving_left = True'''游戲元素方法'''def game_element(self):#生成坦克英雄self.tank_hero1 = Tank_hero(self.screen,2,"imgs\\p1tankU.gif",341,650)self.tank_hero2 = Tank_hero(self.screen,2,"imgs\\p2tankU.gif",674,650)#區(qū)別坦克英雄一和坦克英雄二self.tank_hero2.a = 2#生成子彈精靈組(坦克英雄一和坦克英雄二)self.bullets = pygame.sprite.Group()#生成子彈精靈組(敵方坦克)self.enemy_bullet_group = pygame.sprite.Group()#生成敵人子彈精靈組self.enemy_list = pygame.sprite.Group()#生成坦克英雄精靈組self.tank_hero_group = pygame.sprite.Group()#把兩個英雄坦克添加到坦克英雄精靈組中self.tank_hero_group.add(self.tank_hero1,self.tank_hero2)#坦克英雄小圖標(用于計算坦克英雄生命個數(shù))self.tank1 = pygame.image.load("imgs\\000.gif")self.tank2 = pygame.image.load("imgs\\0000.gif")#這個是家,如果家爆炸了,game over.self.home = Home(self.screen)#這個是生成一個墻對象self.wall = Walls(self.screen)#墻壁的精靈組self.walls = pygame.sprite.Group()#調(diào)用墻對象的draw_home方法self.home.draw_home()#這個是坦克buffself.tank_buff_list = pygame.sprite.Group()#剛開始游戲填充顏色self.screen.fill(self.bg_color)'''游戲說明界面'''def game_description_interface(self):#生成矩形對象self.tank_hero1_handle = Game_interface(self.screen,"坦克英雄一操作",(298,100))self.tank_hero1_up_handle = Game_interface(self.screen,"向上按鍵:w",(298,160))self.tank_hero1_down_handle = Game_interface(self.screen,"向下按鍵:s",(298,220))self.tank_hero1_right_handle = Game_interface(self.screen,"向右按鍵:d",(298,280))self.tank_hero1_left_handle = Game_interface(self.screen,"向上按鍵:a",(298,340))self.tank_hero1_fire_handle = Game_interface(self.screen,"發(fā)射子彈:j",(298,400))self.tank_hero2_handle = Game_interface(self.screen,"坦克英雄二操作",(818,100))self.tank_hero2_up_handle = Game_interface(self.screen,"向上按鍵:↑",(818,160))self.tank_hero2_down_handle = Game_interface(self.screen,"向上按鍵:↓",(818,220))self.tank_hero2_right_handle = Game_interface(self.screen,"向上按鍵:→",(818,280))self.tank_hero2_left_handle = Game_interface(self.screen,"向上按鍵:←",(818,340))self.tank_hero2_fire_handle = Game_interface(self.screen,"發(fā)射子彈:0",(818,400))self.game_suspend = Game_interface(self.screen,"游戲暫停:空格鍵",(543,500))self.game_point = Game_interface(self.screen,"溫馨提示:請等待9秒自動返回",(543,560))self.tank_hero1_handle.draw_interface()self.tank_hero1_up_handle.draw_interface()self.tank_hero1_down_handle.draw_interface()self.tank_hero1_right_handle.draw_interface()self.tank_hero1_left_handle.draw_interface()self.tank_hero1_fire_handle.draw_interface()self.tank_hero2_handle.draw_interface()self.tank_hero2_up_handle.draw_interface()self.tank_hero2_down_handle.draw_interface()self.tank_hero2_right_handle.draw_interface()self.tank_hero2_left_handle.draw_interface()self.tank_hero2_fire_handle.draw_interface()self.game_suspend.draw_interface()self.game_point.draw_interface()#繪制矩形對象pygame.display.update()'''繪制游戲按鈕'''def bg_button(self):#創(chuàng)建開始游戲按鈕self.play_button = Button(self.screen,"開始游戲")#繪制開始游戲按鈕self.play_button.draw_button()#創(chuàng)建游戲說明按鈕self.description_button = Button(self.screen,"游戲說明")self.description_button.rect.center = (450,360)#創(chuàng)建自定義地圖按鈕self.customize_map_button = Button(self.screen,"自定義地圖")self.customize_map_button.rect.center = (450,420)#繪制自定義地圖按鈕self.customize_map_button.draw_button()#繪制游戲說明按鈕self.description_button.draw_button()#刷新顯示pygame.display.update()'''坦克英雄發(fā)射子彈音效'''def music_fire(self):self.file4 = "music\\fire.wav"fire_music = pygame.mixer.Sound(self.file4)fire_music.play()'''所有坦克爆炸音效'''def music_explode(self):self.file3 = "music\\blast.wav"explode_music = pygame.mixer.Sound(self.file3)explode_music.play()'''繪制圖像方法'''def draw_image(self):self.screen.fill(self.bg_color)if self.home_wall:if self.tank_hero1.live1:self.screen.blit(self.tank_hero1.image,self.tank_hero1.rect)if self.tank_hero2.live1:self.screen.blit(self.tank_hero2.image,self.tank_hero2.rect)if self.tank_hero1.live2:self.screen.blit(self.tank_hero1.image,self.tank_hero1.rect)self.tank_hero_group.add(self.tank_hero1)if self.tank_hero1.live3:self.screen.blit(self.tank_hero1.image,self.tank_hero1.rect)self.tank_hero_group.add(self.tank_hero1)if self.tank_hero2.live2:self.screen.blit(self.tank_hero2.image,self.tank_hero2.rect)self.tank_hero_group.add(self.tank_hero2)if self.tank_hero2.live3:self.screen.blit(self.tank_hero2.image,self.tank_hero2.rect)self.tank_hero_group.add(self.tank_hero2)self.bullets.draw(self.screen)self.enemy_list.draw(self.screen)self.enemy_bullet_group.draw(self.screen)self.tank_hero1.residue_tank()self.tank_hero2.y = 650self.tank_hero2.color = (158,253,200)self.tank_hero2.residue_tank()self.home.draw_home()self.screen.blit(self.bg_2,(0,0))self.screen.blit(self.bg_1,(0,0))self.screen.blit(self.bg_2,(0,710))self.screen.blit(self.bg_1,(1068,0))self.screen.blit(self.tank1,(1073,600))self.screen.blit(self.tank2,(1073,650))self.tank_hero1.residue_tank()self.tank_hero2.y = 650self.tank_hero2.color = (158,253,200)self.tank_hero2.residue_tank()if not self.home_wall:self.wall.update()self.wall.no_screen()if len(self.walls)!=0:self.walls.draw(self.screen)self.tank_buff_list.draw(self.screen)def init(self):'''初始化所有模塊'''self.enemy_list.empty()self.enemy_bullet_group.empty()self.tank_hero1.live1 = Trueself.tank_hero1.live2 = Falseself.tank_hero1.live3 = Falseself.tank_hero2.live1 = Trueself.tank_hero2.live2 = Falseself.tank_hero2.live3 = Falseself.tank_hero1.residue_tank()self.tank_hero2.residue_tank()self.bullets.empty()'''刷新顯示方法'''def update(self):self.bullets.update()self.enemy_list.update()self.enemy_bullet_group.update()self.walls.update()self.tank_buff_list.update()pygame.display.update()'''繪制坦克出生的圖片'''def born_image(self,rect):self.screen.blit(self.start1,rect)pygame.time.delay(10)pygame.display.update()self.screen.blit(self.start2,rect)pygame.time.delay(10)pygame.display.update()self.screen.blit(self.start3,rect)pygame.time.delay(10)pygame.display.update()self.screen.blit(self.start4,rect)pygame.time.delay(10)pygame.display.update()tank_big_war = Tank_war_main()下面是素材
鏈接:https://pan.baidu.com/s/1xy1VSIrdlPfkB7i1SnbCEQ
提取碼:mnhx
總結(jié)
以上是生活随笔為你收集整理的利用python中的pygame模块开发fc坦克大战(可自定义地图,包括部分素材)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第3章 Python 数字图像处理(DI
- 下一篇: 第3章 Python 数字图像处理(DI