Esempio n. 1
0
def main():
    #初始化
    pygame.init()
    screen = pygame.display.set_mode((630,630))
    pygame.display.set_caption("坦克大战")
    #加载图片
    bg_img = pygame.image.load('./images/others/background.png')
    #时钟 用来避免循环过快
    clock = pygame.time.Clock()
    #游戏玩家数量
    num_player = 2
    #关卡
    stage = 1
    num_stage = 2
    #定义是否GG
    is_gameover = False
    #用来控制tank什么时候变换状态
    switch_time = 0
    need_switch_tank = False
    player1_moving = False
    player2_moving = False
    #坦克的射击间隔
    could_shoot = True
    shoot_space = 0
    #主循环
    while not is_gameover:
        #stage += 2
        
        #home
        myhome = home.Home()
        
        #map
        stage_map = scene.Map(stage)
        #创建精灵组
        tanksGroup = pygame.sprite.Group()
        mytanksGroup = pygame.sprite.Group()
        enemytanksGroup = pygame.sprite.Group()
        
        bulletsGroup = pygame.sprite.Group()
        mybulletsGroup = pygame.sprite.Group()
        enemybulletsGroup = pygame.sprite.Group()
        
        #创建player1实例并加入精灵组
        tank_player1 = tanks.myTank(1)
        tanksGroup.add(tank_player1)
        mytanksGroup.add(tank_player1)
        
        tank_player2 = tanks.myTank(2)
        tanksGroup.add(tank_player2)
        mytanksGroup.add(tank_player2)
        while True:
            if is_gameover :
                break
            #如果关卡结束 则is_gameover = False  break
            
            #当点击叉叉时关闭该游戏
            for event in pygame.event.get():
                if event.type == QUIT:
                    exit()
            #背景
            screen.blit(bg_img,(0,0))
            #home
            screen.blit(myhome.home,myhome.rect)
            #石头墙 
            for each in stage_map.brickGroup:
                screen.blit(each.brick,each.rect)
            #钢墙
            for each in stage_map.ironGroup:
                screen.blit(each.iron,each.rect)
            #冰
            for each in stage_map.iceGroup:
                screen.blit(each.ice,each.rect)
            #河流
            for each in stage_map.riverGroup:
                screen.blit(each.river,each.rect)
            #树
            for each in stage_map.treeGroup:
                screen.blit(each.tree,each.rect)
            #设置每刷新n次tank的状态就变一次
            switch_time += 1
            if switch_time == 5:
                switch_time = 0
                need_switch_tank = not need_switch_tank
            #刷新射击间隔
            shoot_space += 1
            if shoot_space == 15:
                could_shoot = True
                shoot_space = 0
            #获得玩家的键盘输入值
            key_pressed = pygame.key.get_pressed()
            #player1 
            #WSAD -> 上下左右
            #空格键射击
            if key_pressed[pygame.K_w]:
                tanksGroup.remove(tank_player1)
                tank_player1.move_up(tanksGroup,stage_map.brickGroup,stage_map.ironGroup,myhome)
                tanksGroup.add(tank_player1)
                player1_moving = True  #在这里每次都把moving改成True 在blit之后又改为False 可以实现moving的值交替循环 使得每次刷新都blit不一样的贴图 以达成动画效果 
            elif key_pressed[pygame.K_s]:
                tanksGroup.remove(tank_player1)
                tank_player1.move_down(tanksGroup,stage_map.brickGroup,stage_map.ironGroup,myhome)
                tanksGroup.add(tank_player1)
                player1_moving = True
            elif key_pressed[pygame.K_a]:
                tanksGroup.remove(tank_player1)
                tank_player1.move_left(tanksGroup,stage_map.brickGroup,stage_map.ironGroup,myhome)
                tanksGroup.add(tank_player1)
                player1_moving = True
            elif key_pressed[pygame.K_d]:
                tanksGroup.remove(tank_player1)
                tank_player1.move_right(tanksGroup,stage_map.brickGroup,stage_map.ironGroup,myhome)
                tanksGroup.add(tank_player1)
                player1_moving = True
            if key_pressed[pygame.K_SPACE]:
                if could_shoot:
                    tank_player1.shoot(mybulletsGroup)
                    could_shoot = False
            #player2
            #上下左右键控制
            #小键盘'0'键射击
            if key_pressed[pygame.K_UP]:
                tanksGroup.remove(tank_player2)
                tank_player2.move_up(tanksGroup,stage_map.brickGroup,stage_map.ironGroup,myhome)
                tanksGroup.add(tank_player2)
                player2_moving = True  #在这里每次都把moving改成True 在blit之后又改为False 可以实现moving的值交替循环 使得每次刷新都blit不一样的贴图 以达成动画效果 
            elif key_pressed[pygame.K_DOWN]:
                tanksGroup.remove(tank_player2)
                tank_player2.move_down(tanksGroup,stage_map.brickGroup,stage_map.ironGroup,myhome)
                tanksGroup.add(tank_player2)
                player2_moving = True
            elif key_pressed[pygame.K_LEFT]:
                tanksGroup.remove(tank_player2)
                tank_player2.move_left(tanksGroup,stage_map.brickGroup,stage_map.ironGroup,myhome)
                tanksGroup.add(tank_player2)
                player2_moving = True
            elif key_pressed[pygame.K_RIGHT]:
                tanksGroup.remove(tank_player2)
                tank_player2.move_right(tanksGroup,stage_map.brickGroup,stage_map.ironGroup,myhome)
                tanksGroup.add(tank_player2)
                player2_moving = True
            if key_pressed[pygame.K_KP0]:
                if could_shoot:
                    tank_player2.shoot(mybulletsGroup)
                    could_shoot = False
            # blit我方坦克
            if need_switch_tank and player1_moving:
                screen.blit(tank_player1.tank_0, (tank_player1.rect.left, tank_player1.rect.top))
                player1_moving = False
            else:
                screen.blit(tank_player1.tank_1, (tank_player1.rect.left, tank_player1.rect.top))
                
            if num_player > 1:
                if need_switch_tank and player2_moving:
                    screen.blit(tank_player2.tank_0, (tank_player2.rect.left, tank_player2.rect.top))
                    player2_moving = False
                else:
                    screen.blit(tank_player2.tank_1, (tank_player2.rect.left, tank_player2.rect.top))
            
            #我方子弹
            for each_bullet in mybulletsGroup:
                if each_bullet.being == True:
                    each_bullet.move()
                    screen.blit(each_bullet.bullet,each_bullet.rect)
                    #碰撞土墙brick
                    if pygame.sprite.spritecollide(each_bullet, stage_map.brickGroup, True, None):
                        each_bullet.being = False
                else :
                    mybulletsGroup.remove(each_bullet)
            #循环的最后一个操作:刷新屏幕
            pygame.display.flip()
            clock.tick(60)
Esempio n. 2
0
def main():
    pygame.init()
    pygame.display.set_caption("Tank War    -yangbin")
    pygame.mixer.init()
    screen = pygame.display.set_mode((630, 630))
    is_gameover = False
    clock = pygame.time.Clock()
    font = pygame.font.Font('font/simkai.ttf', 80)
    grade = [0, 0]
    is_move = False
    p1_is_move = False
    p2_is_move = False

    # 加载音效
    start_sound = pygame.mixer.Sound("./audios/start.wav")
    start_sound.set_volume(0.5)
    fire_sound = pygame.mixer.Sound("./audios/fire.wav")
    Gunfire_sound = pygame.mixer.Sound("./audios/Gunfire.wav")
    add_sound = pygame.mixer.Sound("./audios/add.wav")
    bang_sound = pygame.mixer.Sound("./audios/bang.wav")

    while not is_gameover:
        tanksGroup = pygame.sprite.Group()
        bulletGroup = pygame.sprite.Group()
        tank_player1 = tanks.myTank(1)
        tank_player2 = tanks.myTank(2)
        tanksGroup.add(tank_player1)
        tanksGroup.add(tank_player2)
        add_sound.play()
        # 轮胎动画效果
        time = 0
        is_switch_tank = False
        while True:
            screen.fill(1)

            # 绘制比分
            gradeText = font.render(
                str(grade[0]) + " : " + str(grade[1]), True, (0, 0xff, 0xf0))
            gradeRect = gradeText.get_rect()
            screenRect = screen.get_rect()
            gradeRect.center = screenRect.center
            screen.blit(gradeText, (gradeRect.left, 40))

            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    sys.exit()

            time += 1
            if time == 5:
                time = 0
                is_switch_tank = not is_switch_tank
            # 检查用户键盘操作
            key_pressed = pygame.key.get_pressed()

            # AI 操控玩家一
            # tanksGroup.remove(tank_player1)
            # tank_player1.AI(tank_player2.bullet,tank_player2,tanksGroup,Gunfire_sound)
            # tanksGroup.add(tank_player1)

            # 玩家一
            # WSAD -> 上下左右
            # 空格键射击
            if key_pressed[pygame.K_w]:
                tanksGroup.remove(tank_player1)
                p1_is_move = tank_player1.move_up(tanksGroup)
                tanksGroup.add(tank_player1)
            elif key_pressed[pygame.K_s]:
                tanksGroup.remove(tank_player1)
                p1_is_move = tank_player1.move_down(tanksGroup)
                tanksGroup.add(tank_player1)
            elif key_pressed[pygame.K_a]:
                tanksGroup.remove(tank_player1)
                p1_is_move = tank_player1.move_left(tanksGroup)
                tanksGroup.add(tank_player1)
            elif key_pressed[pygame.K_d]:
                tanksGroup.remove(tank_player1)
                p1_is_move = tank_player1.move_right(tanksGroup)
                tanksGroup.add(tank_player1)
            elif key_pressed[pygame.K_SPACE]:
                if not tank_player1.bullet.being:
                    tank_player1.shoot()
                    fire_sound.play()

            # AI 操控
            tanksGroup.remove(tank_player2)
            tank_player2.AI(tank_player1.bullet, tank_player1, tanksGroup,
                            Gunfire_sound)
            tanksGroup.add(tank_player2)

            # # 玩家二 操控
            # # ↑↓←→ -> 上下左右
            # # 小键盘0键射击
            # if key_pressed[pygame.K_UP]:
            #     tanksGroup.remove(tank_player2)
            #     p2_is_move = tank_player2.move_up(tanksGroup)
            #     tanksGroup.add(tank_player2)
            # elif key_pressed[pygame.K_DOWN]:
            #     tanksGroup.remove(tank_player2)
            #     p2_is_move = tank_player2.move_down(tanksGroup)
            #     tanksGroup.add(tank_player2)
            # elif key_pressed[pygame.K_LEFT]:
            #     tanksGroup.remove(tank_player2)
            #     p2_is_move = tank_player2.move_left(tanksGroup)
            #     tanksGroup.add(tank_player2)
            # elif key_pressed[pygame.K_RIGHT]:
            #     tanksGroup.remove(tank_player2)
            #     p2_is_move = tank_player2.move_right(tanksGroup)
            #     tanksGroup.add(tank_player2)
            # elif key_pressed[pygame.K_RSHIFT]:
            #     if not tank_player2.bullet.being:
            #         tank_player2.shoot()

            if is_switch_tank and p1_is_move:
                screen.blit(tank_player1.tank_1,
                            (tank_player1.rect.left, tank_player1.rect.top))
                p1_is_move = False
            else:
                screen.blit(tank_player1.tank_0,
                            (tank_player1.rect.left, tank_player1.rect.top))

            if is_switch_tank and p2_is_move:
                screen.blit(tank_player2.tank_1,
                            (tank_player2.rect.left, tank_player2.rect.top))
                p2_is_move = False
            else:
                screen.blit(tank_player2.tank_0,
                            (tank_player2.rect.left, tank_player2.rect.top))

            # 子弹
            for tank in tanksGroup:
                if tank.bullet.being:
                    tank.bullet.move()
                    screen.blit(tank.bullet.bullet, tank.bullet.rect)

            #判断子弹和子弹是否碰撞(子弹都存在的情况下才会碰撞)
            if tank_player1.bullet.being == True and tank_player2.bullet.being == True and pygame.sprite.collide_rect(
                    tank_player1.bullet, tank_player2.bullet):
                tank_player1.bullet.being = False
                tank_player2.bullet.being = False

            #判断子弹和坦克是否相撞
            if tank_player1.bullet.being and pygame.sprite.collide_rect(
                    tank_player1.bullet, tank_player2):
                tank_player1.bullet.being = False
                grade[0] += 1
                bang_sound.play()
                break
            if tank_player2.bullet.being and pygame.sprite.collide_rect(
                    tank_player2.bullet, tank_player1):
                tank_player2.bullet.being = False
                grade[1] += 1
                bang_sound.play()
                break

            pygame.display.flip()
            clock.tick(60)
        print("game over")
