利用python中的pygame模块开发fc坦克大战(可自定义地图,包括部分素材)
刚开始学习计算机,代码写的良莠不齐,多担待哈。
这个资源积分我自己修改不了,没办法,想直接要代码和素材的朋友请qq我:1638179220,欢迎。
**
游戏效果图:
**
pygame—坦克大战
大体分为10个模块:
button.py
'''游戏按钮模块'''import pygameclass Button():def __init__(self,screen,msg):'''初始化按钮属性'''self.screen = screenself.msg = msg#设置按钮的尺寸和其它属性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)#创建按钮的矩形对象self.rect = pygame.Rect(0,0,self.width,self.height)self.rect.center = (450,300)#创建按钮的标签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 = 650
game_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)#创建按钮的矩形对象self.rect = pygame.Rect(0,0,self.width,self.height)self.rect.center = rect#创建按钮的标签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 += 1
home.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.speed
tank_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#坦克按照某个方向移动的步数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()#敌方坦克,按照一个确定的随机方向,连续移动六步,才能再次改变方向 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()#敌方坦克,按照一个确定的随机方向,连续移动六步,才能再次改变方向 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 += 1
tank_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#在整个游戏过程中,循环使用,每隔0.05秒调用一次def update(self):if self.live:#最后一张爆炸图片已经显示了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
'''坦克大战游戏'''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#创建一个屏幕对象self.screen = pygame.display.set_mode((1136,750))#游戏名字self.caption = pygame.display.set_caption("坦克大战增强版")#背景颜色self.bg_color = (30,30,90)#非是游戏活动状态self.game_active = False#敌方坦克限制数量self.enemy_tank_limit = 30#闪烁坦克限制数量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()#循环播放音乐self.file2 = "music\林俊杰 - 进阶.mp3"self.bg_music = pygame.mixer.music.load(self.file2)#pygame.mixer.music.play(-1)#初始化游戏元素self.game_element()#执行游戏主循环self.loop()'''游戏主循环方法'''def loop(self):#生成一个背景图片对象,以便用于刚开始背景图像的绘制self.screen_bg = Game_interface(self.screen,"..",(-400,-400))while True:#设置帧率self.clock.tick(120)#监听鼠标事件self.mouse_check()#不是游戏活动状态if not self.game_active:#绘制按钮self.bg_button()#绘制背景图self.screen_bg.screen_bg()#游戏活动状态if self.game_active:#碰撞检测self.collide_check()#监听键盘事件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'''按钮点击和坦克英雄发射子弹事件方法'''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#监听鼠标事件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#初始化敌方坦克数量self.enemy_tank_limit = 30self.enemy_tank_limit1 = 5self.game_element()self.wall.customize = Trueself.init()if self.game_active:'''定时器'''#敌方坦克定时出现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:#坦克英雄一发射子弹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)#坦克英雄二发射子弹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)'''敌军坦克出现移动'''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)#英雄坦克碰撞墙壁不能继续向前走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#敌方坦克碰撞墙壁不能继续向前走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'''让坦克英雄能移动问题(也就是照应碰撞墙壁)'''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)#区别坦克英雄一和坦克英雄二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)#坦克英雄小图标(用于计算坦克英雄生命个数)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()#调用墙对象的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,"发射子弹: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,"发射子弹: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):#创建开始游戏按钮self.play_button = Button(self.screen,"开始游戏")#绘制开始游戏按钮self.play_button.draw_button()#创建游戏说明按钮self.description_button = Button(self.screen,"游戏说明")self.description_button.rect.center = (450,360)#创建自定义地图按钮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()'''坦克英雄发射子弹音效'''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
利用python中的pygame模块开发fc坦克大战(可自定义地图,包括部分素材)相关推荐
- 在Ubuntu 16.04.5 LTS上利用python中的PIL模块压缩一百多兆的单张图片实操
在前面的博文中,我将300多张电影海报拼接为了一张103MB的巨幅图片,我想拿它做电脑桌面(1080P),但是这么多的图片,存储和加载是个麻烦事儿,需要将它压缩到几MB大小. 在Ubuntu 16.0 ...
- python中的pygame模块使用方法_Pygame的基本使用
Pygame有很多模块,每个模块又有很多方法,在此不能够逐一讲解,所以,我们通过一个实例来学习Pygame,然后再分解代码,讲解代码中的模块. 例:制作一个跳跃的小球游戏. 创建一个游戏窗口,然后在窗 ...
- 利用python中的gzip模块压缩和解压数据流和文件
直接给出源码实现, 分为两种情况: 1.网络连接中的数据流的压缩和解压,或是打开的文件读取一部分 2.打开文件压缩或是解压 #!/usr/bin/env python #encoding: utf-8 ...
- python doc转docx_利用python中的win32com模块将doc文件转为docx文件
简介 win32com模块的功能也是非常的强大的,能够处理各种的文件 word操作 如何使用python的win32com模块实现将doc类型文件转成docx类型的文件 import os from ...
- 利用python中的zipfile模块进行解压缩
文章目录 一.主要使用代码: 二.详解 1.压缩文件的基本信息 2.解压文件 本文主要说解压的问题 一.主要使用代码: #导入模块 import zipfile #压缩包所在路径 file_dir=' ...
- python中的sympy模块求导和解方程
利用python中的sympy模块求导和解方程 对sympy这个模块我不是很了解,我学习python主要是想往机器学习和深度学习方向发展.这次了解到有这个模块,是因为有同学在写论文中要用到求导,并且计 ...
- python保存变量sklearn.externals_如何利用python中的sklearn.externals 模块保存加载训练模型...
前提:在做模型训练的时候,尤其是在训练集上做交叉验证,通常想要将模型保存下来,然后放到独立的测试集上进行测试,本文主要介绍如何利用python中的sklearn.externals 模块保存训练模型, ...
- python中的numpy模块
参考 python中的numpy模块 - 云+社区 - 腾讯云 目录 NumPy 教程 学习本教程前你需要了解 NumPy 应用 相关链接 NumPy 安装 1.使用已有的发行版本 2.使用 pip ...
- 介绍Python中的__future__模块
这篇文章主要介绍了介绍Python中的__future__模块,__future__模块使得在Python2.x的版本下能够兼容更多的Python3.x的特性,需要的朋友可以参考下 Python的每个 ...
- python中的logging记录日志_[ Python入门教程 ] Python中日志记录模块logging使用实例...
python中的logging模块用于记录日志.用户可以根据程序实现需要自定义日志输出位置.日志级别以及日志格式. 将日志内容输出到屏幕 一个最简单的logging模块使用样例,直接打印显示日志内容到 ...
最新文章
- 界面代码ios不响应presentModalViewController界面的处理
- 目标检测--R-FCN: Object Detection via Region-based Fully Convolutional Networks
- 在centos上通过yum直接安装最新版gcc和开发工具
- 【Android 热修复】Tinker 简介
- java 录屏_java 录屏 小工具源码(idea)
- oracle 01304,关于ORA-01034和ORA-27101的解决方法
- ServletContext作用功能详解
- 2016年CIO要掌握五大新思维
- skb_buff结构体解析
- C++编译为动态链接库并用python调用
- java文件边读边写_[Java教程]node.js 利用流实现读写同步,边读边写
- 2022年护士考试知识强化巩固习题及答案
- Unity UI 框架
- 不经意传输协议快速入门
- 弘扬文明之风,彰显正能量!中山公园职工平凡岗位上的不凡坚守!
- java实现环形队列
- STM32的HAL库知识总结
- 梅科尔工作室-DjangoWeb 应用框架+MySQL数据库第五次培训
- 科技部“云计算和大数据”重点专项2018年度项目申报指南发布
- 中信银行国航携程维萨联合推出联名信用卡