1.实现了方块一组组的生成,在Manager类中实现逻辑,Hard类不变
这样的话地形更加美观,方块也不太会叠加
2.敌方坦克用计时器生成
两个计时器应该不能用同一个id,因为event。type要选择计时器的id
计时器应该不能在同一个函数里被调用
3.一段时间(一般为5秒)生成一个砖块和一个敌人
4.一段时间(一般为30秒)清除并展示新方块
以后应该需要Map类
`
class Tank(pygame.sprite.Sprite):
my_all_bullet = pygame.sprite.Group()
enemy_all_bullet = pygame.sprite.Group()
def __init__(self,screen,team=0):
pygame.sprite.Sprite.__init__(self)
self.screen = screen
self.all_bullet = pygame.sprite.Group()
if team == 0:
self.imgs = {
'w': pygame.image.load('E:/图片/heroW.png'),
's': pygame.image.load('E:/图片/heroS.png'),
'a': pygame.image.load('E:/图片/heroA.png'),
'd': pygame.image.load('E:/图片/heroD.png')
}
else:
self.imgs = {
'w': pygame.image.load('E:/图片/eW.png'),
's': pygame.image.load('E:/图片/eS.png'),
'a': pygame.image.load('E:/图片/eA.png'),
'd': pygame.image.load('E:/图片/eD.png')
}
self.team = team
self.direction = 'w'
self.img = self.imgs[self.direction]
# tank初始化位置
self.rect = self.img.get_rect()
self.ran = [0, 4]
if team == 0:
self.speed = 5
self.rect.topleft = [random.randrange(30,SCREEN_X,80),random.randrange(30,SCREEN_Y,20)]
else:
self.speed = random.randint(1, 5)
self.rect.topleft = [random.random()*SCREEN_X, random.random()*SCREEN_Y]
def __boundary(self):
# 地图是上下左右贯通的
# up
if self.rect.top <= 0-20:
self.rect.top = SCREEN_Y + 10
# down
if self.rect.top >= SCREEN_Y + 20:
self.rect.top = 0 - 20
# left
if self.rect.left <= 0-20:
self.rect.left = SCREEN_X + 10
# right
if self.rect.left >= SCREEN_X + 20:
self.rect.left = 0 - 20
def control(self):
self.__boundary()
# 按键控制(键盘连续监听)
key_pressed = pygame.key.get_pressed()
if key_pressed[pygame.K_w]:
self.direction = 'w'
self.rect.top -= self.speed
if key_pressed[pygame.K_s]:
self.direction = 's'
self.rect.top += self.speed
if key_pressed[pygame.K_a]:
self.direction = 'a'
self.rect.left -= self.speed
if key_pressed[pygame.K_d]:
self.direction = 'd'
self.rect.left += self.speed
if key_pressed[pygame.K_j]:
#控制子弹发射的频率
rrr = random.randint(1, 5)
if rrr == 3:
b = Bullet(self.direction, self.rect)
self.all_bullet.add(b)
Tank.my_all_bullet.add(b)
def ai(self):
self.__boundary()
self.ran[0] += 1
if self.ran[0] % 30 == 0:
bb = Bullet(self.direction, self.rect)
self.all_bullet.add(bb)
Tank.enemy_all_bullet.add(bb)
if self.ran[1] % 4 == 0:
self.direction = 'w'
self.rect.top -= self.speed
if self.ran[0] % 20 == 0:
self.ran[1] = random.randint(4,7)
elif self.ran[1] % 4 == 1:
self.direction = 's'
self.rect.top += self.speed
if self.ran[0] % 20 == 0:
self.ran[1] = random.randint(4,7)
elif self.ran[1] % 4 == 2:
self.direction = 'a'
self.rect.left -= self.speed
if self.ran[0] % 20 == 0:
self.ran[1] = random.randint(4,7)
elif self.ran[1] % 4 == 3:
self.direction = 'd'
self.rect.left += self.speed
if self.ran[0] % 20 == 0:
self.ran[1] = random.randint(4,7)
def display(self):
self.img = self.imgs[self.direction]
self.screen.blit(self.img, self.rect)
for i in self.all_bullet:
i.move()
self.all_bullet.draw(self.screen)
@classmethod
# 清空子弹
def clear(cls):
cls.my_all_bullet.empty()
cls.enemy_all_bullet.empty()
class Bullet(pygame.sprite.Sprite):
def init(self,dir,rect):
pygame.sprite.Sprite.init(self)
self.image = pygame.image.load('E:/图片/bullet.png')
self.direction = dir
self.r = rect
self.rect = self.image.get_rect()
if self.direction == 'w':
self.rect.left = rect.left + rect.width/2 - self.rect.width/2
self.rect.top = rect.top - self.rect.top
elif self.direction == 's':
self.rect.left = rect.left + rect.width / 2 - self.rect.width / 2
self.rect.top = rect.top + rect.height
elif self.direction == 'a':
self.rect.left = rect.left - rect.width / 2 - self.rect.width / 2
self.rect.top = rect.top + rect.width/2 - self.rect.width/2
elif self.direction == 'd':
self.rect.left = rect.left + rect.width
self.rect.top = rect.top + rect.width/2 - self.rect.width/2
self.speed = 10
self.distance = 200
def move(self):
# 子弹距离坦克的位置太远则会消失
if (abs(self.rect.top - self.r.top) > self.distance
or abs(self.rect.left - self.r.left) > self.distance):
self.kill()
if self.direction == 'w':
self.rect.top -= self.speed
elif self.direction == 's':
self.rect.top += self.speed
elif self.direction == 'a':
self.rect.left -= self.speed
elif self.direction == 'd':
self.rect.left += self.speed
class Hard(pygame.sprite.Sprite):
hard_wall = pygame.sprite.Group()
def __init__(self,screen):
pygame.sprite.Sprite.__init__(self)
self.img = pygame.image.load('E:/图片/0.png')
self.rect = self.img.get_rect()
self.rect.topleft = [random.random() * SCREEN_X,random.random() * SCREEN_Y]
self.screen = screen
def show(self):
self.screen.blit(self.img, self.rect)
@classmethod
def clear(cls):
cls.hard_wall.empty()
class Map:
pass
class Sound:
def init(self):
pygame.mixer.init()
pygame.mixer.music.load("E:/图片/back.mp3")
pygame.mixer.music.set_volume(0.3)
# 音量大小
self.__bomb = pygame.mixer.Sound("E:/图片/gunfire.mp3")
self.__horry = pygame.mixer.Sound("E:/图片/oo.mp3")
self.__hit = pygame.mixer.Sound("E:/图片/hit.mp3")
def back(self):
pygame.mixer.music.play(-1)
# 背景音乐,-1为循环播放
def boost(self):
pygame.mixer.Sound.play(self.__bomb)
def horry(self):
pygame.mixer.Sound.play(self.__horry)
def hit(self):
pygame.mixer.Sound.play(self.__hit)
class Manager:
#计时器的id(id是什么数字不重要)
id = 0
id2 = 0
def __init__(self):
self.screen = pygame.display.set_mode((SCREEN_X,SCREEN_Y))
self.title = pygame.display.set_caption('坦克大战')
self.players = pygame.sprite.Group()
self.enemys = pygame.sprite.Group()
self.maps = pygame.sprite.Group()
self.sound = Sound()
def player(self):
#生成1辆我方坦克
p = Tank(self.screen)
self.players.add(p)
def enemy(self,x=1):
#生成x辆敌方坦克
e = [Tank(self.screen, 1) for _ in range(x)]
self.enemys.add(e)
def map(self,a=1):
mm = [Hard(self.screen) for _ in range(a)]
self.maps.add(mm)
Hard.hard_wall.add(mm)
def map1(self,a=2):
mm = [Hard(self.screen) for _ in range(a)]
for i in range(a):
#能生成一组方块
if i % 2 != 0:
mm[i].rect.top = mm[i-1].rect.top + 55
mm[i].rect.left = mm[i-1].rect.left
self.maps.add(mm)
Hard.hard_wall.add(mm)
def map2(self,b=3):
mm = [Hard(self.screen) for _ in range(b)]
for i in range(b):
# 能生成一组方块(这个逻辑不够好)
if i % 3 == 0:
mm[i].rect.top = mm[i - 1].rect.top + 55
mm[i].rect.left = mm[i - 1].rect.left
mm[i+1].rect.top = mm[i].rect.top
mm[i+1].rect.left = mm[i].rect.left+55
self.maps.add(mm)
Hard.hard_wall.add(mm)
def remain(self):
self.sound.horry()
print('!!')
Tank.clear()
Hard.clear()
mm = Manager()
mm.main()
def re(self,x):
pygame.time.set_timer(Manager.id2, 100000)
self.map(x)
def main(self):
pygame.init()
self.sound.back()
self.player()
self.map2(12)
pygame.time.set_timer(Manager.id,5500)
while True:
self.screen.fill(BACK)
for i in self.players:
i.control()
i.display()
for j in self.enemys:
j.ai()
j.display()
for k in self.maps:
k.show()
time.sleep(0.1)#防止坦克跑得太快
pygame.display.update()
for e in pygame.event.get():
if e.type == pygame.QUIT:
pygame.quit()
sys.exit()
elif e.type == Manager.id:
self.enemy()
self.map()
elif e.type == Manager.id2:
self.re(5)
#我方坦克与敌方坦克的碰撞(碰撞后坦克会消失)
tanks_pump = pygame.sprite.groupcollide(self.players, self.enemys, True, True)
if tanks_pump:
self.remain()
self.sound.boost()
#玩家子弹打敌方坦克
i_hit_e = pygame.sprite.groupcollide(Tank.my_all_bullet, self.enemys, True, True)
if i_hit_e:
print(1)
self.sound.boost()
#敌方子弹打玩家坦克
e_hit_i = pygame.sprite.groupcollide(self.players, Tank.enemy_all_bullet, True, True)
if e_hit_i:
print(2)
self.remain()
self.sound.boost()
#我方子弹碰到敌方子弹
bullet_pump = pygame.sprite.groupcollide(Tank.my_all_bullet,Tank.enemy_all_bullet,True,True)
if bullet_pump:
print(3)
self.sound.hit()
#我方坦克撞墙
i_hit_wall = pygame.sprite.groupcollide(Hard.hard_wall,self.players,False,True)
if i_hit_wall:
print(4)
self.remain()
self.sound.boost()
#敌方坦克撞墙
e_hit_wall = pygame.sprite.groupcollide(Hard.hard_wall, self.enemys, False, True)
if e_hit_wall:
print(5)
self.sound.boost()
#我方子弹撞墙
i_bullet_wall = pygame.sprite.groupcollide(Hard.hard_wall, Tank.my_all_bullet, False, True)
if i_bullet_wall:
print(6)
self.sound.hit()
#敌方子弹撞墙
e_bullet_wall = pygame.sprite.groupcollide(Hard.hard_wall,
Tank.enemy_all_bullet, False, True)
if e_bullet_wall:
print(7)
self.sound.hit()
`