Esempio n. 3
0
def main():
    # 初始化
    pygame.init()
    pygame.mixer.init()
    screen = pygame.display.set_mode((630, 630))
    pygame.display.set_caption("坦克大战-出品人:钟洪")
    # 加载图片
    bg_img = pygame.image.load("./images/others/background.png")
    # 加载音效
    add_sound = pygame.mixer.Sound("./audios/add.wav")
    add_sound.set_volume(1)
    bang_sound = pygame.mixer.Sound("./audios/bang.wav")
    bang_sound.set_volume(1)
    blast_sound = pygame.mixer.Sound("./audios/blast.wav")
    blast_sound.set_volume(1)
    fire_sound = pygame.mixer.Sound("./audios/fire.wav")
    fire_sound.set_volume(1)
    Gunfire_sound = pygame.mixer.Sound("./audios/Gunfire.wav")
    Gunfire_sound.set_volume(1)
    hit_sound = pygame.mixer.Sound("./audios/hit.wav")
    hit_sound.set_volume(1)
    start_sound = pygame.mixer.Sound("./audios/start.wav")
    start_sound.set_volume(1)
    # 开始界面
    num_player = show_start_interface(screen, 630, 630)
    # 播放游戏开始的音乐
    start_sound.play()
    # 关卡
    stage = 0
    num_stage = 2
    # 游戏是否结束
    is_gameover = False
    # 时钟
    clock = pygame.time.Clock()
    # 主循环
    while not is_gameover:
        # 关卡
        stage += 1
        if stage > num_stage:
            break
        show_switch_stage(screen, 630, 630, stage)
        # 该关卡坦克总数量
        enemytanks_total = min(stage * 18, 5)
        # 场上存在的敌方坦克总数量
        enemytanks_now = 0
        # 场上可以存在的敌方坦克总数量
        enemytanks_now_max = min(max(stage * 2, 4), 2)
        # 精灵组
        tanksGroup = pygame.sprite.Group()
        mytanksGroup = pygame.sprite.Group()
        enemytanksGroup = pygame.sprite.Group()
        bulletsGroup = pygame.sprite.Group()
        mybulletsGroup = pygame.sprite.Group()
        enemybulletsGroup = pygame.sprite.Group()
        myfoodsGroup = pygame.sprite.Group()
        # 自定义事件
        # 	-生成敌方坦克事件
        genEnemyEvent = pygame.constants.USEREVENT
        pygame.time.set_timer(genEnemyEvent, 100)
        # 	-敌方坦克静止恢复事件
        recoverEnemyEvent = pygame.constants.USEREVENT
        pygame.time.set_timer(recoverEnemyEvent, 8000)
        # 	-我方坦克无敌恢复事件
        noprotectMytankEvent = pygame.constants.USEREVENT
        pygame.time.set_timer(noprotectMytankEvent, 8000)
        # 关卡地图
        map_stage = scene.Map(stage)
        # 我方坦克
        tank_player1 = tanks.myTank(1)
        tanksGroup.add(tank_player1)
        mytanksGroup.add(tank_player1)
        if num_player > 1:
            tank_player2 = tanks.myTank(2)
            tanksGroup.add(tank_player2)
            mytanksGroup.add(tank_player2)
        is_switch_tank = True
        player1_moving = False
        player2_moving = False
        # 为了轮胎的动画效果
        time = 0
        # 敌方坦克
        for i in range(0, 3):
            if enemytanks_total > 0:
                enemytank = tanks.enemyTank(i)
                tanksGroup.add(enemytank)
                enemytanksGroup.add(enemytank)
                enemytanks_now += 1
                enemytanks_total -= 1
        # 大本营
        myhome = home.Home()
        # 出场特效
        appearance_img = pygame.image.load(
            "./images/others/appear.png").convert_alpha()
        appearances = []
        appearances.append(appearance_img.subsurface((0, 0), (48, 48)))
        appearances.append(appearance_img.subsurface((48, 0), (48, 48)))
        appearances.append(appearance_img.subsurface((96, 0), (48, 48)))
        # 关卡主循环
        while True:
            if is_gameover is True:
                break
            if enemytanks_total < 1 and enemytanks_now < 1:
                is_gameover = False
                break
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
                    sys.exit()
                if event.type == genEnemyEvent:
                    if enemytanks_total > 0:
                        if enemytanks_now < enemytanks_now_max:
                            enemytank = tanks.enemyTank()
                            if not pygame.sprite.spritecollide(
                                    enemytank, tanksGroup, False, None):
                                tanksGroup.add(enemytank)
                                enemytanksGroup.add(enemytank)
                                enemytanks_now += 1
                                enemytanks_total -= 1
                if event.type == recoverEnemyEvent:
                    for each in enemytanksGroup:
                        each.can_move = True
                if event.type == noprotectMytankEvent:
                    for each in mytanksGroup:
                        mytanksGroup.protected = False
            # 检查用户键盘操作
            key_pressed = pygame.key.get_pressed()
            # 玩家一
            # WSAD -> 上下左右
            # 空格键射击
            if key_pressed[pygame.K_w]:
                tanksGroup.remove(tank_player1)
                tank_player1.move_up(tanksGroup, map_stage.brickGroup,
                                     map_stage.ironGroup, myhome)
                tanksGroup.add(tank_player1)
                player1_moving = True
            elif key_pressed[pygame.K_s]:
                tanksGroup.remove(tank_player1)
                tank_player1.move_down(tanksGroup, map_stage.brickGroup,
                                       map_stage.ironGroup, myhome)
                tanksGroup.add(tank_player1)
                player1_moving = True
            elif key_pressed[pygame.K_a]:
                tanksGroup.remove(tank_player1)
                tank_player1.move_left(tanksGroup, map_stage.brickGroup,
                                       map_stage.ironGroup, myhome)
                tanksGroup.add(tank_player1)
                player1_moving = True
            elif key_pressed[pygame.K_d]:
                tanksGroup.remove(tank_player1)
                tank_player1.move_right(tanksGroup, map_stage.brickGroup,
                                        map_stage.ironGroup, myhome)
                tanksGroup.add(tank_player1)
                player1_moving = True
            elif key_pressed[pygame.K_SPACE]:
                if not tank_player1.bullet.being:
                    fire_sound.play()
                    tank_player1.shoot()
            # 玩家二
            # ↑↓←→ -> 上下左右
            # 小键盘0键射击
            if num_player > 1:
                if key_pressed[pygame.K_UP]:
                    tanksGroup.remove(tank_player2)
                    tank_player2.move_up(tanksGroup, map_stage.brickGroup,
                                         map_stage.ironGroup, myhome)
                    tanksGroup.add(tank_player2)
                    player2_moving = True
                elif key_pressed[pygame.K_DOWN]:
                    tanksGroup.remove(tank_player2)
                    tank_player2.move_down(tanksGroup, map_stage.brickGroup,
                                           map_stage.ironGroup, myhome)
                    tanksGroup.add(tank_player2)
                    player2_moving = True
                elif key_pressed[pygame.K_LEFT]:
                    tanksGroup.remove(tank_player2)
                    tank_player2.move_left(tanksGroup, map_stage.brickGroup,
                                           map_stage.ironGroup, myhome)
                    tanksGroup.add(tank_player2)
                    player2_moving = True
                elif key_pressed[pygame.K_RIGHT]:
                    tanksGroup.remove(tank_player2)
                    tank_player2.move_right(tanksGroup, map_stage.brickGroup,
                                            map_stage.ironGroup, myhome)
                    tanksGroup.add(tank_player2)
                    player2_moving = True
                elif key_pressed[pygame.K_KP0]:
                    if not tank_player2.bullet.being:
                        fire_sound.play()
                        tank_player2.shoot()
            # 背景
            screen.blit(bg_img, (0, 0))
            # 石头墙
            for each in map_stage.brickGroup:
                screen.blit(each.brick, each.rect)
            # 钢墙
            for each in map_stage.ironGroup:
                screen.blit(each.iron, each.rect)
            # 冰
            for each in map_stage.iceGroup:
                screen.blit(each.ice, each.rect)
            # 河流
            for each in map_stage.riverGroup:
                screen.blit(each.river, each.rect)
            # 树
            for each in map_stage.treeGroup:
                screen.blit(each.tree, each.rect)
            time += 1
            if time == 5:
                time = 0
                is_switch_tank = not is_switch_tank
            # 我方坦克
            if tank_player1 in mytanksGroup:
                if is_switch_tank and player1_moving:
                    screen.blit(
                        tank_player1.tank_0,
                        (tank_player1.rect.left, tank_player1.rect.top))
                    player1_moving = False
                else:
                    screen.blit(
                        tank_player1.tank_1,
                        (tank_player1.rect.left, tank_player1.rect.top))
                if tank_player1.protected:
                    screen.blit(
                        tank_player1.protected_mask1,
                        (tank_player1.rect.left, tank_player1.rect.top))
            if num_player > 1:
                if tank_player2 in mytanksGroup:
                    if is_switch_tank and player2_moving:
                        screen.blit(
                            tank_player2.tank_0,
                            (tank_player2.rect.left, tank_player2.rect.top))
                        player1_moving = False
                    else:
                        screen.blit(
                            tank_player2.tank_1,
                            (tank_player2.rect.left, tank_player2.rect.top))
                    if tank_player2.protected:
                        screen.blit(
                            tank_player1.protected_mask1,
                            (tank_player2.rect.left, tank_player2.rect.top))
            # 敌方坦克
            for each in enemytanksGroup:
                # 出生特效
                if each.born:
                    if each.times > 0:
                        each.times -= 1
                        if each.times <= 10:
                            screen.blit(appearances[2],
                                        (3 + each.x * 12 * 24, 3))
                        elif each.times <= 20:
                            screen.blit(appearances[1],
                                        (3 + each.x * 12 * 24, 3))
                        elif each.times <= 30:
                            screen.blit(appearances[0],
                                        (3 + each.x * 12 * 24, 3))
                        elif each.times <= 40:
                            screen.blit(appearances[2],
                                        (3 + each.x * 12 * 24, 3))
                        elif each.times <= 50:
                            screen.blit(appearances[1],
                                        (3 + each.x * 12 * 24, 3))
                        elif each.times <= 60:
                            screen.blit(appearances[0],
                                        (3 + each.x * 12 * 24, 3))
                        elif each.times <= 70:
                            screen.blit(appearances[2],
                                        (3 + each.x * 12 * 24, 3))
                        elif each.times <= 80:
                            screen.blit(appearances[1],
                                        (3 + each.x * 12 * 24, 3))
                        elif each.times <= 90:
                            screen.blit(appearances[0],
                                        (3 + each.x * 12 * 24, 3))
                    else:
                        each.born = False
                else:
                    if is_switch_tank:
                        screen.blit(each.tank_0,
                                    (each.rect.left, each.rect.top))
                    else:
                        screen.blit(each.tank_1,
                                    (each.rect.left, each.rect.top))
                    if each.can_move:
                        tanksGroup.remove(each)
                        each.move(tanksGroup, map_stage.brickGroup,
                                  map_stage.ironGroup, myhome)
                        tanksGroup.add(each)
            # 我方子弹
            for tank_player in mytanksGroup:
                if tank_player.bullet.being:
                    tank_player.bullet.move()
                    screen.blit(tank_player.bullet.bullet,
                                tank_player.bullet.rect)
                    # 子弹碰撞敌方子弹
                    for each in enemybulletsGroup:
                        if each.being:
                            if pygame.sprite.collide_rect(
                                    tank_player.bullet, each):
                                tank_player.bullet.being = False
                                each.being = False
                                enemybulletsGroup.remove(each)
                                break
                        else:
                            enemybulletsGroup.remove(each)
                    # 子弹碰撞敌方坦克
                    for each in enemytanksGroup:
                        if each.being:
                            if pygame.sprite.collide_rect(
                                    tank_player.bullet, each):
                                if each.is_red == True:
                                    myfood = food.Food()
                                    myfood.generate()
                                    myfoodsGroup.add(myfood)
                                    each.is_red = False
                                each.blood -= 1
                                each.color -= 1
                                if each.blood < 0:
                                    bang_sound.play()
                                    each.being = False
                                    enemytanksGroup.remove(each)
                                    enemytanks_now -= 1
                                    tanksGroup.remove(each)
                                else:
                                    each.reload()
                                tank_player.bullet.being = False
                                break
                        else:
                            enemytanksGroup.remove(each)
                            tanksGroup.remove(each)
                    # 子弹碰撞石头墙
                    if pygame.sprite.spritecollide(tank_player.bullet,
                                                   map_stage.brickGroup, True,
                                                   None):
                        tank_player.bullet.being = False
                    '''
					# 等价方案(更科学点)
					for each in map_stage.brickGroup:
						if pygame.sprite.collide_rect(tank_player.bullet, each):
							tank_player.bullet.being = False
							each.being = False
							map_stage.brickGroup.remove(each)
							break
					'''
                    # 子弹碰钢墙
                    if tank_player.bullet.stronger:
                        if pygame.sprite.spritecollide(tank_player.bullet,
                                                       map_stage.ironGroup,
                                                       True, None):
                            tank_player.bullet.being = False
                    else:
                        if pygame.sprite.spritecollide(tank_player.bullet,
                                                       map_stage.ironGroup,
                                                       False, None):
                            tank_player.bullet.being = False
                    '''
					# 等价方案(更科学点)
					for each in map_stage.ironGroup:
						if pygame.sprite.collide_rect(tank_player.bullet, each):
							tank_player.bullet.being = False
							if tank_player.bullet.stronger:
								each.being = False
								map_stage.ironGroup.remove(each)
							break
					'''
                    # 子弹碰大本营
                    if pygame.sprite.collide_rect(tank_player.bullet, myhome):
                        tank_player.bullet.being = False
                        myhome.set_dead()
                        is_gameover = True
            # 敌方子弹
            for each in enemytanksGroup:
                if each.being:
                    if each.can_move and not each.bullet.being:
                        enemybulletsGroup.remove(each.bullet)
                        each.shoot()
                        enemybulletsGroup.add(each.bullet)
                    if not each.born:
                        if each.bullet.being:
                            each.bullet.move()
                            screen.blit(each.bullet.bullet, each.bullet.rect)
                            # 子弹碰撞我方坦克
                            for tank_player in mytanksGroup:
                                if pygame.sprite.collide_rect(
                                        each.bullet, tank_player):
                                    if not tank_player.protected:
                                        bang_sound.play()
                                        tank_player.life -= 1
                                        if tank_player.life < 0:
                                            mytanksGroup.remove(tank_player)
                                            tanksGroup.remove(tank_player)
                                            if len(mytanksGroup) < 1:
                                                is_gameover = True
                                        else:
                                            tank_player.reset()
                                    each.bullet.being = False
                                    enemybulletsGroup.remove(each.bullet)
                                    break
                            # 子弹碰撞石头墙
                            if pygame.sprite.spritecollide(
                                    each.bullet, map_stage.brickGroup, True,
                                    None):
                                each.bullet.being = False
                                enemybulletsGroup.remove(each.bullet)
                            '''
							# 等价方案(更科学点)
							for one in map_stage.brickGroup:
								if pygame.sprite.collide_rect(each.bullet, one):
									each.bullet.being = False
									one.being = False
									enemybulletsGroup.remove(one)
									break
							'''
                            # 子弹碰钢墙
                            if each.bullet.stronger:
                                if pygame.sprite.spritecollide(
                                        each.bullet, map_stage.ironGroup, True,
                                        None):
                                    each.bullet.being = False
                            else:
                                if pygame.sprite.spritecollide(
                                        each.bullet, map_stage.ironGroup,
                                        False, None):
                                    each.bullet.being = False
                            '''
							# 等价方案(更科学点)
							for one in map_stage.ironGroup:
								if pygame.sprite.collide_rect(each.bullet, one):
									each.bullet.being = False
									if each.bullet.stronger:
										one.being = False
										map_stage.ironGroup.remove(one)
									break
							'''
                            # 子弹碰大本营
                            if pygame.sprite.collide_rect(each.bullet, myhome):
                                each.bullet.being = False
                                myhome.set_dead()
                                is_gameover = True
                else:
                    enemytanksGroup.remove(each)
                    tanksGroup.remove(each)
            # 家
            screen.blit(myhome.home, myhome.rect)
            # 食物
            for myfood in myfoodsGroup:
                if myfood.being and myfood.time > 0:
                    screen.blit(myfood.food, myfood.rect)
                    myfood.time -= 1
                    for tank_player in mytanksGroup:
                        if pygame.sprite.collide_rect(tank_player, myfood):
                            # 消灭当前所有敌人
                            if myfood.kind == 0:
                                for _ in enemytanksGroup:
                                    bang_sound.play()
                                enemytanksGroup = pygame.sprite.Group()
                                enemytanks_total -= enemytanks_now
                                enemytanks_now = 0
                            # 敌人静止
                            if myfood.kind == 1:
                                for each in enemytanksGroup:
                                    each.can_move = False
                            # 子弹增强
                            if myfood.kind == 2:
                                add_sound.play()
                                tank_player.bullet.stronger = True
                            # 使得大本营的墙变为钢板
                            if myfood.kind == 3:
                                map_stage.protect_home()
                            # 坦克获得一段时间的保护罩
                            if myfood.kind == 4:
                                add_sound.play()
                                for tank_player in mytanksGroup:
                                    tank_player.protected = True
                            # 坦克升级
                            if myfood.kind == 5:
                                add_sound.play()
                                tank_player.up_level()
                            # 坦克生命+1
                            if myfood.kind == 6:
                                add_sound.play()
                                tank_player.life += 1
                            myfood.being = False
                            myfoodsGroup.remove(myfood)
                            break
                else:
                    myfood.being = False
                    myfoodsGroup.remove(myfood)
            pygame.display.flip()
            clock.tick(60)
    if not is_gameover:
        show_end_interface(screen, 630, 630, True)
    else:
        show_end_interface(screen, 630, 630, False)
