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)
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")
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)
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)
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)
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)
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)