正式实现碰撞

1.实现了四种碰撞(代码注释里有)
2.加入了声音(当然只有这些声音肯定不够,还需要再搜集一些)
3.因为要在Manager类中main方法使用子弹,所以给坦克类创了两个类变量
remain方法清除所有坦克和子弹,重新开始游戏
(清除坦克和子弹用的是类方法)

注意:同一队之间不会有各种碰撞效果。比如:敌方坦克间不会碰撞,敌方坦克子弹间不会碰撞,敌方一辆坦克的子弹不能打另一辆坦克

`
import pygame
import sys
import time
import random

BACK = (250,250,250)
SCREEN_X = 1400
SCREEN_Y = 750

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()
    if team == 0:
        self.speed = 5
        self.rect.topleft = [300, 600]
    else:
        self.ran = [0, 4]
        self.speed = random.randint(1, 5)
        self.rect.topleft = [random.random()*SCREEN_X, random.random()*SCREEN_Y]

def control(self):
    # 按键控制
    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]:
        b = Bullet(self.direction,self.rect)
        self.all_bullet.add(b)
        Tank.my_all_bullet.add(b)

def ai(self):
    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.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 = 7

def move(self):
    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 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:/图片/walk.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)

class Manager:
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.sound = Sound()

def player(self):
    #生成1辆我方坦克
    p = Tank(self.screen)
    self.players.add(p)

def enemy(self,x):
    #生成x辆敌方坦克
    e = [Tank(self.screen, 1) for _ in range(x)]
    self.enemys.add(e)

def remain(self):
    self.sound.horry()
    Tank.clear()
    mm = Manager()
    mm.main()

def main(self):
    pygame.init()
    self.sound.back()
    self.player()
    self.enemy(10)
    while True:
        self.screen.fill(BACK)
        for i in self.players:
            i.control()
            i.display()
        for j in self.enemys:
            j.ai()
            j.display()
        time.sleep(0.1)#防止坦克跑得太快
        pygame.display.update()
        for e in pygame.event.get():
            if e.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
        #我方坦克与敌方坦克的碰撞(碰撞后坦克会消失)
        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:
            self.sound.boost()
        #敌方子弹打玩家坦克
        e_hit_i = pygame.sprite.groupcollide(self.players, Tank.enemy_all_bullet, True, True)
        if e_hit_i:
            self.remain()
            self.sound.boost()
        #我方子弹碰到敌方子弹
        bullet_pump = pygame.sprite.groupcollide(Tank.my_all_bullet,Tank.enemy_all_bullet,True,True)
        if bullet_pump:
            self.sound.boost()

m = Manager()
m.main()

`