Esempio n. 4
0
def main():
    # initialization
    pygame.init()
    pygame.mixer.init()
    screen = pygame.display.set_mode((630, 630))
    pygame.display.set_caption("Tank War []=")
    # Loading image
    bg_img = pygame.image.load("./images/others/background.png")
    heart_img = pygame.image.load("./images/heart.png")
    # Load sound
    add_sound = pygame.mixer.Sound("./audios/add.wav")
    add_sound.set_volume(1)
    bang_sound = pygame.mixer.Sound("./audios/bang.wav")
    bang_sound.set_volume(1)
    blast_sound = pygame.mixer.Sound("./audios/blast.wav")
    blast_sound.set_volume(1)
    fire_sound = pygame.mixer.Sound("./audios/fire.wav")
    fire_sound.set_volume(1)
    Gunfire_sound = pygame.mixer.Sound("./audios/Gunfire.wav")
    Gunfire_sound.set_volume(1)
    hit_sound = pygame.mixer.Sound("./audios/hit.wav")
    hit_sound.set_volume(1)
    start_sound = pygame.mixer.Sound("./audios/start.wav")
    start_sound.set_volume(1)
    # Start interface
    num_player = show_start_interface(screen, 630, 630)
    # Play the music at the beginning of the game
    start_sound.play()
    # Level
    stage = 0
    num_stage = 2
    dead = 0
    # Whether the game is over
    is_gameover = False
    # clock
    clock = pygame.time.Clock()
    # Main loop
    while not is_gameover:
        # Level
        stage += 1
        if stage > num_stage:
            break
        show_switch_stage(screen, 630, 630, stage)
        # The total number of checkpoint tanks
        enemytanks_total = min(stage * 18, 80)
        # The total number of enemy tanks present on the field
        enemytanks_now = 0
        # The total number of enemy tanks that can exist on the field
        enemytanks_now_max = min(max(stage * 2, 4), 8)
        # Elf group
        tanksGroup = pygame.sprite.Group()
        mytanksGroup = pygame.sprite.Group()
        enemytanksGroup = pygame.sprite.Group()
        bulletsGroup = pygame.sprite.Group()
        mybulletsGroup = pygame.sprite.Group()
        enemybulletsGroup = pygame.sprite.Group()
        myfoodsGroup = pygame.sprite.Group()
        # Custom event
        # 	- Generate enemy tank events
        genEnemyEvent = pygame.constants.USEREVENT + 0
        pygame.time.set_timer(genEnemyEvent, 100)
        # 	- enemy tank stationary recovery event
        recoverEnemyEvent = pygame.constants.USEREVENT + 1
        pygame.time.set_timer(recoverEnemyEvent, 8000)
        # 	- Our tank invincible recovery event
        noprotectMytankEvent = pygame.constants.USEREVENT + 2
        pygame.time.set_timer(noprotectMytankEvent, 8000)
        # Level map
        map_stage = scene.Map(stage)
        # Our tank
        tank_player1 = tanks.myTank(1)
        tanksGroup.add(tank_player1)
        mytanksGroup.add(tank_player1)
        if num_player > 1:
            tank_player2 = tanks.myTank(2)
            tanksGroup.add(tank_player2)
            mytanksGroup.add(tank_player2)
        is_switch_tank = True
        player1_moving = False
        player2_moving = False
        # For the animation of the tire
        time = 0
        # Enemy tank
        for i in range(0, 3):
            if enemytanks_total > 0:
                enemytank = tanks.enemyTank(i)
                tanksGroup.add(enemytank)
                enemytanksGroup.add(enemytank)
                enemytanks_now += 1
                enemytanks_total -= 1
        # Base camp
        myhome = home.Home()
        # Appearance effects
        appearance_img = pygame.image.load(
            "./images/others/appear.png").convert_alpha()
        appearances = []
        appearances.append(appearance_img.subsurface((0, 0), (48, 48)))
        appearances.append(appearance_img.subsurface((48, 0), (48, 48)))
        appearances.append(appearance_img.subsurface((96, 0), (48, 48)))
        # Level main loop
        while True:
            if is_gameover is True:
                break
            if enemytanks_total < 1 and enemytanks_now < 1:
                is_gameover = False
                break
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
                    sys.exit()
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_q:
                        quit()
                if event.type == genEnemyEvent:
                    if enemytanks_total > 0:
                        if enemytanks_now < enemytanks_now_max:
                            enemytank = tanks.enemyTank()
                            if not pygame.sprite.spritecollide(
                                    enemytank, tanksGroup, False, None):
                                tanksGroup.add(enemytank)
                                enemytanksGroup.add(enemytank)
                                enemytanks_now += 1
                                enemytanks_total -= 1
                if event.type == recoverEnemyEvent:
                    for each in enemytanksGroup:
                        each.can_move = True
                if event.type == noprotectMytankEvent:
                    for each in mytanksGroup:
                        mytanksGroup.protected = False
            # Check user keyboard operations
            key_pressed = pygame.key.get_pressed()
            # Player one
            # WASD -> up and down
            # Space bar shooting
            if key_pressed[pygame.K_w]:
                tanksGroup.remove(tank_player1)
                tank_player1.move_up(tanksGroup, map_stage.brickGroup,
                                     map_stage.ironGroup, myhome)
                tanksGroup.add(tank_player1)
                player1_moving = True
            elif key_pressed[pygame.K_s]:
                tanksGroup.remove(tank_player1)
                tank_player1.move_down(tanksGroup, map_stage.brickGroup,
                                       map_stage.ironGroup, myhome)
                tanksGroup.add(tank_player1)
                player1_moving = True
            elif key_pressed[pygame.K_a]:
                tanksGroup.remove(tank_player1)
                tank_player1.move_left(tanksGroup, map_stage.brickGroup,
                                       map_stage.ironGroup, myhome)
                tanksGroup.add(tank_player1)
                player1_moving = True
            elif key_pressed[pygame.K_d]:
                tanksGroup.remove(tank_player1)
                tank_player1.move_right(tanksGroup, map_stage.brickGroup,
                                        map_stage.ironGroup, myhome)
                tanksGroup.add(tank_player1)
                player1_moving = True
            elif key_pressed[pygame.K_SPACE]:
                if not tank_player1.bullet.being:
                    fire_sound.play()
                    tank_player1.shoot()
            # Player teo
            # ↑↓←→ -> Up, down, left and right
            # Keypad 0 key shot
            if num_player > 1:
                if key_pressed[pygame.K_UP]:
                    tanksGroup.remove(tank_player2)
                    tank_player2.move_up(tanksGroup, map_stage.brickGroup,
                                         map_stage.ironGroup, myhome)
                    tanksGroup.add(tank_player2)
                    player2_moving = True
                elif key_pressed[pygame.K_DOWN]:
                    tanksGroup.remove(tank_player2)
                    tank_player2.move_down(tanksGroup, map_stage.brickGroup,
                                           map_stage.ironGroup, myhome)
                    tanksGroup.add(tank_player2)
                    player2_moving = True
                elif key_pressed[pygame.K_LEFT]:
                    tanksGroup.remove(tank_player2)
                    tank_player2.move_left(tanksGroup, map_stage.brickGroup,
                                           map_stage.ironGroup, myhome)
                    tanksGroup.add(tank_player2)
                    player2_moving = True
                elif key_pressed[pygame.K_RIGHT]:
                    tanksGroup.remove(tank_player2)
                    tank_player2.move_right(tanksGroup, map_stage.brickGroup,
                                            map_stage.ironGroup, myhome)
                    tanksGroup.add(tank_player2)
                    player2_moving = True
                elif key_pressed[pygame.K_KP0]:
                    if not tank_player2.bullet.being:
                        fire_sound.play()
                        tank_player2.shoot()
            # background
            screen.blit(bg_img, (0, 0))
            # Stone wall
            for each in map_stage.brickGroup:
                screen.blit(each.brick, each.rect)
            # Steel wall
            for each in map_stage.ironGroup:
                screen.blit(each.iron, each.rect)
            time += 1
            if time == 5:
                time = 0
                is_switch_tank = not is_switch_tank
            # Our tank
            if tank_player1 in mytanksGroup:
                if is_switch_tank and player1_moving:
                    screen.blit(
                        tank_player1.tank_0,
                        (tank_player1.rect.left, tank_player1.rect.top))
                    player1_moving = False
                else:
                    screen.blit(
                        tank_player1.tank_1,
                        (tank_player1.rect.left, tank_player1.rect.top))
                if tank_player1.protected:
                    screen.blit(
                        tank_player1.protected_mask1,
                        (tank_player1.rect.left, tank_player1.rect.top))
            if num_player > 1:
                if tank_player2 in mytanksGroup:
                    if is_switch_tank and player2_moving:
                        screen.blit(
                            tank_player2.tank_0,
                            (tank_player2.rect.left, tank_player2.rect.top))
                        player1_moving = False
                    else:
                        screen.blit(
                            tank_player2.tank_1,
                            (tank_player2.rect.left, tank_player2.rect.top))
                    if tank_player2.protected:
                        screen.blit(
                            tank_player1.protected_mask1,
                            (tank_player2.rect.left, tank_player2.rect.top))
            # Enemy tank
            for each in enemytanksGroup:
                # Birth effect
                if each.born:
                    if each.times > 0:
                        each.times -= 1
                        if each.times <= 10:
                            screen.blit(appearances[2],
                                        (3 + each.x * 12 * 24, 3))
                        elif each.times <= 20:
                            screen.blit(appearances[1],
                                        (3 + each.x * 12 * 24, 3))
                        elif each.times <= 30:
                            screen.blit(appearances[0],
                                        (3 + each.x * 12 * 24, 3))
                        elif each.times <= 40:
                            screen.blit(appearances[2],
                                        (3 + each.x * 12 * 24, 3))
                        elif each.times <= 50:
                            screen.blit(appearances[1],
                                        (3 + each.x * 12 * 24, 3))
                        elif each.times <= 60:
                            screen.blit(appearances[0],
                                        (3 + each.x * 12 * 24, 3))
                        elif each.times <= 70:
                            screen.blit(appearances[2],
                                        (3 + each.x * 12 * 24, 3))
                        elif each.times <= 80:
                            screen.blit(appearances[1],
                                        (3 + each.x * 12 * 24, 3))
                        elif each.times <= 90:
                            screen.blit(appearances[0],
                                        (3 + each.x * 12 * 24, 3))
                    else:
                        each.born = False
                else:
                    if is_switch_tank:
                        screen.blit(each.tank_0,
                                    (each.rect.left, each.rect.top))
                    else:
                        screen.blit(each.tank_1,
                                    (each.rect.left, each.rect.top))
                    if each.can_move:
                        tanksGroup.remove(each)
                        each.move(tanksGroup, map_stage.brickGroup,
                                  map_stage.ironGroup, myhome)
                        tanksGroup.add(each)
            # Our bullets
            for tank_player in mytanksGroup:
                if tank_player.bullet.being:
                    tank_player.bullet.move()
                    screen.blit(tank_player.bullet.bullet,
                                tank_player.bullet.rect)
                    # Bullet colliding with enemy bullets
                    for each in enemybulletsGroup:
                        if each.being:
                            if pygame.sprite.collide_rect(
                                    tank_player.bullet, each):
                                tank_player.bullet.being = False
                                each.being = False
                                enemybulletsGroup.remove(each)
                                break
                        else:
                            enemybulletsGroup.remove(each)
                    # Bullet colliding with enemy tank
                    for each in enemytanksGroup:
                        if each.being:
                            if pygame.sprite.collide_rect(
                                    tank_player.bullet, each):
                                if each.is_red == True:
                                    myfood = food.Food()
                                    myfood.generate()
                                    myfoodsGroup.add(myfood)
                                    each.is_red = False
                                each.blood -= 1
                                each.color -= 1
                                if each.blood < 0:
                                    bang_sound.play()
                                    each.being = False
                                    enemytanksGroup.remove(each)
                                    enemytanks_now -= 1
                                    tanksGroup.remove(each)
                                else:
                                    each.reload()
                                tank_player.bullet.being = False
                                break
                        else:
                            enemytanksGroup.remove(each)
                            tanksGroup.remove(each)
                    # Bullet collision stone wall
                    if pygame.sprite.spritecollide(tank_player.bullet,
                                                   map_stage.brickGroup, True,
                                                   None):
                        tank_player.bullet.being = False
                    # Bullet hitting steel wall
                    if tank_player.bullet.stronger:
                        if pygame.sprite.spritecollide(tank_player.bullet,
                                                       map_stage.ironGroup,
                                                       True, None):
                            tank_player.bullet.being = False
                    else:
                        if pygame.sprite.spritecollide(tank_player.bullet,
                                                       map_stage.ironGroup,
                                                       False, None):
                            tank_player.bullet.being = False
                    # Bullet hits the base camp
                    if pygame.sprite.collide_rect(tank_player.bullet, myhome):
                        tank_player.bullet.being = False
                        myhome.set_dead()
                        is_gameover = True
            # Enemy bullet
            for each in enemytanksGroup:
                if each.being:
                    if each.can_move and not each.bullet.being:
                        enemybulletsGroup.remove(each.bullet)
                        each.shoot()
                        enemybulletsGroup.add(each.bullet)
                    if not each.born:
                        if each.bullet.being:
                            each.bullet.move()
                            screen.blit(each.bullet.bullet, each.bullet.rect)
                            # Bullet colliding with our tank
                            for tank_player in mytanksGroup:
                                if pygame.sprite.collide_rect(
                                        each.bullet, tank_player):
                                    if not tank_player.protected:
                                        bang_sound.play()
                                        tank_player.life -= 1
                                        dead += 1
                                        if tank_player.life < 0:
                                            mytanksGroup.remove(tank_player)
                                            tanksGroup.remove(tank_player)
                                            if len(mytanksGroup) < 1:
                                                is_gameover = True
                                        else:
                                            tank_player.reset()
                                    each.bullet.being = False
                                    enemybulletsGroup.remove(each.bullet)
                                    break
                            # Bullet collision stone wall
                            if pygame.sprite.spritecollide(
                                    each.bullet, map_stage.brickGroup, True,
                                    None):
                                each.bullet.being = False
                                enemybulletsGroup.remove(each.bullet)
                            # Bullet hitting steel wall
                            if each.bullet.stronger:
                                if pygame.sprite.spritecollide(
                                        each.bullet, map_stage.ironGroup, True,
                                        None):
                                    each.bullet.being = False
                            else:
                                if pygame.sprite.spritecollide(
                                        each.bullet, map_stage.ironGroup,
                                        False, None):
                                    each.bullet.being = False
                            # Bullet hits the base camp
                            if pygame.sprite.collide_rect(each.bullet, myhome):
                                each.bullet.being = False
                                myhome.set_dead()
                                is_gameover = True
                else:
                    enemytanksGroup.remove(each)
                    tanksGroup.remove(each)
            # Home
            if dead == 0:
                screen.blit(heart_img, (580, 590))
                screen.blit(heart_img, (560, 590))
                screen.blit(heart_img, (540, 590))
            if dead == 1:
                screen.blit(heart_img, (580, 590))
                screen.blit(heart_img, (560, 590))
            if dead == 2:
                screen.blit(heart_img, (580, 590))
            screen.blit(myhome.home, myhome.rect)
            # Food
            for myfood in myfoodsGroup:
                if myfood.being and myfood.time > 0:
                    screen.blit(myfood.food, myfood.rect)
                    myfood.time -= 1
                    for tank_player in mytanksGroup:
                        if pygame.sprite.collide_rect(tank_player, myfood):
                            # Destroy all current enemies
                            if myfood.kind == 0:
                                for _ in enemytanksGroup:
                                    bang_sound.play()
                                enemytanksGroup = pygame.sprite.Group()
                                enemytanks_total -= enemytanks_now
                                enemytanks_now = 0
                            # Enemy still
                            if myfood.kind == 1:
                                for each in enemytanksGroup:
                                    each.can_move = False
                            # Bullet enhancement
                            if myfood.kind == 2:
                                add_sound.play()
                                tank_player.bullet.stronger = True
                            # Make the wall of the base camp into a steel plate
                            if myfood.kind == 3:
                                map_stage.protect_home()
                            # The tank gets a protective cover for a while
                            if myfood.kind == 4:
                                add_sound.play()
                                for tank_player in mytanksGroup:
                                    tank_player.protected = True
                            # Tank upgrade
                            if myfood.kind == 5:
                                add_sound.play()
                                tank_player.up_level()
                            # Tank life +1
                            if myfood.kind == 6:
                                add_sound.play()
                                tank_player.life += 1
                            myfood.being = False
                            myfoodsGroup.remove(myfood)
                            break
                else:
                    myfood.being = False
                    myfoodsGroup.remove(myfood)
            pygame.display.flip()
            clock.tick(60)
    if not is_gameover:
        show_end_interface(screen, 630, 630, True)
    else:
        show_end_interface(screen, 630, 630, False)
