刚开始学习计算机,代码写的良莠不齐,多担待哈。
**
大体分为10个模块:
button.py
'''游戏按钮模块'''
import pygame
class Button():
def __init__(self,screen,msg):
'''初始化按钮属性'''
self.screen = screen
self.msg = msg
#设置按钮的尺寸和其它属性
self.width = 200
self.height = 50
self.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 Sprite
class Walls(Sprite):
def __init__(self,screen):
self.customize = False
Sprite.__init__(self)
self.screen = screen
self.stop = False
self.step = 0
self.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 = 68
self.rect.y = 40
self.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.speed
def move_under(self):
if not self.stop:
self.rect.y += self.speed
def move_left(self):
if not self.stop:
self.rect.x -= self.speed
def move_right(self):
if not self.stop:
self.rect.x += self.speed
def no_screen(self):
if self.rect.x <= 68:
self.rect.x = 68
if self.rect.x >= 1008:
self.rect.x = 1008
if self.rect.y <= 40:
self.rect.y = 40
if self.rect.y >= 650:
self.rect.y = 650
game_interface.py
'''游戏开始前背景图片更换模块'''
import pygame
class Game_interface():
def __init__(self,screen,msg,rect):
self.screen = screen
self.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 = 0
self.width = 450
self.height = 50
self.interface_color = (0,255,0)
self.text_color = (255,255,255)
self.size = 30
self.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 = 0
else:
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 Sprite
class Home(Sprite):
def __init__(self,screen):
Sprite.__init__(self)
self.screen = screen
self.screen_rect = self.screen.get_rect()
self.live = True
self.images = [pygame.image.load("imgs\\symbol.gif"),pygame.image.load("imgs\\destory.gif")]
self.step = 0
def draw_home(self):
if self.live:
self.image1 = self.images[self.step]
self.rect = self.image1.get_rect()
self.rect.width = 60
self.rect.height = 45
self.rect.x = 500
self.rect.y = 665
self.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 = 60
self.rect.height = 45
self.rect.x = 500
self.rect.y = 665
self.screen.blit(self.image2,self.rect)
tank_buff.py
'''坦克buff模块'''
import random
import pygame
from pygame.sprite import Sprite
class Tank_buff(Sprite):
def __init__(self,screen):
Sprite.__init__(self)
self.screen = screen
self.random_image()
def random_image(self):
r = random.randint(0,2)
if r == 0:
self.m = 0
self.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 = 1
self.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 = 2
self.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 pygame
from pygame.sprite import Sprite
class Bullet(Sprite):
def __init__(self,screen,direction,image,tank_hero):
Sprite.__init__(self)
self.screen = screen
self.image = pygame.image.load(image)
self.direction = direction
self.rect = self.image.get_rect()
self.speed = 5
self.live = True
self.moving = False
if self.direction == "top":
self.rect.x = tank_hero.rect.x+23
self.rect.y = tank_hero.rect.y-5
elif self.direction == "under":
self.rect.x = tank_hero.rect.x+23
self.rect.y = tank_hero.rect.y+60
elif self.direction == "right":
self.rect.x = tank_hero.rect.x+60
self.rect.y = tank_hero.rect.y+23
elif self.direction == "left":
self.rect.x = tank_hero.rect.x
self.rect.y = tank_hero.rect.y+23
def moving_t(self):
self.rect.y -= self.speed
def moving_l(self):
self.rect.x -= self.speed
def moving_r(self):
self.rect.x += self.speed
def 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 = screen
self.direction = "a"
self.o = 2
#坦克移动的速度
self.speed = speed
#坦克按照某个方向移动的步数
self.step = 120
self.y = 0
self.first = 1
self.limit = 1
if self.direction == "a":
self.image = pygame.image.load(image)
self.moving_up = True
self.moving_down = True
self.moving_right = True
self.moving_left = True
#坦克的图片由方向决定
self.rect = self.image.get_rect()
self.rect.x = random.choice((68,538,1008))
self.rect.y = 40
self.image1 = self.image
self.live = True
self.get_random()
def direction_move(self):
if self.direction == "a":
self.image = self.image1
elif self.direction == "w":
if self.first > 0:
self.first -= 1
self.image = pygame.transform.rotate(self.image1,270)
elif self.direction == "s":
if self.first > 0:
self.first -= 1
self.image = pygame.transform.rotate(self.image1,90)
elif self.direction == "d":
if self.first > 0:
self.first -= 1
self.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 = True
elif r == 2:
self.direction = "w"
self.moving_up = True
elif r == 3:
self.direction = "a"
self.moving_left =True
elif r == 0:
self.direction = "s"
self.moving_down = True
def move(self):
if self.direction == "a":
if self.moving_left:
if self.rect.x <= 68:
self.rect.x = 68
else:
self.rect.x -= self.speed
self.direction_move()
elif self.direction == "d":
if self.moving_right:
if self.rect.x >= 1008:
self.rect.x = 1008
else:
self.rect.x += self.speed
self.direction_move()
elif self.direction == "w":
if self.moving_up:
if self.rect.y <= 40:
self.rect.y = 40
else:
self.rect.y -= self.speed
self.direction_move()
elif self.direction == "s":
if self.moving_down:
if self.rect.y >= 650:
self.rect.y = 650
else:
self.rect.y += self.speed
self.direction_move()
#敌方坦克,按照一个确定的随机方向,连续移动六步,才能再次改变方向
def enemy_random_move(self):
if self.live:
if self.step == 0:
self.first = 1
self.get_random()
self.step = 120
else:
self.move()
self.step -= 1
class Tank_twinkle(Sprite):
def __init__(self,screen):
Sprite.__init__(self)
self.step1 = 0
self.step = 1
self.get_random()
self.y = 5
self.o = 1
self.screen = screen
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.image = self.images[self.step]
self.rect = self.image.get_rect()
self.rect.x = random.choice((68,538,1008))
self.rect.y = 40
self.live = True
self.speed = 2
self.limit = 3
def 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 = True
elif r == 2:
self.direction = "w"
self.moving_up = True
elif r == 3:
self.direction = "a"
self.moving_left =True
elif r == 0:
self.direction = "s"
self.moving_down = True
def move(self):
if self.direction == "a":
if self.moving_left:
if self.rect.x <= 68:
self.rect.x = 68
else:
self.rect.x -= self.speed
self.direction_move()
elif self.direction == "d":
if self.moving_right:
if self.rect.x >= 1008:
self.rect.x = 1008
else:
self.rect.x += self.speed
self.direction_move()
elif self.direction == "w":
if self.moving_up:
if self.rect.y <= 40:
self.rect.y = 40
else:
self.rect.y -= self.speed
self.direction_move()
elif self.direction == "s":
if self.moving_down:
if self.rect.y >= 650:
self.rect.y = 650
else:
self.rect.y += self.speed
self.direction_move()
#敌方坦克,按照一个确定的随机方向,连续移动六步,才能再次改变方向
def enemy_random_move(self):
if self.live:
if self.step == 0:
self.step1 = 0
self.get_random()
self.step = 120
else:
self.move()
self.step -= 1
def twinkle(self):
if self.step1 == len(self.images)-1:
self.step1 = 0
else:
self.image = self.images[self.step1]
self.screen.blit(self.image,self.rect)
pygame.display.update()
self.step1 += 1
tank_explode.py
'''爆炸模块'''
import pygame
import time
class Explode():
def __init__(self,screen,rect):
self.live = True
self.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 = rect
self.step = 0
#在整个游戏过程中,循环使用,每隔0.05秒调用一次
def update(self):
if self.live:
#最后一张爆炸图片已经显示了
if self.step == len(self.images):
self.live = False
else:
self.image = self.images[self.step]
self.screen.blit(self.image,(self.rect.x-30,self.rect.y-30))
pygame.display.update()
self.step += 1
else:
return
#删除该对象
tank_hero.py
'''己方坦克模块'''
import pygame
from pygame.sprite import Sprite
'''定义一个坦克英雄类'''
import pygame.font
class Tank_hero(Sprite):
#初始化方法
def __init__(self,screen,speed,image,x,y):
Sprite.__init__(self)
self.screen = screen
self.screen_rect = self.screen.get_rect()
self.image = pygame.image.load(image)
self.rect = self.image.get_rect()
self.rect.x = x
self.rect.y = y
self.life_limit = 3
self.live1 = True
self.live2 = False
self.live3 = False
self.live4 = False
self.stop = False
self.speed = speed
self.font = pygame.font.SysFont(None,22)
self.a = 1
self.moving_up = True
self.moving_down = True
self.moving_right = True
self.moving_left = True
self.direction = "w"
self.x = 1098
self.y = 600
self.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.speed
def move_under(self):
self.rect.y += self.speed
def move_right(self):
self.rect.x += self.speed
def move_left(self):
self.rect.x -= self.speed
def no_screen(self):
if self.rect.x <= 68:
self.rect.x = 68
if self.rect.x >= 1008:
self.rect.x = 1008
if self.rect.y <= 40:
self.rect.y = 40
if self.rect.y >= 650:
self.rect.y = 650
def 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 time
class 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.USEREVENT
self.event = pygame.USEREVENT + 1
pygame.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 = True
self.home.live = True
self.home.wall = True
self.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 = False
self.game_active = True
#初始化敌方坦克数量
self.enemy_tank_limit = 30
self.enemy_tank_limit1 = 5
self.game_element()
self.wall.customize = True
self.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 -= 1
if self.enemy_tank_limit > 0:
new_enemy_tank2 = Tank_enemy(self.screen,"imgs\\enemy2L.gif",3)
new_enemy_tank2.y = 2
self.born_image(new_enemy_tank2)
self.enemy_list.add(new_enemy_tank2)
self.enemy_tank_limit -= 1
if self.enemy_tank_limit > 0:
new_enemy_tank3 = Tank_enemy(self.screen,"imgs\\enemy3L.gif",2)
new_enemy_tank3.y = 5
self.born_image(new_enemy_tank3)
self.enemy_list.add(new_enemy_tank3)
self.enemy_tank_limit -= 1
if 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 -= 1
for 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.x
self.new_wall.rect.y = self.wall.rect.y
self.new_wall.step = self.wall.step
if self.new_wall.step == 0:
self.new_wall.rect.width = 30
self.new_wall.rect.height = 30
if self.new_wall.step == 1:
self.new_wall.rect.width = 60
self.new_wall.rect.height = 30
if self.new_wall.step == 2:
self.new_wall.rect.width = 30
self.new_wall.rect.height = 60
if self.new_wall.step == 3:
self.new_wall.rect.width = 60
self.new_wall.rect.height = 60
if self.new_wall.step == 4:
self.new_wall.rect.width = 30
self.new_wall.rect.height = 30
if self.new_wall.step == 5 or self.new_wall.step == 6:
self.new_wall.rect.width = 60
self.new_wall.rect.height = 60
self.walls.add(self.new_wall)
if event.key == pygame.K_k:
self.wall.step += 1
if 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 = False
self.music = False
self.home_wall = True
if 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 = False
hero_explode.live2 = True
self.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 = 341
else:
hero_explode.rect.x = 674
hero_explode.rect.y = 650
elif hero_explode.live2:
hero_explode.live2 = False
hero_explode.live3 = True
self.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 = 341
else:
hero_explode.rect.x = 674
hero_explode.rect.y = 650
elif hero_explode.live3:
hero_explode.live3 = False
hero_explode.live4 = True
self.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 = 341
else:
hero_explode.rect.x = 674
hero_explode.rect.y = 650
for 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 -= 1
file1 = "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 = False
tank_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 = False
if buff.m == 1:
hero_tank.speed = 3
for bullet in self.bullets:
bullet.speed = 6
if 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 = False
for 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 = False
elif 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 = False
elif 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 = False
elif 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 = False
elif 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 = False
elif 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 = False
elif 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 = True
self.tank_hero1.moving_down = True
self.tank_hero1.moving_right = True
self.tank_hero1.moving_left = True
self.tank_hero2.moving_up = True
self.tank_hero2.moving_down = True
self.tank_hero2.moving_right = True
self.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()
#这个是坦克buff
self.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 = 650
self.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 = 650
self.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 = True
self.tank_hero1.live2 = False
self.tank_hero1.live3 = False
self.tank_hero2.live1 = True
self.tank_hero2.live2 = False
self.tank_hero2.live3 = False
self.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://download.csdn.net/download/weixin_45138636/11241851