坦克大戰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)戰鬥處理與炮彈