Esempio n. 5
0
def main():
    # Initial audio
    pygame.init()
    pygame.mixer.init()
    screen = pygame.display.set_mode((630, 630))
    pygame.display.set_caption("Tian's first Game Project")
    # Loading pictures
    bg_img = pygame.image.load("./images/others/background.png")
    # Load the sound
    add_sound = pygame.mixer.Sound("./audios/add.wav")
    add_sound.set_volume(1)
    bang_sound = pygame.mixer.Sound("./audios/bang.wav")
    bang_sound.set_volume(1)
    blast_sound = pygame.mixer.Sound("./audios/blast.wav")
    blast_sound.set_volume(1)
    fire_sound = pygame.mixer.Sound("./audios/fire.wav")
    fire_sound.set_volume(1)
    Gunfire_sound = pygame.mixer.Sound("./audios/Gunfire.wav")
    Gunfire_sound.set_volume(1)
    hit_sound = pygame.mixer.Sound("./audios/hit.wav")
    hit_sound.set_volume(1)
    start_sound = pygame.mixer.Sound("./audios/start.wav")
    start_sound.set_volume(1)
    # Start interface
    num_player = show_start_interface(screen, 630, 630)
    # Play the start of the game on music
    start_sound.play()
    # mission
    stage = 0
    num_stage = 2
    # Is the game over?
    is_gameover = False
    # Clock
    clock = pygame.time.Clock()
    # main loop
    while not is_gameover:
        # mission
        stage += 1
        if stage > num_stage:
            break
        # Total number of tanks in the level
        enemytanks_total = min(stage * 18, 80)
        # Total number of enemy tanks present on the field
        enemytanks_now = 0
        # Total number of enemy tanks that can be present on the field
        enemytanks_now_max = min(max(stage * 2, 4), 8)
        # The spirit group
        tanksGroup = pygame.sprite.Group()
        mytanksGroup = pygame.sprite.Group()
        enemytanksGroup = pygame.sprite.Group()

        bulletsGroup = pygame.sprite.Group()
        mybulletsGroup = pygame.sprite.Group()
        enemybulletsGroup = pygame.sprite.Group()
        myfoodsGroup = pygame.sprite.Group()

        # Custom event
        # Generates an enemy tank event
        genEnemyEvent = pygame.constants.USEREVENT + 0
        pygame.time.set_timer(genEnemyEvent, 100)
        # enemy tank freeze recovery event
        recoverEnemyEvent = pygame.constants.USEREVENT + 1
        pygame.time.set_timer(recoverEnemyEvent, 8000)
        # Our tank invincible recovery event
        noprotectMytankEvent = pygame.constants.USEREVENT + 2
        pygame.time.set_timer(noprotectMytankEvent, 8000)

        # Levels map
        map_stage = scene.Map(stage)
        # Our tanks
        tank_player1 = tanks.myTank(1)
        tanksGroup.add(tank_player1)
        mytanksGroup.add(tank_player1)
        if num_player > 1:
            tank_player2 = tanks.myTank(2)
            tanksGroup.add(tank_player2)
            mytanksGroup.add(tank_player2)
        is_switch_tank = True
        player1_moving = False
        player2_moving = False
        # For the tire animation
        time = 0
        # The enemy tanks
        for i in range(0, 3):
            if enemytanks_total > 0:
                enemytank = tanks.enemyTank(i)
                tanksGroup.add(enemytank)
                enemytanksGroup.add(enemytank)
                enemytanks_now += 1
                enemytanks_total -= 1
        # Base
        myhome = home.Home()
        # special effects
        appearance_img = pygame.image.load(
            "./images/others/appear.png").convert_alpha()
        appearances = []
        appearances.append(appearance_img.subsurface((0, 0), (48, 48)))
        appearances.append(appearance_img.subsurface((48, 0), (48, 48)))
        appearances.append(appearance_img.subsurface((96, 0), (48, 48)))
        # Level main loop
        while True:
            if is_gameover is True:
                break
            if enemytanks_total < 1 and enemytanks_now < 1:
                is_gameover = False
                break
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
                    sys.exit()
                if event.type == genEnemyEvent:
                    if enemytanks_total > 0:
                        if enemytanks_now < enemytanks_now_max:
                            enemytank = tanks.enemyTank()
                            if not pygame.sprite.spritecollide(
                                    enemytank, tanksGroup, False, None):
                                tanksGroup.add(enemytank)
                                enemytanksGroup.add(enemytank)
                                enemytanks_now += 1
                                enemytanks_total -= 1
                if event.type == recoverEnemyEvent:
                    for each in enemytanksGroup:
                        each.can_move = True
                if event.type == noprotectMytankEvent:
                    for each in mytanksGroup:
                        mytanksGroup.protected = False
            # Check user keyboard actions
            key_pressed = pygame.key.get_pressed()
            # Player 1
            # WSAD -> up down left right
            # Spacebar shooting
            if key_pressed[pygame.K_w]:
                tanksGroup.remove(tank_player1)
                tank_player1.move_up(tanksGroup, map_stage.brickGroup,
                                     map_stage.ironGroup, myhome)
                tanksGroup.add(tank_player1)
                player1_moving = True
            elif key_pressed[pygame.K_s]:
                tanksGroup.remove(tank_player1)
                tank_player1.move_down(tanksGroup, map_stage.brickGroup,
                                       map_stage.ironGroup, myhome)
                tanksGroup.add(tank_player1)
                player1_moving = True
            elif key_pressed[pygame.K_a]:
                tanksGroup.remove(tank_player1)
                tank_player1.move_left(tanksGroup, map_stage.brickGroup,
                                       map_stage.ironGroup, myhome)
                tanksGroup.add(tank_player1)
                player1_moving = True
            elif key_pressed[pygame.K_d]:
                tanksGroup.remove(tank_player1)
                tank_player1.move_right(tanksGroup, map_stage.brickGroup,
                                        map_stage.ironGroup, myhome)
                tanksGroup.add(tank_player1)
                player1_moving = True
            elif key_pressed[pygame.K_SPACE]:
                if not tank_player1.bullet.being:
                    fire_sound.play()
                    tank_player1.shoot()
            # Player 2
            # ↑↓ <- -> up down left right
            # Keypad 0 key shooting
            if num_player > 1:
                if key_pressed[pygame.K_UP]:
                    tanksGroup.remove(tank_player2)
                    tank_player2.move_up(tanksGroup, map_stage.brickGroup,
                                         map_stage.ironGroup, myhome)
                    tanksGroup.add(tank_player2)
                    player2_moving = True
                elif key_pressed[pygame.K_DOWN]:
                    tanksGroup.remove(tank_player2)
                    tank_player2.move_down(tanksGroup, map_stage.brickGroup,
                                           map_stage.ironGroup, myhome)
                    tanksGroup.add(tank_player2)
                    player2_moving = True
                elif key_pressed[pygame.K_LEFT]:
                    tanksGroup.remove(tank_player2)
                    tank_player2.move_left(tanksGroup, map_stage.brickGroup,
                                           map_stage.ironGroup, myhome)
                    tanksGroup.add(tank_player2)
                    player2_moving = True
                elif key_pressed[pygame.K_RIGHT]:
                    tanksGroup.remove(tank_player2)
                    tank_player2.move_right(tanksGroup, map_stage.brickGroup,
                                            map_stage.ironGroup, myhome)
                    tanksGroup.add(tank_player2)
                    player2_moving = True
                elif key_pressed[pygame.K_0]:
                    if not tank_player2.bullet.being:
                        fire_sound.play()
                        tank_player2.shoot()
            # Background
            screen.blit(bg_img, (0, 0))
            # Stone Wall
            for each in map_stage.brickGroup:
                screen.blit(each.brick, each.rect)
            # Steel wall
            for each in map_stage.ironGroup:
                screen.blit(each.iron, each.rect)
            # Ice
            for each in map_stage.iceGroup:
                screen.blit(each.ice, each.rect)
            # River
            for each in map_stage.riverGroup:
                screen.blit(each.river, each.rect)
            # Tree
            for each in map_stage.treeGroup:
                screen.blit(each.tree, each.rect)
            time += 1
            if time == 5:
                time = 0
                is_switch_tank = not is_switch_tank
            # Our tanks
            if tank_player1 in mytanksGroup:
                if is_switch_tank and player1_moving:
                    screen.blit(
                        tank_player1.tank_0,
                        (tank_player1.rect.left, tank_player1.rect.top))
                    player1_moving = False
                else:
                    screen.blit(
                        tank_player1.tank_1,
                        (tank_player1.rect.left, tank_player1.rect.top))
                if tank_player1.protected:
                    screen.blit(
                        tank_player1.protected_mask1,
                        (tank_player1.rect.left, tank_player1.rect.top))
            if num_player > 1:
                if tank_player2 in mytanksGroup:
                    if is_switch_tank and player2_moving:
                        screen.blit(
                            tank_player2.tank_0,
                            (tank_player2.rect.left, tank_player2.rect.top))
                        player1_moving = False
                    else:
                        screen.blit(
                            tank_player2.tank_1,
                            (tank_player2.rect.left, tank_player2.rect.top))
                    if tank_player2.protected:
                        screen.blit(
                            tank_player1.protected_mask1,
                            (tank_player2.rect.left, tank_player2.rect.top))
            # The enemy tanks
            for each in enemytanksGroup:
                # Born special effects
                if each.born:
                    if each.times > 0:
                        each.times -= 1
                        if each.times <= 10:
                            screen.blit(appearances[2],
                                        (3 + each.x * 12 * 24, 3))
                        elif each.times <= 20:
                            screen.blit(appearances[1],
                                        (3 + each.x * 12 * 24, 3))
                        elif each.times <= 30:
                            screen.blit(appearances[0],
                                        (3 + each.x * 12 * 24, 3))
                        elif each.times <= 40:
                            screen.blit(appearances[2],
                                        (3 + each.x * 12 * 24, 3))
                        elif each.times <= 50:
                            screen.blit(appearances[1],
                                        (3 + each.x * 12 * 24, 3))
                        elif each.times <= 60:
                            screen.blit(appearances[0],
                                        (3 + each.x * 12 * 24, 3))
                        elif each.times <= 70:
                            screen.blit(appearances[2],
                                        (3 + each.x * 12 * 24, 3))
                        elif each.times <= 80:
                            screen.blit(appearances[1],
                                        (33 + each.x * 12 * 24, 3))
                        elif each.times <= 90:
                            screen.blit(appearances[0],
                                        (3 + each.x * 12 * 24, 3))
                    else:
                        each.born = False
                else:
                    if is_switch_tank:
                        screen.blit(each.tank_0,
                                    (each.rect.left, each.rect.top))
                    else:
                        screen.blit(each.tank_1,
                                    (each.rect.left, each.rect.top))
                    if each.can_move:
                        tanksGroup.remove(each)
                        each.move(tanksGroup, map_stage.brickGroup,
                                  map_stage.ironGroup, myhome)
                        tanksGroup.add(each)
            # Our bullet
            for tank_player in mytanksGroup:
                if tank_player.bullet.being:
                    tank_player.bullet.move()
                    screen.blit(tank_player.bullet.bullet,
                                tank_player.bullet.rect)
                    # Bullets collide with enemy bullets
                    for each in enemybulletsGroup:
                        if each.being:
                            if pygame.sprite.collide_rect(
                                    tank_player.bullet, each):
                                tank_player.bullet.being = False
                                each.being = False
                                enemybulletsGroup.remove(each)
                                break
                        else:
                            enemybulletsGroup.remove(each)
                    # The bullets collided with the enemy tank
                    for each in enemytanksGroup:
                        if each.being:
                            if pygame.sprite.collide_rect(
                                    tank_player.bullet, each):
                                if each.is_red == True:
                                    myfood = food.Food()
                                    myfood.generate()
                                    myfoodsGroup.add(myfood)
                                    each.is_red = False
                                each.blood -= 1
                                each.color -= 1
                                if each.blood < 0:
                                    bang_sound.play()
                                    each.being = False
                                    enemytanksGroup.remove(each)
                                    enemytanks_now -= 1
                                    tanksGroup.remove(each)
                                else:
                                    each.reload()
                                tank_player.bullet.being = False
                                break
                        else:
                            enemytanksGroup.remove(each)
                            tanksGroup.remove(each)
                    # The bullet struck the stone wall
                    # if pygame.sprite.spritecollide(tank_player.bullet, map_stage.brickGroup, True, None):
                    #     tank_player.bullet.being = False
                    for each in map_stage.brickGroup:
                        if pygame.sprite.collide_rect(tank_player.bullet,
                                                      each):
                            tank_player.bullet.being = False
                            each.being = False
                            map_stage.brickGroup.remove(each)
                            break

                    # The bullet struck the steel wall
                    if tank_player.bullet.stronger:
                        if pygame.sprite.spritecollide(tank_player.bullet,
                                                       map_stage.ironGroup,
                                                       True, None):
                            tank_player.bullet.being = False
                    else:
                        if pygame.sprite.spritecollide(tank_player.bullet,
                                                       map_stage.ironGroup,
                                                       False, None):
                            tank_player.bullet.being = False

                    # Bullet hits the base camp
                    if pygame.sprite.collide_rect(tank_player.bullet, myhome):
                        tank_player.bullet.being = False
                        myhome.set_dead()
                        is_gameover = True
            # Enemy bullet
            for each in enemytanksGroup:
                if each.being:
                    if each.can_move and not each.bullet.being:
                        enemybulletsGroup.remove(each.bullet)
                        each.shoot()
                        enemybulletsGroup.add(each.bullet)
                    if not each.born:
                        if each.bullet.being:
                            each.bullet.move()
                            screen.blit(each.bullet.bullet, each.bullet.rect)

                            # Bullet colliding with our tank
                            for tank_player in mytanksGroup:
                                if pygame.sprite.collide_rect(
                                        each.bullet, tank_player):
                                    if not tank_player.protected:
                                        bang_sound.play()
                                        tank_player.life -= 1
                                        if tank_player.life < 0:
                                            mytanksGroup.remove(tank_player)
                                            tanksGroup.remove(tank_player)
                                            if len(mytanksGroup) < 1:
                                                is_gameover = True
                                        else:
                                            tank_player.reset()
                                    each.bullet.being = False
                                    enemybulletsGroup.remove(each.bullet)
                                    break
                            # The bullet struck the stone wall
                            if pygame.sprite.spritecollide(
                                    each.bullet, map_stage.brickGroup, True,
                                    None):
                                each.bullet.being = False
                                enemybulletsGroup.remove(each.bullet)

                            # The bullet struck the steel wall
                            if each.bullet.stronger:
                                if pygame.sprite.spritecollide(
                                        each.bullet, map_stage.ironGroup, True,
                                        None):
                                    each.bullet.being = False
                            else:
                                if pygame.sprite.spritecollide(
                                        each.bullet, map_stage.ironGroup,
                                        False, None):
                                    each.bullet.being = False

                            # The bullet struck the home base
                            if pygame.sprite.collide_rect(each.bullet, myhome):
                                each.bullet.being = False
                                myhome.set_dead()
                                is_gameover = True
                else:
                    enemytanksGroup.remove(each)
                    tanksGroup.remove(each)
            # home
            screen.blit(myhome.home, myhome.rect)
            # food
            for myfood in myfoodsGroup:
                if myfood.being and myfood.time > 0:
                    screen.blit(myfood.food, myfood.rect)
                    myfood.time -= 1
                    for tank_player in mytanksGroup:
                        if pygame.sprite.collide_rect(tank_player, myfood):
                            # destroy all current enemies
                            if myfood.kind == 0:
                                for _ in enemytanksGroup:
                                    bang_sound.play()
                                enemytanksGroup = pygame.sprite.Group()
                                enemytanks_total -= enemytanks_now
                                enemytanks_now = 0
                            # The enemy stop
                            if myfood.kind == 1:
                                for each in enemytanksGroup:
                                    each.can_move = False
                            # The bullet enhancement
                            if myfood.kind == 2:
                                add_sound.play()
                                tank_player.bullet.stronger = True
                            # To turn the walls of the base camp into steel plates
                            if myfood.kind == 3:
                                map_stage.protect_home()
                            # The tank gets a shield for a period of time
                            if myfood.kind == 4:
                                add_sound.play()
                                for tank_player in mytanksGroup:
                                    tank_player.protected = True
                            # Tanks upgrade
                            if myfood.kind == 5:
                                add_sound.play()
                                tank_player.up_level()
                            # Tanks lisfe+1
                            if myfood.kind == 6:
                                add_sound.play()
                                tank_player.life += 1
                            myfood.being = False
                            myfoodsGroup.remove(myfood)
                            break
                else:
                    myfood.being = False
                    myfoodsGroup.remove(myfood)
            pygame.display.flip()
            clock.tick(60)
    if not is_gameover:
        show_end_interface(screen, 630, 630, True)
    else:
        show_end_interface(screen, 630, 630, False)
