坦克大战4
1.玩家坦克
class Player:
"""玩家管理"""
def __init__(self,view_manager,screen):
#生命
self.hp = 100
#杀敌数量
self.kill = 0
#动作
self.move = pv.MOVE_STAND
#记录最近一次保持的动作;初始化的时候是朝上
self.lastmove = pv.MOVE_UP
#移动速度
self.speed = 5
#玩家坐标
self.x = view_manager.screen_width / 2
self.y = view_manager.screen_height * 3 / 4
#玩家发射的子弹
self.bullets = []
#当前炮口的中心坐标
self.guncenterx = -1
self.guncentery = -1
#发射炮弹的间隔
self.firedelay = 0.3
#上次发射炮弹的时间
self.firetime = datetime.datetime.now() - datetime.timedelta(days=1)
#字体
self.font = view_manager.font[1]
def is_die(self):
if self.hp <= 0:
return True
else:
return False
#控制角色移动
def move_position(self,view_manager,screen):
if self.move == pv.MOVE_STAND:
return
# 更新角色位置
if self.move == pv.MOVE_LEFT:
self.x-=self.speed
#左边界判断
if self.x <= 0:
self.x = 0
elif self.move == pv.MOVE_RIGHT:
self.x+=self.speed
#右边界判断
bodysize = view_manager.player_body[3].get_rect()
if self.x + bodysize.width >= view_manager.screen_width :
self.x = view_manager.screen_width - bodysize.width
elif self.move == pv.MOVE_UP:
self.y-=self.speed
#右边界判断
if self.y <= 0:
self.y = 0
elif self.move == pv.MOVE_DOWN:
self.y+=self.speed
#下边界判断
bodysize = view_manager.player_body[1].get_rect()
if self.y + bodysize.height >= view_manager.screen_height :
self.y = view_manager.screen_height - bodysize.height
#当前图像范围
def getrect(self ,view_manager):
if self.lastmove == pv.MOVE_UP :
return view_manager.player_body[0].get_rect()
if self.lastmove == pv.MOVE_DOWN:
return view_manager.player_body[1].get_rect()
if self.lastmove == pv.MOVE_LEFT:
return view_manager.player_body[2].get_rect()
if self.lastmove == pv.MOVE_RIGHT:
return view_manager.player_body[3].get_rect()
return None
#绘制角色
def draw(self,view_manager,screen):
direct = self.move
# 绘制角色站立的位置
if self.move == pv.MOVE_STAND:
#未进行任何操作的时候,保持最后一次控制的方向
direct = self.lastmove
if direct == pv.MOVE_UP:
screen.blit(view_manager.player_body[0],(self.x,self.y))
if direct == pv.MOVE_DOWN:
screen.blit(view_manager.player_body[1],(self.x,self.y))
if direct == pv.MOVE_LEFT:
screen.blit(view_manager.player_body[2],(self.x,self.y))
if direct == pv.MOVE_RIGHT:
screen.blit(view_manager.player_body[3],(self.x,self.y))
#绘制矩形角色血量条
pygame.draw.rect(screen,pv.COLOR_RED,Rect((self.x + 5 , self.y - 5),(self.hp , 5)))
#绘制杀敌数量
killtxt = self.font.render('击毁:' + str(self.kill) ,1,pv.COLOR_RED)
screen.blit(killtxt,(5,5))
#角色控制
def work(self,screen,view_manager):
#角色移动
self.move_position(view_manager,screen)
#绘制角色
self.draw(view_manager,screen)
#移除已经失效的炮弹
for b in self.bullets:
if b.is_effect == False:
self.bullets.remove(b)
#绘制角色发射的炮弹
for b in self.bullets:
b.move_position(view_manager,screen)
b.draw(view_manager,screen)
#炮口的坐标
def guncenter(self,view_manager):
if self.lastmove == pv.MOVE_UP :
bodyrect = view_manager.player_body[0].get_rect()
self.guncenterx = self.x + bodyrect.width / 2 - 4
self.guncentery = self.y
return
if self.lastmove == pv.MOVE_DOWN:
bodyrect = view_manager.player_body[1].get_rect()
self.guncenterx = self.x + bodyrect.width / 2 - 4
self.guncentery = self.y + bodyrect.height
return
if self.lastmove == pv.MOVE_LEFT:
bodyrect = view_manager.player_body[2].get_rect()
self.guncenterx = self.x
self.guncentery = self.y + bodyrect.height / 2 - 4
return
if self.lastmove == pv.MOVE_RIGHT:
bodyrect = view_manager.player_body[3].get_rect()
self.guncenterx = self.x + bodyrect.width
self.guncentery = self.y + bodyrect.height / 2 - 4
return
#发射炮弹
def fire(self,screen,view_manager):
#每间隔1秒发射一次
firepass = (datetime.datetime.now() - self.firetime).microseconds / 1000000
if firepass < self.firedelay :
return
self.firetime = datetime.datetime.now()
#更新炮口坐标
self.guncenter(view_manager)
#创建炮弹 #根据当前的面向设置炮弹
newbullet = Bullet(view_manager,screen,self.guncenterx,self.guncentery,self.lastmove)
#模拟爆炸
#newbullet.is_bomb = True
#记录炮弹
self.bullets.append(newbullet)
#播放音乐:发射
view_manager.sounds[0].play()
2.敌对坦克
class Monster:
"""敌人处理"""
def __init__(self,view_manager,screen):
#血量
self.hp = 100
#动作
self.move = pv.MOVE_DOWN
#记录最近一次保持的动作;初始化的时候是朝上
self.lastmove = pv.MOVE_DOWN
#移动速度
self.speed = 4
#随机出现坐标在屏幕上半部分
self.x = random.randint(100,view_manager.screen_width - 300)
self.y = random.randint(0,view_manager.screen_height / 2)
#发射的子弹
self.bullets = []
#当前炮口的中心坐标
self.guncenterx = -1
self.guncentery = -1
#发射炮弹的间隔
self.firedelay = 1
#上次发射炮弹的时间
self.firetime = datetime.datetime.now() - datetime.timedelta(days=1)
#更改方向的间隔
self.changemovedelay = random.randint(0,3)
#上次更改移动方向的时间
self.changemovetime = datetime.datetime.now() - datetime.timedelta(days=1)
#控制移动
def move_position(self,view_manager,screen):
#重新生成移动方向
changepass = (datetime.datetime.now() - self.changemovetime).seconds
if changepass > self.changemovedelay :
self.changemovetime = datetime.datetime.now()
#随机生成4个方向状态
self.move = random.randint(1,4)
self.lastmove = self.move
#随机下次变向间隔
self.changemovedelay = random.randint(0,3)
#更新角色位置
# 站立不动
if self.move == pv.MOVE_STAND:
return
# 向左
if self.move == pv.MOVE_LEFT:
self.x-=self.speed
#左边界判断
if self.x <= 0:
self.x = 0
self.move = pv.MOVE_RIGHT
self.lastmove = self.move
# 向右
elif self.move == pv.MOVE_RIGHT:
self.x+=self.speed
#右边界判断
bodysize = view_manager.monster_body[3].get_rect()
if self.x + bodysize.width >= view_manager.screen_width :
self.x = view_manager.screen_width - bodysize.width
self.move = pv.MOVE_LEFT
self.lastmove = self.move
# 向上
elif self.move == pv.MOVE_UP:
self.y-=self.speed
#右边界判断
if self.y <= 0:
self.y = 0
self.move = pv.MOVE_DOWN
self.lastmove = self.move
# 向下
elif self.move == pv.MOVE_DOWN:
self.y+=self.speed
#下边界判断
bodysize = view_manager.monster_body[1].get_rect()
if self.y + bodysize.height >= view_manager.screen_height :
self.y = view_manager.screen_height - bodysize.height
self.move = pv.MOVE_UP
self.lastmove = self.move
#当前主体范围
def getrect(self ,view_manager):
if self.lastmove == pv.MOVE_UP :
return view_manager.monster_body[0].get_rect()
if self.lastmove == pv.MOVE_DOWN:
return view_manager.monster_body[1].get_rect()
if self.lastmove == pv.MOVE_LEFT:
return view_manager.monster_body[2].get_rect()
if self.lastmove == pv.MOVE_RIGHT:
return view_manager.monster_body[3].get_rect()
return None
#绘制角色
def draw(self,view_manager,screen):
direct = self.move
# 绘制角色站立的位置
if direct == pv.MOVE_STAND:
#未进行任何操作的时候,保持最后一次控制的方向
direct = self.lastmove
if direct == pv.MOVE_UP:
screen.blit(view_manager.monster_body[0],(self.x,self.y))
if direct == pv.MOVE_DOWN:
screen.blit(view_manager.monster_body[1],(self.x,self.y))
if direct == pv.MOVE_LEFT:
screen.blit(view_manager.monster_body[2],(self.x,self.y))
if direct == pv.MOVE_RIGHT:
screen.blit(view_manager.monster_body[3],(self.x,self.y))
#绘制矩形角色血量条
pygame.draw.rect(screen,pv.COLOR_RED,Rect((self.x + 5 , self.y - 5),(self.hp , 5)))
#控制
def work(self,screen,view_manager):
#角色移动
self.move_position(view_manager,screen)
#绘制角色
self.draw(view_manager,screen)
#发射炮弹
self.fire(screen,view_manager)
#移除已经失效的炮弹
for b in self.bullets:
if b.is_effect == False:
self.bullets.remove(b)
#绘制角色发射的炮弹
for b in self.bullets:
b.move_position(view_manager,screen)
b.draw(view_manager,screen)
#炮口的坐标
def guncenter(self,view_manager):
if self.lastmove == pv.MOVE_UP :
bodyrect = view_manager.monster_body[0].get_rect()
self.guncenterx = self.x + bodyrect.width / 2 - 4
self.guncentery = self.y
return
if self.lastmove == pv.MOVE_DOWN:
bodyrect = view_manager.monster_body[1].get_rect()
self.guncenterx = self.x + bodyrect.width / 2 - 4
self.guncentery = self.y + bodyrect.height
return
if self.lastmove == pv.MOVE_LEFT:
bodyrect = view_manager.monster_body[2].get_rect()
self.guncenterx = self.x
self.guncentery = self.y + bodyrect.height / 2 - 4
return
if self.lastmove == pv.MOVE_RIGHT:
bodyrect = view_manager.monster_body[3].get_rect()
self.guncenterx = self.x + bodyrect.width
self.guncentery = self.y + bodyrect.height / 2 - 4
return
#发射炮弹
def fire(self,screen,view_manager):
#每间隔1秒发射一次
firepass = (datetime.datetime.now() - self.firetime).seconds
if firepass < self.firedelay :
return
self.firetime = datetime.datetime.now()
#更新炮口坐标
self.guncenter(view_manager)
#创建炮弹 #根据当前的面向设置炮弹从炮口中央发射
newbullet = Bullet(view_manager,screen,self.guncenterx,self.guncentery,self.lastmove)
#记录炮弹
self.bullets.append(newbullet)
#播放音乐:发射
view_manager.sounds[0].play()
python坦克大战(5)战斗处理与炮弹