Esempio n. 6
0
def main():
	# 初始化
	pygame.init()
	pygame.mixer.init()
	screen = pygame.display.set_mode((630, 630))
	pygame.display.set_caption("坦克大战-公众号: Charles的皮卡丘")
	# 加载图片
	bg_img = pygame.image.load("./images/others/background.png")
	# 加载音效
	add_sound = pygame.mixer.Sound("./audios/add.wav")
	add_sound.set_volume(1)
	bang_sound = pygame.mixer.Sound("./audios/bang.wav")
	bang_sound.set_volume(1)
	blast_sound = pygame.mixer.Sound("./audios/blast.wav")
	blast_sound.set_volume(1)
	fire_sound = pygame.mixer.Sound("./audios/fire.wav")
	fire_sound.set_volume(1)
	Gunfire_sound = pygame.mixer.Sound("./audios/Gunfire.wav")
	Gunfire_sound.set_volume(1)
	hit_sound = pygame.mixer.Sound("./audios/hit.wav")
	hit_sound.set_volume(1)
	start_sound = pygame.mixer.Sound("./audios/start.wav")
	start_sound.set_volume(1)
	# 开始界面
	num_player = show_start_interface(screen, 630, 630)
	# 播放游戏开始的音乐
	start_sound.play()
	# 关卡
	stage = 0
	num_stage = 2
	# 游戏是否结束
	is_gameover = False
	# 时钟
	clock = pygame.time.Clock()
	# 主循环
	while not is_gameover:
		# 关卡
		stage += 1
		if stage > num_stage:
			break
		show_switch_stage(screen, 630, 630, stage)
		# 该关卡坦克总数量
		enemytanks_total = min(stage * 18, 80)
		# 场上存在的敌方坦克总数量
		enemytanks_now = 0
		# 场上可以存在的敌方坦克总数量
		enemytanks_now_max = min(max(stage * 2, 4), 8)
		# 精灵组
		tanksGroup = pygame.sprite.Group()
		mytanksGroup = pygame.sprite.Group()
		enemytanksGroup = pygame.sprite.Group()
		bulletsGroup = pygame.sprite.Group()
		mybulletsGroup = pygame.sprite.Group()
		enemybulletsGroup = pygame.sprite.Group()
		myfoodsGroup = pygame.sprite.Group()
		# 自定义事件
		# 	-生成敌方坦克事件
		genEnemyEvent = pygame.constants.USEREVENT + 0
		pygame.time.set_timer(genEnemyEvent, 100)
		# 	-敌方坦克静止恢复事件
		recoverEnemyEvent = pygame.constants.USEREVENT + 1
		pygame.time.set_timer(recoverEnemyEvent, 8000)
		# 	-我方坦克无敌恢复事件
		noprotectMytankEvent = pygame.constants.USEREVENT + 2
		pygame.time.set_timer(noprotectMytankEvent, 8000)
		# 关卡地图
		map_stage = scene.Map(stage)
		# 我方坦克
		tank_player1 = tanks.myTank(1)
		tanksGroup.add(tank_player1)
		mytanksGroup.add(tank_player1)
		if num_player > 1:
			tank_player2 = tanks.myTank(2)
			tanksGroup.add(tank_player2)
			mytanksGroup.add(tank_player2)
		is_switch_tank = True
		player1_moving = False
		player2_moving = False
		# 为了轮胎的动画效果
		time = 0
		# 敌方坦克
		for i in range(0, 3):
			if enemytanks_total > 0:
				enemytank = tanks.enemyTank(i)
				tanksGroup.add(enemytank)
				enemytanksGroup.add(enemytank)
				enemytanks_now += 1
				enemytanks_total -= 1
		# 大本营
		myhome = home.Home()
		# 出场特效
		appearance_img = pygame.image.load("./images/others/appear.png").convert_alpha()
		appearances = []
		appearances.append(appearance_img.subsurface((0, 0), (48, 48)))
		appearances.append(appearance_img.subsurface((48, 0), (48, 48)))
		appearances.append(appearance_img.subsurface((96, 0), (48, 48)))
		# 关卡主循环
		while True:
			if is_gameover is True:
				break
			if enemytanks_total < 1 and enemytanks_now < 1:
				is_gameover = False
				break
			for event in pygame.event.get():
				if event.type == pygame.QUIT:
					pygame.quit()
					sys.exit()
				if event.type == genEnemyEvent:
					if enemytanks_total > 0:
						if enemytanks_now < enemytanks_now_max:
							enemytank = tanks.enemyTank()
							if not pygame.sprite.spritecollide(enemytank, tanksGroup, False, None):
								tanksGroup.add(enemytank)
								enemytanksGroup.add(enemytank)
								enemytanks_now += 1
								enemytanks_total -= 1
				if event.type == recoverEnemyEvent:
					for each in enemytanksGroup:
						each.can_move = True
				if event.type == noprotectMytankEvent:
					for each in mytanksGroup:
						mytanksGroup.protected = False
			# 检查用户键盘操作
			key_pressed = pygame.key.get_pressed()
			# 玩家一
			# WSAD -> 上下左右
			# 空格键射击
			if key_pressed[pygame.K_w]:
				tanksGroup.remove(tank_player1)
				tank_player1.move_up(tanksGroup, map_stage.brickGroup, map_stage.ironGroup, myhome)
				tanksGroup.add(tank_player1)
				player1_moving = True
			elif key_pressed[pygame.K_s]:
				tanksGroup.remove(tank_player1)
				tank_player1.move_down(tanksGroup, map_stage.brickGroup, map_stage.ironGroup, myhome)
				tanksGroup.add(tank_player1)
				player1_moving = True
			elif key_pressed[pygame.K_a]:
				tanksGroup.remove(tank_player1)
				tank_player1.move_left(tanksGroup, map_stage.brickGroup, map_stage.ironGroup, myhome)
				tanksGroup.add(tank_player1)
				player1_moving = True
			elif key_pressed[pygame.K_d]:
				tanksGroup.remove(tank_player1)
				tank_player1.move_right(tanksGroup, map_stage.brickGroup, map_stage.ironGroup, myhome)
				tanksGroup.add(tank_player1)
				player1_moving = True
			elif key_pressed[pygame.K_SPACE]:
				if not tank_player1.bullet.being:
					fire_sound.play()
					tank_player1.shoot()
			# 玩家二
			# ↑↓←→ -> 上下左右
			# 小键盘0键射击
			if num_player > 1:
				if key_pressed[pygame.K_UP]:
					tanksGroup.remove(tank_player2)
					tank_player2.move_up(tanksGroup, map_stage.brickGroup, map_stage.ironGroup, myhome)
					tanksGroup.add(tank_player2)
					player2_moving = True
				elif key_pressed[pygame.K_DOWN]:
					tanksGroup.remove(tank_player2)
					tank_player2.move_down(tanksGroup, map_stage.brickGroup, map_stage.ironGroup, myhome)
					tanksGroup.add(tank_player2)
					player2_moving = True
				elif key_pressed[pygame.K_LEFT]:
					tanksGroup.remove(tank_player2)
					tank_player2.move_left(tanksGroup, map_stage.brickGroup, map_stage.ironGroup, myhome)
					tanksGroup.add(tank_player2)
					player2_moving = True
				elif key_pressed[pygame.K_RIGHT]:
					tanksGroup.remove(tank_player2)
					tank_player2.move_right(tanksGroup, map_stage.brickGroup, map_stage.ironGroup, myhome)
					tanksGroup.add(tank_player2)
					player2_moving = True
				elif key_pressed[pygame.K_KP0]:
					if not tank_player2.bullet.being:
						fire_sound.play()
						tank_player2.shoot()
			# 背景
			screen.blit(bg_img, (0, 0))
			# 石头墙
			for each in map_stage.brickGroup:
				screen.blit(each.brick, each.rect)
			# 钢墙
			for each in map_stage.ironGroup:
				screen.blit(each.iron, each.rect)
			# 冰
			for each in map_stage.iceGroup:
				screen.blit(each.ice, each.rect)
			# 河流
			for each in map_stage.riverGroup:
				screen.blit(each.river, each.rect)
			# 树
			for each in map_stage.treeGroup:
				screen.blit(each.tree, each.rect)
			time += 1
			if time == 5:
				time = 0
				is_switch_tank = not is_switch_tank
			# 我方坦克
			if tank_player1 in mytanksGroup:
				if is_switch_tank and player1_moving:
					screen.blit(tank_player1.tank_0, (tank_player1.rect.left, tank_player1.rect.top))
					player1_moving = False
				else:
					screen.blit(tank_player1.tank_1, (tank_player1.rect.left, tank_player1.rect.top))
				if tank_player1.protected:
					screen.blit(tank_player1.protected_mask1, (tank_player1.rect.left, tank_player1.rect.top))
			if num_player > 1:
				if tank_player2 in mytanksGroup:
					if is_switch_tank and player2_moving:
						screen.blit(tank_player2.tank_0, (tank_player2.rect.left, tank_player2.rect.top))
						player1_moving = False
					else:
						screen.blit(tank_player2.tank_1, (tank_player2.rect.left, tank_player2.rect.top))
					if tank_player2.protected:
						screen.blit(tank_player1.protected_mask1, (tank_player2.rect.left, tank_player2.rect.top))
			# 敌方坦克
			for each in enemytanksGroup:
				# 出生特效
				if each.born:
					if each.times > 0:
						each.times -= 1
						if each.times <= 10:
							screen.blit(appearances[2], (3+each.x*12*24, 3))
						elif each.times <= 20:
							screen.blit(appearances[1], (3+each.x*12*24, 3))
						elif each.times <= 30:
							screen.blit(appearances[0], (3+each.x*12*24, 3))
						elif each.times <= 40:
							screen.blit(appearances[2], (3+each.x*12*24, 3))
						elif each.times <= 50:
							screen.blit(appearances[1], (3+each.x*12*24, 3))
						elif each.times <= 60:
							screen.blit(appearances[0], (3+each.x*12*24, 3))
						elif each.times <= 70:
							screen.blit(appearances[2], (3+each.x*12*24, 3))
						elif each.times <= 80:
							screen.blit(appearances[1], (3+each.x*12*24, 3))
						elif each.times <= 90:
							screen.blit(appearances[0], (3+each.x*12*24, 3))
					else:
						each.born = False
				else:
					if is_switch_tank:
						screen.blit(each.tank_0, (each.rect.left, each.rect.top))
					else:
						screen.blit(each.tank_1, (each.rect.left, each.rect.top))
					if each.can_move:
						tanksGroup.remove(each)
						each.move(tanksGroup, map_stage.brickGroup, map_stage.ironGroup, myhome)
						tanksGroup.add(each)
			# 我方子弹
			for tank_player in mytanksGroup:
				if tank_player.bullet.being:
					tank_player.bullet.move()
					screen.blit(tank_player.bullet.bullet, tank_player.bullet.rect)
					# 子弹碰撞敌方子弹
					for each in enemybulletsGroup:
						if each.being:
							if pygame.sprite.collide_rect(tank_player.bullet, each):
								tank_player.bullet.being = False
								each.being = False
								enemybulletsGroup.remove(each)
								break
						else:
							enemybulletsGroup.remove(each)	
					# 子弹碰撞敌方坦克
					for each in enemytanksGroup:
						if each.being:
							if pygame.sprite.collide_rect(tank_player.bullet, each):
								if each.is_red == True:
									myfood = food.Food()
									myfood.generate()
									myfoodsGroup.add(myfood)
									each.is_red = False
								each.blood -= 1
								each.color -= 1
								if each.blood < 0:
									bang_sound.play()
									each.being = False
									enemytanksGroup.remove(each)
									enemytanks_now -= 1
									tanksGroup.remove(each)
								else:
									each.reload()
								tank_player.bullet.being = False
								break
						else:
							enemytanksGroup.remove(each)
							tanksGroup.remove(each)
					# 子弹碰撞石头墙
					if pygame.sprite.spritecollide(tank_player.bullet, map_stage.brickGroup, True, None):
						tank_player.bullet.being = False
					'''
					# 等价方案(更科学点)
					for each in map_stage.brickGroup:
						if pygame.sprite.collide_rect(tank_player.bullet, each):
							tank_player.bullet.being = False
							each.being = False
							map_stage.brickGroup.remove(each)
							break
					'''
					# 子弹碰钢墙
					if tank_player.bullet.stronger:
						if pygame.sprite.spritecollide(tank_player.bullet, map_stage.ironGroup, True, None):
							tank_player.bullet.being = False
					else:
						if pygame.sprite.spritecollide(tank_player.bullet, map_stage.ironGroup, False, None):
							tank_player.bullet.being = False
					'''
					# 等价方案(更科学点)
					for each in map_stage.ironGroup:
						if pygame.sprite.collide_rect(tank_player.bullet, each):
							tank_player.bullet.being = False
							if tank_player.bullet.stronger:
								each.being = False
								map_stage.ironGroup.remove(each)
							break
					'''
					# 子弹碰大本营
					if pygame.sprite.collide_rect(tank_player.bullet, myhome):
						tank_player.bullet.being = False
						myhome.set_dead()
						is_gameover = True
			# 敌方子弹
			for each in enemytanksGroup:
				if each.being:
					if each.can_move and not each.bullet.being:
						enemybulletsGroup.remove(each.bullet)
						each.shoot()
						enemybulletsGroup.add(each.bullet)
					if not each.born:
						if each.bullet.being:
							each.bullet.move()
							screen.blit(each.bullet.bullet, each.bullet.rect)
							# 子弹碰撞我方坦克
							for tank_player in mytanksGroup:
								if pygame.sprite.collide_rect(each.bullet, tank_player):
									if not tank_player.protected:
										bang_sound.play()
										tank_player.life -= 1
										if tank_player.life < 0:
											mytanksGroup.remove(tank_player)
											tanksGroup.remove(tank_player)
											if len(mytanksGroup) < 1:
												is_gameover = True
										else:
											tank_player.reset()
									each.bullet.being = False
									enemybulletsGroup.remove(each.bullet)
									break
							# 子弹碰撞石头墙
							if pygame.sprite.spritecollide(each.bullet, map_stage.brickGroup, True, None):
								each.bullet.being = False
								enemybulletsGroup.remove(each.bullet)
							'''
							# 等价方案(更科学点)
							for one in map_stage.brickGroup:
								if pygame.sprite.collide_rect(each.bullet, one):
									each.bullet.being = False
									one.being = False
									enemybulletsGroup.remove(one)
									break
							'''
							# 子弹碰钢墙
							if each.bullet.stronger:
								if pygame.sprite.spritecollide(each.bullet, map_stage.ironGroup, True, None):
									each.bullet.being = False
							else:
								if pygame.sprite.spritecollide(each.bullet, map_stage.ironGroup, False, None):
									each.bullet.being = False
							'''
							# 等价方案(更科学点)
							for one in map_stage.ironGroup:
								if pygame.sprite.collide_rect(each.bullet, one):
									each.bullet.being = False
									if each.bullet.stronger:
										one.being = False
										map_stage.ironGroup.remove(one)
									break
							'''
							# 子弹碰大本营
							if pygame.sprite.collide_rect(each.bullet, myhome):
								each.bullet.being = False
								myhome.set_dead()
								is_gameover = True
				else:
					enemytanksGroup.remove(each)
					tanksGroup.remove(each)
			# 家
			screen.blit(myhome.home, myhome.rect)
			# 食物
			for myfood in myfoodsGroup:
				if myfood.being and myfood.time > 0:
					screen.blit(myfood.food, myfood.rect)
					myfood.time -= 1
					for tank_player in mytanksGroup:
						if pygame.sprite.collide_rect(tank_player, myfood):
							# 消灭当前所有敌人
							if myfood.kind == 0:
								for _ in enemytanksGroup:
									bang_sound.play()
								enemytanksGroup = pygame.sprite.Group()
								enemytanks_total -= enemytanks_now
								enemytanks_now = 0
							# 敌人静止
							if myfood.kind == 1:
								for each in enemytanksGroup:
									each.can_move = False
							# 子弹增强
							if myfood.kind == 2:
								add_sound.play()
								tank_player.bullet.stronger = True
							# 使得大本营的墙变为钢板
							if myfood.kind == 3:
								map_stage.protect_home()
							# 坦克获得一段时间的保护罩
							if myfood.kind == 4:
								add_sound.play()
								for tank_player in mytanksGroup:
									tank_player.protected = True
							# 坦克升级
							if myfood.kind == 5:
								add_sound.play()
								tank_player.up_level()
							# 坦克生命+1
							if myfood.kind == 6:
								add_sound.play()
								tank_player.life += 1
							myfood.being = False
							myfoodsGroup.remove(myfood)
							break
				else:
					myfood.being = False
					myfoodsGroup.remove(myfood)
			pygame.display.flip()
			clock.tick(60)
	if not is_gameover:
		show_end_interface(screen, 630, 630, True)
	else:
		show_end_interface(screen, 630, 630, False)
Esempio n. 7
0
def main():
    pygame.init()
    # 构造屏幕宽高为 630 * 630
    screen = pygame.display.set_mode([630 , 630])
    # 设置窗口上方显示的文字
    pygame.display.set_caption("坦克大战-xx_cc")
    # 刷新一下
    # pygame.display.update()

    # 默认关数
    stage = 0
    # 总关数
    stage_Num = 2
    # 游戏是否结束
    is_GameOver = False
    # 时钟
    clock = pygame.time.Clock()

    # 显示主页面
    player = show_interface_start(screen, 630, 630)

    # 加载音频
    sound_volume = 1
    add_sound = pygame.mixer.Sound("./audios/add.wav")
    bang_sound = pygame.mixer.Sound("./audios/bang.wav")
    blast_sound = pygame.mixer.Sound("./audios/blast.wav")
    fire_sound = pygame.mixer.Sound("./audios/fire.wav")
    gunfire_sound = pygame.mixer.Sound("./audios/Gunfire.wav")
    hit_sound = pygame.mixer.Sound("./audios/hit.wav")
    start_sound = pygame.mixer.Sound("./audios/start.wav")

    # 设置音量
    add_sound.set_volume(sound_volume)
    bang_sound.set_volume(sound_volume)
    blast_sound.set_volume(sound_volume)
    fire_sound.set_volume(sound_volume)
    gunfire_sound.set_volume(sound_volume)
    hit_sound.set_volume(sound_volume)
    start_sound.set_volume(sound_volume)

    # 游戏主循环
    while not is_GameOver:
        stage += 1
        if stage > stage_Num:
            break

        # 游戏开始音效
        start_sound.play()

        # 显示当前关数界面 1s时间
        show_change_stage(screen, 630, 630, stage)

        # 该关卡坦克总数量
        enemytanks_total = min(stage * 18 ,80)
        # 场上存在的地方坦克总数量
        enemytanks_now = 0
        # 场上可以存在的地方坦克总数量
        enemytanks_now_max = min((max(stage * 2, 4), 8))

        # 精灵组
        tanksGroup = pygame.sprite.Group()
        myTanksGroup = pygame.sprite.Group()
        enemyTanksGroup = pygame.sprite.Group()
        bulletsGroup = pygame.sprite.Group()
        mybulletsGroup = pygame.sprite.Group()
        enemybulletsGroup = pygame.sprite.Group()
        myfoodsGroup = pygame.sprite.Group()

        # 自定义事件
        # 生成敌方坦克事件
        genEnemyEvent = pygame.constants.USEREVENT
        pygame.time.set_timer(genEnemyEvent, 100)

        # 敌方坦克静止恢复事件
        recoverEnemyEvent = pygame.constants.USEREVENT
        pygame.time.set_timer(recoverEnemyEvent, 8000)

        # 我方坦克无敌恢复事件
        noprotextMyTankEvent = pygame.constants.USEREVENT
        pygame.time.set_timer(noprotextMyTankEvent, 8000)

        # 显示背景
        bg_img = pygame.image.load("./images/others/background.png")
        screen.blit(bg_img, (0, 0))

        # 显示大本营
        # 在外部模块使用其他模块的类创建对象时,需要:模块名字+类名创建
        myHome = home.Home()

        # 绘制地图
        map_stage = scene.Map(stage)

        # 添加我方坦克
        tank_player1 = tanks.myTank(1)
        tanksGroup.add(tank_player1)
        myTanksGroup.add(tank_player1)
        if player > 1:
            tank_player2 = tanks.myTank(2)
            tanksGroup.add(tank_player2)
            myTanksGroup.add(tank_player2)

        is_switch_tank = True
        player1_moving = False
        player2_moving = False

        # 为了轮胎的动画效果
        time = 0
        # 敌方坦克
        for i in range(0,3):
            if enemytanks_total > 0:
                enemytank = tanks.enemyTank(i)
                tanksGroup.add(enemytank)
                enemyTanksGroup.add(enemytank)
                enemytanks_now += 1
                enemytanks_total -= 1

        appearance_img = pygame.image.load("./images/others/appear.png").convert_alpha()
        appearance = []
        appearance.append(appearance_img.subsurface((0,0),(48,48)))
        appearance.append(appearance_img.subsurface((48,0),(48,48)))
        appearance.append(appearance_img.subsurface((96,0),(48,48)))


        # 实时监听用户操作事件 1. 用户点击事件 2. 用户点击键盘
        while True:
            if is_GameOver is True:
                break
            if enemytanks_total < 1 and enemytanks_now < 1:
                is_GameOver = False
                break

            # 遍历所有事件
            for event in pygame.event.get():
                # 如果点击了关闭
                if event.type == QUIT:
                    # 关闭屏幕
                    sys.exit()
                if event.type == genEnemyEvent:
                    if enemytanks_total > 0:
                        if enemytanks_now < enemytanks_now_max:
                            enemytank = tanks.enemyTank()
                            if not pygame.sprite.spritecollide(enemytank, tanksGroup, False, None):
                                tanksGroup.add(enemytank)
                                enemyTanksGroup.add(enemytank)
                                enemytanks_now += 1
                                enemytanks_total -= 1

                if event.type == recoverEnemyEvent:
                    for each in enemyTanksGroup:
                        each.can_move = True

                if event.type == noprotextMyTankEvent:
                    for each in myTanksGroup:
                        each.protected = False

            # 刷新背景
            screen.blit(bg_img,(0,0))

            # 监听用户按键事件
            key_pressed = pygame.key.get_pressed()
            if key_pressed[pygame.K_w]:
                tanksGroup.remove(tank_player1)
                tank_player1.move_up(tanksGroup, map_stage.brickGroup, map_stage.ironGroup, myHome)
                tanksGroup.add(tank_player1)
                player1_moving = True
            if key_pressed[pygame.K_s]:
                tanksGroup.remove(tank_player1)
                tank_player1.move_down(tanksGroup, map_stage.brickGroup, map_stage.ironGroup, myHome)
                tanksGroup.add(tank_player1)
                player1_moving = True
            if key_pressed[pygame.K_a]:
                tanksGroup.remove(tank_player1)
                tank_player1.move_left(tanksGroup, map_stage.brickGroup, map_stage.ironGroup, myHome)
                tanksGroup.add(tank_player1)
                player1_moving = True
            if key_pressed[pygame.K_d]:
                tanksGroup.remove(tank_player1)
                tank_player1.move_right(tanksGroup, map_stage.brickGroup, map_stage.ironGroup, myHome)
                tanksGroup.add(tank_player1)
                player1_moving = True
            if key_pressed[pygame.K_SPACE]:
                if not tank_player1.bullet.being:
                    fire_sound.play()
                    tank_player1.shoot()

            # 玩家二
            if player > 1:
                if key_pressed[pygame.K_UP]:
                    tanksGroup.remove(tank_player2)
                    tank_player2.move_up(tanksGroup, map_stage.brickGroup, map_stage.ironGroup, myHome)
                    tanksGroup.add(tank_player2)
                    player2_moving = True
                elif key_pressed[pygame.K_DOWN]:
                    tanksGroup.remove(tank_player2)
                    tank_player2.move_down(tanksGroup, map_stage.brickGroup, map_stage.ironGroup, myHome)
                    tanksGroup.add(tank_player2)
                    player2_moving = True
                elif key_pressed[pygame.K_LEFT]:
                    tanksGroup.remove(tank_player2)
                    tank_player2.move_left(tanksGroup, map_stage.brickGroup, map_stage.ironGroup, myHome)
                    tanksGroup.add(tank_player2)
                    player2_moving = True
                elif key_pressed[pygame.K_RIGHT]:
                    tanksGroup.remove(tank_player2)
                    tank_player2.move_right(tanksGroup, map_stage.brickGroup, map_stage.ironGroup, myHome)
                    tanksGroup.add(tank_player2)
                    player2_moving = True
                elif key_pressed[pygame.K_0]:
                    if not  tank_player2.bullet.being:
                        fire_sound.play()
                        tank_player2.shoot()

            # 绘制大本营
            screen.blit(myHome.home, myHome.rect)

            # 绘制地图元素(砖块等)
            for eachBrick in map_stage.brickGroup:
                screen.blit(eachBrick.brick, eachBrick.rect)

            for eachIron in map_stage.ironGroup:
                screen.blit(eachIron.iron, eachIron.rect)

            for eachIce in map_stage.iceGroup:
                screen.blit(eachIce.ice, eachIce.rect)

            for eachRiver in map_stage.riverGroup:
                screen.blit(eachRiver.river, eachRiver.rect)

            for eachTree in map_stage.treeGroup:
                screen.blit(eachTree.tree, eachTree.rect)

            time += 1
            if time == 5:
                time = 0
                is_switch_tank = not is_switch_tank

            # 绘制本方坦克
            if tank_player1 in myTanksGroup:
                if is_switch_tank and player1_moving:
                    screen.blit(tank_player1.tank_0, tank_player1.rect)
                    player1_moving = False
                else:
                    screen.blit(tank_player1.tank_1, tank_player1.rect)
                # 如果有保护罩
                if tank_player1.protected:
                    screen.blit(tank_player1.protected_mask1, tank_player1.rect)
            if player > 1:
                if tank_player2 in myTanksGroup:
                    if is_switch_tank and player2_moving:
                        screen.blit(tank_player2.tank_0, tank_player2.rect)
                        player1_moving = False
                    else:
                        screen.blit(tank_player2.tank_1, tank_player2.rect)

                    if tank_player2.protected:
                        screen.blit(tank_player2.protected_mask1, tank_player2.rect)

            # 绘制敌方坦克
            for each in enemyTanksGroup:
                # 出生特效
                if each.born:
                    if each.times > 0:
                        each.times -= 1
                        if each.times <= 10:
                            screen.blit(appearance[2],(3 + each.x * 12 * 24, 3))
                        elif each.times <= 20:
                            screen.blit(appearance[1],(3 + each.x * 12 * 24, 3))
                        elif each.times <= 30:
                            screen.blit(appearance[0],(3 + each.x * 12 * 24, 3))
                        elif each.times <= 40:
                            screen.blit(appearance[2],(3 + each.x * 12 * 24, 3))
                        elif each.times <= 50:
                            screen.blit(appearance[1],(3 + each.x * 12 * 24, 3))
                        elif each.times <= 60:
                            screen.blit(appearance[0],(3 + each.x * 12 * 24, 3))
                        elif each.times <= 70:
                            screen.blit(appearance[2],(3 + each.x * 12 * 24, 3))
                        elif each.times <= 80:
                            screen.blit(appearance[1],(3 + each.x * 12 * 24, 3))
                        elif each.times <= 90:
                            screen.blit(appearance[0],(3 + each.x * 12 * 24, 3))
                    else:
                        each.born = False
                else:
                    if is_switch_tank:
                        screen.blit(each.tank_0, each.rect)
                    else:
                        screen.blit(each.tank_1, each.rect)

                    if each.can_move:
                        tanksGroup.remove(each)
                        each.move(tanksGroup, map_stage.brickGroup, map_stage.ironGroup, myHome)
                        tanksGroup.add(each)

            # 我方子弹
            for tank_player in myTanksGroup:
                if tank_player.bullet.being:
                    tank_player.bullet.move()
                    screen.blit(tank_player.bullet.bullet, tank_player.bullet.rect)

                    # 子弹碰撞敌方子弹
                    for each in enemybulletsGroup:
                        if each.being:
                            if pygame.sprite.collide_rect(tank_player.bullet, each):
                                tank_player.bullet.being = False
                                each.bing = False
                                enemybulletsGroup.remove(each)
                                break
                        else:
                            enemybulletsGroup.remove(each)

                    # 子弹碰撞敌方坦克
                    for each in enemyTanksGroup:
                        if each.being:
                            if pygame.sprite.collide_rect(tank_player.bullet, each):
                                if each.is_Red == True:
                                    myfood = food.Food()
                                    myfood.generate()
                                    myfoodsGroup.add(myfood)
                                    each.is_Red = False
                                each.blood -= 1
                                each.color -= 1
                                if each.blood < 0:
                                    bang_sound.play()
                                    each.being = False
                                    enemyTanksGroup.remove(each)
                                    enemytanks_now -= 1
                                    tanksGroup.remove(each)
                                else:
                                    each.reload()
                                tank_player.bullet.being = False
                                break
                        else:
                            enemyTanksGroup.remove(each)
                            tanksGroup.remove(each)

                    # 子弹碰撞石头墙
                    for each in map_stage.brickGroup:
                        if pygame.sprite.collide_rect(tank_player.bullet, each):
                            tank_player.bullet.being = False
                            each.being = False
                            map_stage.brickGroup.remove(each)
                            break

                    # 子弹碰撞钢墙
                    for each in map_stage.ironGroup:
                        if pygame.sprite.collide_rect(tank_player.bullet, each):
                            tank_player.bullet.being = False
                            if tank_player.bullet.stronger:
                                each.being = False
                                map_stage.ironGroup.remove(each)
                            break

                    # 子弹碰撞大本营
                    if pygame.sprite.collide_rect(tank_player.bullet, myHome):
                        tank_player.bullet.being = False
                        myHome.set_Dead()
                        is_GameOver = True
                        break
            # 敌方子弹
            for each in enemyTanksGroup:
                if each.being:
                    if each.can_move and not each.bullet.being:
                        enemyTanksGroup.remove(each.bullet)
                        each.shoot()
                        enemybulletsGroup.add(each.bullet)
                    if not each.born:
                        if each.bullet.being:
                            each.bullet.move()
                            screen.blit(each.bullet.bullet, each.bullet.rect)
                            # 子弹碰撞我方坦克
                            for tank_player in myTanksGroup:
                                if pygame.sprite.collide_rect(each.bullet, tank_player):

                                    if tank_player.protected:
                                        tank_player.protected = False
                                    else:
                                        tank_player.life -= 1
                                    if tank_player.life < 0:
                                        myTanksGroup.remove(tank_player)
                                        tanksGroup.remove(tank_player)
                                        if len(myTanksGroup) < 1:
                                            is_GameOver = True
                                    else:
                                        tank_player.reset()

                                    each.bullet.being = False
                                    enemybulletsGroup.remove(each.bullet)
                                    brick

                            # 子弹碰撞石头墙
                            for brick in map_stage.brickGroup:
                                if pygame.sprite.collide_rect(each.bullet, brick):
                                    each.bullet.being = False
                                    enemybulletsGroup.remove(each.bullet)
                                    brick.being = False
                                    map_stage.brickGroup.remove(brick)
                                    break

                            # 子弹碰撞钢墙
                            for iron in map_stage.ironGroup:
                                if pygame.sprite.collide_rect(each.bullet, iron):
                                    each.bullet.being = False
                                    if each.bullet.stronger:
                                        iron.being = False
                                        map_stage.ironGroup.remove(iron)
                                    break

                            # 子弹碰撞大本营
                            if pygame.sprite.collide_rect(each.bullet, myHome):
                                each.bullet.being = False
                                myHome.set_Dead()
                                is_GameOver = True
                                break
                else:
                    enemyTanksGroup.remove(each)
                    tanksGroup.remove(each)


            # 食物
            for myfood in myfoodsGroup:
                if myfood.being and myfood.time > 0:
                    screen.blit(myfood.food, myfood.rect)
                    myfood.time -= 1
                    for tanke_player in myTanksGroup:
                        if pygame.sprite.collide_rect(tank_player, myfood):
                            # 消灭当前所有敌人
                            if myfood.kind == 0:
                                for _ in enemyTanksGroup:
                                    bang_sound.play()
                                enemyTanksGroup = pygame.sprite.Group()
                                enemytanks_total -= enemytanks_now
                                enemytanks_now = 0

                            # 敌人静止
                            if myfood.kind == 1:
                                for each in enemyTanksGroup:
                                    each.can_move = False

                            # 子弹增强
                            if myfood.kind == 2:
                                add_sound.play()
                                tank_player.bullet.stronger = True

                            # 是大本营的墙变为刚板
                            if myfood.kind == 3:
                                map_stage.protect_home()

                            # 坦克获得一段时间的保护罩
                            if myfood.kind == 4:
                                add_sound.play()
                                for tank_player in myfoodsGroup:
                                    tank_player.protected = True

                            # 坦克升级
                            if myfood.kind == 5:
                                add_sound.play()
                                tank_player.up_level()

                            # 坦克生命 + 1
                            if myfood.kind == 6:
                                add_sound.play()
                                tank_player.lefe += 1

                            myfood.being = False
                            myfoodsGroup.remove(myfood)
                            break
                else:
                    myfood.being = False
                    myfoodsGroup.remove(myfood)

            pygame.display.flip()
            clock.tick(60)

        if not is_GameOver:
            show_interface_end(screen, 630,630, True)
        else:
            show_interface_end(screen,630,630, False)