def main(): pygame.mixer.music.play(-1) #生成我方飞机 me = myplane.MyPlane(bg_size) #生成敌方飞机 enemies = pygame.sprite.Group() #小型 small_enemies = pygame.sprite.Group() add_small_enemies(small_enemies, enemies, 18) #中型 mid_enemies = pygame.sprite.Group() add_mid_enemies(mid_enemies, enemies, 3) #大型 big_enemies = pygame.sprite.Group() add_big_enemies(big_enemies, enemies, 1) #初级子弹 bullet1 = [] bullet1_index = 0 BULLET1_NUM = 5 for i in range(BULLET1_NUM): bullet1.append(bullet.Bullet1(me.rect.midtop)) #二级子弹 bullet2 = [] bullet2_index = 0 BULLET2_NUM = 5 for i in range(BULLET2_NUM): bullet2.append(bullet.Bullet2(me.rect.midtop)) #三级子弹 bullet3 = [] bullet3_index = 0 BULLET3_NUM = 10 for i in range(BULLET3_NUM // 2): bullet3.append(bullet.Bullet1((me.rect.centerx - 33, me.rect.centery))) bullet3.append(bullet.Bullet1((me.rect.centerx + 30, me.rect.centery))) #四级子弹 bullet4 = [] bullet4_index = 0 BULLET4_NUM = 10 for i in range(BULLET4_NUM // 2): bullet4.append(bullet.Bullet2((me.rect.centerx - 33, me.rect.centery))) bullet4.append(bullet.Bullet2((me.rect.centerx + 30, me.rect.centery))) #五级子弹 bullet5 = [] bullet5_index = 0 BULLET5_NUM = 15 for i in range(BULLET5_NUM // 3): bullet5.append(bullet.Bullet1(me.rect.midtop)) bullet5.append(bullet.Bullet1((me.rect.centerx - 33, me.rect.centery))) bullet5.append(bullet.Bullet1((me.rect.centerx + 30, me.rect.centery))) #六级子弹 bullet6 = [] bullet6_index = 0 BULLET6_NUM = 15 for i in range(BULLET5_NUM // 3): bullet6.append(bullet.Bullet2(me.rect.midtop)) bullet6.append(bullet.Bullet2((me.rect.centerx - 33, me.rect.centery))) bullet6.append(bullet.Bullet2((me.rect.centerx + 30, me.rect.centery))) clock = pygame.time.Clock() #无敌状态计=计时器 INVINCIBLE_TIME = USEREVENT + 2 #用于防止反复打开记录文件 recorded = False # 游戏结束画面 gameover_font = pygame.font.Font("font/font.TTF", 48) again_image = pygame.image.load("images/again.png").convert_alpha() again_rect = again_image.get_rect() gameover_image = pygame.image.load("images/gameover.png").convert_alpha() gameover_rect = gameover_image.get_rect() #每30秒发放一个补给包 bullet_supply = supply.Bullet_Supply(bg_size) bomb_supply = supply.Bomb_Supply(bg_size) SUPPLY_TIME = USEREVENT pygame.time.set_timer(SUPPLY_TIME, 30 * 1000) #武器等级 weapon_level = 1 #难度级别 level = 1 #炸弹 bomb_image = pygame.image.load("images/bomb.png").convert_alpha() bomb_rect = bomb_image.get_rect() bomb_font = pygame.font.Font("font/font.ttf", 48) bomb_num = 3 #统计得分 score = 0 score_font = pygame.font.Font("font/font.ttf", 36) #是否暂停游戏 paused = False pause_nor_image = pygame.image.load("images/pause_nor.png").convert_alpha() pause_pressed_image = pygame.image.load( "images/pause_pressed.png").convert_alpha() resume_nor_image = pygame.image.load( "images/resume_nor.png").convert_alpha() resume_pressed_image = pygame.image.load( "images/resume_pressed.png").convert_alpha() paused_rect = pause_nor_image.get_rect() paused_rect.left, paused_rect.top = width - paused_rect.width - 10, 10 paused_image = pause_nor_image #中弹图片索引 e1_destroy_index = 0 e2_destroy_index = 0 e3_destroy_index = 0 me_destroy_index = 0 #用于切换我方飞机图片 switch_image = True #我方飞机生命 life_image = pygame.image.load("images/life.png").convert_alpha() life_rect = life_image.get_rect() life_num = 3 #用于延迟 delay = 100 running = True while running: for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() elif event.type == MOUSEBUTTONDOWN: if event.button == 1 and paused_rect.collidepoint(event.pos): paused = not paused if paused: pygame.time.set_timer(SUPPLY_TIME, 0) pygame.mixer.pause() else: pygame.time.set_timer(SUPPLY_TIME, 30 * 1000) pygame.mixer.unpause() elif event.type == MOUSEMOTION: if paused_rect.collidepoint(event.pos): if paused: paused_image = resume_pressed_image else: paused_image = pause_pressed_image else: if paused: paused_image = resume_nor_image else: paused_image = pause_nor_image elif event.type == KEYDOWN: if event.key == K_SPACE: if bomb_num: bomb_num -= 1 bomb_sound.play() for each in enemies: if each.rect.bottom > 0: each.active = False elif event.type == SUPPLY_TIME: supply_sound.play() if choice([True, False]): bomb_supply.reset() else: bullet_supply.reset() elif event.type == INVINCIBLE_TIME: me.invincible = False pygame.time.set_timer(INVINCIBLE_TIME, 0) #根据用户的得分增加难度 if level == 1 and score > 50000: level = 2 upgrade_sound.play() #添加小型敌机*3,中型敌机*2,大型敌机*1 add_small_enemies(small_enemies, enemies, 3) add_mid_enemies(mid_enemies, enemies, 2) add_big_enemies(big_enemies, enemies, 1) #提升小型敌机的速度 inc_speed(small_enemies, 1) elif level == 2 and score > 150000: level = 3 upgrade_sound.play() #添加小型敌机*3,中型敌机*2,大型敌机*1 add_small_enemies(small_enemies, enemies, 3) add_mid_enemies(mid_enemies, enemies, 2) add_big_enemies(big_enemies, enemies, 1) inc_speed(mid_enemies, 1) elif level == 3 and score > 300000: level = 4 upgrade_sound.play() # 添加小型敌机*3,中型敌机*2,大型敌机*1 add_small_enemies(small_enemies, enemies, 3) add_mid_enemies(mid_enemies, enemies, 2) add_big_enemies(big_enemies, enemies, 1) # 提升小型敌机的速度 inc_speed(small_enemies, 1) elif level == 4 and score > 500000: level = 5 upgrade_sound.play() # 添加小型敌机*5,中型敌机*2,大型敌机*1 add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 2) add_big_enemies(big_enemies, enemies, 1) inc_speed(mid_enemies, 1) elif level == 5 and score > 750000: level = 6 upgrade_sound.play() # 添加小型敌机*5,中型敌机*3,大型敌机*1 add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 2) add_big_enemies(big_enemies, enemies, 1) # 提升小型敌机的速度 inc_speed(small_enemies, 1) elif level == 6 and score > 1000000: level = 7 upgrade_sound.play() # 添加小型敌机*5,中型敌机*3,大型敌机*1 add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 2) add_big_enemies(big_enemies, enemies, 1) inc_speed(mid_enemies, 1) elif level == 7 and score > 1500000: level = 8 upgrade_sound.play() # 添加小型敌机*5,中型敌机*3,大型敌机*1 add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 2) add_big_enemies(big_enemies, enemies, 1) # 提升小型敌机的速度 inc_speed(small_enemies, 1) elif level == 8 and score > 2000000: level = 9 upgrade_sound.play() # 添加小型敌机*5,中型敌机*3,大型敌机*1 add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 2) add_big_enemies(big_enemies, enemies, 1) inc_speed(mid_enemies, 1) screen.blit(background, (0, 0)) if not paused and life_num: #检查用户的键盘操作 key_pressed = pygame.key.get_pressed() if key_pressed[K_w] or key_pressed[K_UP] or key_pressed[K_k]: me.moveUp() if key_pressed[K_s] or key_pressed[K_DOWN] or key_pressed[K_j]: me.moveDown() if key_pressed[K_a] or key_pressed[K_LEFT] or key_pressed[K_h]: me.moveLeft() if key_pressed[K_d] or key_pressed[K_RIGHT] or key_pressed[K_l]: me.moveRight() #绘制炸弹补给 if bomb_supply.active: bomb_supply.move() screen.blit(bomb_supply.image, bomb_supply.rect) if pygame.sprite.collide_mask(bomb_supply, me): get_bomb_sound.play() if bomb_num < 3: bomb_num += 1 bomb_supply.active = False # 绘制子弹补给 if bullet_supply.active: bullet_supply.move() screen.blit(bullet_supply.image, bullet_supply.rect) if pygame.sprite.collide_mask(bullet_supply, me): get_bullet_sound.play() bullet_supply.active = False #武器等级提升 if weapon_level < 6: weapon_level += 1 #根据武器等级绘制子弹 if not (delay % 10): bullet_sound.play() if weapon_level == 1: bullets = bullet1 bullets[bullet1_index].reset(me.rect.midtop) bullet1_index = (bullet1_index + 1) % BULLET1_NUM if weapon_level == 2: bullets = bullet2 bullets[bullet2_index].reset(me.rect.midtop) bullet2_index = (bullet2_index + 1) % BULLET2_NUM if weapon_level == 3: bullets = bullet3 bullets[bullet3_index].reset( (me.rect.centerx - 33, me.rect.centery)) bullets[bullet3_index + 1].reset( (me.rect.centerx + 30, me.rect.centery)) bullet3_index = (bullet3_index + 2) % BULLET3_NUM if weapon_level == 4: bullets = bullet4 bullets[bullet4_index].reset( (me.rect.centerx - 33, me.rect.centery)) bullets[bullet4_index + 1].reset( (me.rect.centerx + 30, me.rect.centery)) bullet4_index = (bullet4_index + 2) % BULLET4_NUM if weapon_level == 5: bullets = bullet5 bullets[bullet5_index].reset(me.rect.midtop) bullets[bullet5_index + 1].reset( (me.rect.centerx - 33, me.rect.centery)) bullets[bullet5_index + 2].reset( (me.rect.centerx + 30, me.rect.centery)) bullet5_index = (bullet5_index + 3) % BULLET5_NUM if weapon_level == 6: bullets = bullet6 bullets[bullet6_index].reset(me.rect.midtop) bullets[bullet6_index + 1].reset( (me.rect.centerx - 33, me.rect.centery)) bullets[bullet6_index + 2].reset( (me.rect.centerx + 30, me.rect.centery)) bullet6_index = (bullet6_index + 3) % BULLET6_NUM #检测是否击中敌机 for b in bullets: if b.active: b.move() screen.blit(b.image, b.rect) enemy_hit = pygame.sprite.spritecollide( b, enemies, False, pygame.sprite.collide_mask) if enemy_hit: b.active = False for e in enemy_hit: if e in mid_enemies or e in big_enemies: e.energy -= 1 if e.energy == 0: e.active = False else: e.active = False #绘制大型敌机 for each in big_enemies: if each.active: each.move() if switch_image: screen.blit(each.image1, each.rect) else: screen.blit(each.image2, each.rect) #绘制血条 pygame.draw.line(screen,BLACK,\ (each.rect.left,each.rect.top -5),\ (each.rect.right,each.rect.top -5),\ 2) #血量少于20%血条变红 energy_remain = each.energy / enemy.BigEnemy.energy if energy_remain > 0.2: energy_color = GREEN else: energy_color = RED pygame.draw.line(screen,energy_color,\ (each.rect.left,each.rect.top -5),\ (each.rect.left + each.rect.width * energy_remain,each.rect.top -5),\ 2) if each.rect.bottom == -50: enemy3_fly_sound.play(-1) else: #毁灭 if not (delay % 3): if e3_destroy_index == 0: enemy3_down_sound.play() screen.blit(each.destroy_images[e3_destroy_index], each.rect) e3_destroy_index = (e3_destroy_index + 1) % 6 if e3_destroy_index == 0: enemy3_fly_sound.stop() score += 20000 each.reset() #绘制中型敌机 for each in mid_enemies: if each.active: each.move() screen.blit(each.image, each.rect) # 绘制血条 pygame.draw.line(screen, BLACK, \ (each.rect.left, each.rect.top - 5), \ (each.rect.right, each.rect.top - 5), \ 2) # 血量少于20%血条变红 energy_remain = each.energy / enemy.MidEnemy.energy if energy_remain > 0.2: energy_color = GREEN else: energy_color = RED pygame.draw.line(screen, energy_color, \ (each.rect.left, each.rect.top - 5), \ (each.rect.left + each.rect.width * energy_remain, each.rect.top - 5), \ 2) else: # 毁灭 if not (delay % 3): if e2_destroy_index == 0: enemy2_down_sound.play() screen.blit(each.destroy_images[e2_destroy_index], each.rect) e2_destroy_index = (e2_destroy_index + 1) % 4 if e2_destroy_index == 0: score += 6000 each.reset() #绘制小型敌机 for each in small_enemies: if each.active: each.move() screen.blit(each.image, each.rect) else: # 毁灭 if not (delay % 3): if e1_destroy_index == 0: enemy1_down_sound.play() screen.blit(each.destroy_images[e1_destroy_index], each.rect) e1_destroy_index = (e1_destroy_index + 1) % 4 if e1_destroy_index == 0: score += 1000 each.reset() #检测我方飞机是否被撞 enemies_down = pygame.sprite.spritecollide( me, enemies, False, pygame.sprite.collide_mask) if enemies_down and not me.invincible: me.active = False for e in enemies_down: e.active = False #绘制我方飞机 if me.active: if switch_image: screen.blit(me.image1, me.rect) else: screen.blit(me.image2, me.rect) else: # 毁灭 if not (delay % 3): if e2_destroy_index == 0: me_down_sound.play() screen.blit(me.destroy_images[me_destroy_index], me.rect) me_destroy_index = (me_destroy_index + 1) % 4 if e2_destroy_index == 0: life_num -= 1 me.reset() pygame.time.set_timer(INVINCIBLE_TIME, 3 * 1000) #绘制炸弹数量 bomb_text = bomb_font.render("× %d" % bomb_num, True, WHITE) text_rect = bomb_text.get_rect() screen.blit(bomb_image, (10, height - 10 - bomb_rect.height)) screen.blit(bomb_text, (20 + bomb_rect.width, height - 5 - text_rect.height)) # 绘制得分 score_text = score_font.render("Score : %s" % str(score), True, WHITE) screen.blit(score_text, (10, 5)) #绘制生命数量 if life_num: for i in range(life_num): screen.blit(life_image,\ (width-10-(i+1)*life_rect.width,\ height-10-life_rect.height)) #绘制游戏结束画面 elif life_num == 0: #停止所有音效 pygame.mixer.music.stop() pygame.mixer.stop() #停止发放补给 pygame.time.set_timer(SUPPLY_TIME, 0) if not recorded: recorded = True #读取最高分 with open("record.txt", "r") as f: record_score = int(f.read()) #如果玩家得分超过最高分,存入新的最高分 if score > record_score: with open("record.txt", "w") as f: f.write(str(score)) # 绘制结束画面 record_score_text = score_font.render("Best : %d" % record_score, True, (255, 255, 255)) screen.blit(record_score_text, (50, 50)) gameover_text1 = gameover_font.render("Your Score", True, (255, 255, 255)) gameover_text1_rect = gameover_text1.get_rect() gameover_text1_rect.left, gameover_text1_rect.top = \ (width - gameover_text1_rect.width) // 2, height // 3 screen.blit(gameover_text1, gameover_text1_rect) gameover_text2 = gameover_font.render(str(score), True, (255, 255, 255)) gameover_text2_rect = gameover_text2.get_rect() gameover_text2_rect.left, gameover_text2_rect.top = \ (width - gameover_text2_rect.width) // 2, \ gameover_text1_rect.bottom + 10 screen.blit(gameover_text2, gameover_text2_rect) again_rect.left, again_rect.top = \ (width - again_rect.width) // 2, \ gameover_text2_rect.bottom + 50 screen.blit(again_image, again_rect) gameover_rect.left, gameover_rect.top = \ (width - again_rect.width) // 2, \ again_rect.bottom + 10 screen.blit(gameover_image, gameover_rect) # 检测用户的鼠标操作 # 如果用户按下鼠标左键 if pygame.mouse.get_pressed()[0]: # 获取鼠标坐标 pos = pygame.mouse.get_pos() # 如果用户点击“重新开始” if again_rect.left < pos[0] < again_rect.right and \ again_rect.top < pos[1] < again_rect.bottom: # 调用main函数,重新开始游戏 main() # 如果用户点击“结束游戏” elif gameover_rect.left < pos[0] < gameover_rect.right and \ gameover_rect.top < pos[1] < gameover_rect.bottom: # 退出游戏 pygame.quit() sys.exit() #绘制暂停按钮 screen.blit(paused_image, paused_rect) #切换图片延迟 if not (delay % 5): switch_image = not switch_image delay -= 1 if not delay: delay = 100 pygame.display.flip() clock.tick(60)
def main(): fight_music, welcome_music = True, True # pygame.mixer.music.load(welcome_musice_path) # pygame.mixer.music.play(-1) # pygame.mixer.music.play(-1) # welcome_sound.play(-1) # 游戏欢迎界面图标元素 startGame_image = pygame.image.load( "resources/image/startGame.png").convert_alpha() startGame_image_rect = startGame_image.get_rect() startGameChoose_image = pygame.image.load( "resources/image/startGameChoose.png").convert_alpha() startGameChoose_image_rect = startGameChoose_image.get_rect() start_image = startGame_image start_image_rect = start_image.get_rect() start_image_rect.left, start_image_rect.top = ( width - start_image_rect.width) // 2, height // 2 + 20 double_image = pygame.image.load( "resources/image/double.png").convert_alpha() double_image_rect = double_image.get_rect() doubleChoose_image = pygame.image.load( "resources/image/doubleChoose.png").convert_alpha() doubleChoose_image_rect = doubleChoose_image.get_rect() d_image = double_image d_image_rect = d_image.get_rect() d_image_rect.left, d_image_rect.top = ( width - d_image_rect.width) // 2, start_image_rect.bottom + 10 # 分数 score = 0 # 字体 score_font = pygame.font.Font("resources/font/MarkerFelt.ttf", 36) # 控制暂停 paused = False stop = False pause_nor_image = pygame.image.load( "resources/image/pause_nor.png").convert_alpha() pause_pressed_image = pygame.image.load( "resources/image/pause_pressed.png").convert_alpha() resume_nor_image = pygame.image.load( "resources/image/resume_nor.png").convert_alpha() resume_pressed_image = pygame.image.load( "resources/image/resume_pressed.png").convert_alpha() paused_rect = pause_nor_image.get_rect() paused_rect.left, paused_rect.top = width - paused_rect.width - 10, 10 paused_image = pause_nor_image # 设置难度级别 level = 1 #生成我方飞机 me1 = myplane.MyPlane(bg_size, "resources/image/player_blue.png", "resources/image/player_blue1.png", width // 4) me2 = myplane.MyPlane(bg_size, "resources/image/player_pink.png", "resources/image/player_pink1.png", width // 1.5) clock = pygame.time.Clock() # 生成我方飞机组,用于碰撞检测 myplanes = pygame.sprite.Group() myplanes.add(me1) #我方飞机无敌计时器 INVINCIBLE_TIME = USEREVENT + 2 #生成总敌方飞机组,用于碰撞检测 enemis = pygame.sprite.Group() #生成三种敌方飞机组,并新建各种敌机添加到组内 small_enemis = pygame.sprite.Group() add_small_enemis(small_enemis, enemis, 25) mid_enemis = pygame.sprite.Group() add_mid_enemis(mid_enemis, enemis, 5) big_enemis = pygame.sprite.Group() add_big_enemis(big_enemis, enemis, 2) BULLET1_NUM = 4 BULLET2_NUM = 8 #生成子弹 for i in range(BULLET1_NUM): me1.bullet1.append(bullet.Bullet1(me1.rect.midtop)) me2.bullet1.append(bullet.Bullet1(me2.rect.midtop)) #生成超级子弹 for i in range(BULLET2_NUM // 2): me1.bullet2.append( bullet.Bullet2((me1.rect.centerx - 33, me1.rect.centery))) me2.bullet2.append( bullet.Bullet2((me2.rect.centerx - 33, me2.rect.centery))) me1.bullet2.append( bullet.Bullet2((me1.rect.centerx + 30, me1.rect.centery))) me2.bullet2.append( bullet.Bullet2((me2.rect.centerx + 30, me2.rect.centery))) # 全屏炸弹 bomb_image = pygame.image.load("resources/image/bomb.png").convert_alpha() bomb_rect = bomb_image.get_rect() bomb_rect.left, bomb_rect.top = 10, height - bomb_rect.height - 10 bomb_num = 1 # 初始一个炸弹 bomb_font = pygame.font.Font("resources/font/MarkerFelt.ttf", 48) # 每30秒发放一个随机补给包 bullet_supply = supply.Bullet_Supply(bg_size) bomb_supply = supply.Bomb_Supply(bg_size) SUPPLY_TIME = USEREVENT pygame.time.set_timer(SUPPLY_TIME, 5 * 1000) #超级子弹定时器 DOUBLE_BULLET_TIME = USEREVENT + 1 #标志- 是否使用超级子弹 is_double_bullet = False # 备用飞机图标-生命值 life_image = pygame.image.load("resources/image/life.png").convert_alpha() life_image = pygame.transform.scale(life_image, (40, 40)) life_rect = life_image.get_rect() life_font = pygame.font.Font("resources/font/MarkerFelt.ttf", 40) # 图片索引 e1_destory_index = 0 e2_destory_index = 0 e3_destory_index = 0 me_destory_index = 0 #用于切换图片的flag switch_image = True #用于延迟 delay = 100 # 用于阻止重复打开记录文件 recorded = False # 游戏结束界面图标 gameover_img = pygame.image.load( "resources/image/gameover1.png").convert_alpha() gameover_rect = gameover_img.get_rect() # 游戏结束界面 gameover_font = pygame.font.Font("resources/font/MarkerFelt.ttf", 48) again_image = pygame.image.load( "resources/image/again.png").convert_alpha() again_rect = again_image.get_rect() return_image = pygame.image.load( "resources/image/return.png").convert_alpha() return_rect = return_image.get_rect() #游戏主体循环 running = True gamestart = False doublePlayer = False addPlayer = False stop_index = 0 while running: if not gamestart: if welcome_music: welcome_music = False fight_music = True pygame.mixer.init() pygame.mixer.music.load(welcome_musice_path) pygame.mixer.music.set_volume(0.2) pygame.mixer.music.play(-1) # 绘制游戏欢迎界面 screen.blit(startbg, (0, 0)) #单人或者双人选择 screen.blit(start_image, start_image_rect) screen.blit(d_image, d_image_rect) # 绘制'开始游戏' for event in pygame.event.get(): # 检测事件 if event.type == QUIT: pygame.quit() sys.exit() elif event.type == MOUSEMOTION: if start_image_rect.collidepoint(event.pos): start_image = startGameChoose_image else: start_image = startGame_image if d_image_rect.collidepoint(event.pos): d_image = doubleChoose_image else: d_image = double_image # 如果玩家按下左键 elif pygame.mouse.get_pressed()[0]: # 获取鼠标坐标 pos1 = pygame.mouse.get_pos() # 如果鼠标在“重新开始”上 if start_image_rect.left < pos1[0] < start_image_rect.right and \ start_image_rect.top < pos1[1] < start_image_rect.bottom: gamestart = True # 如果鼠标在“双人游戏”上 if d_image_rect.left < pos1[0] <d_image_rect.right and \ d_image_rect.top < pos1[1] <d_image_rect.bottom: doublePlayer = True addPlayer = True gamestart = True elif addPlayer: # 添加第二架我方飞机 add_myPlane(me2, myplanes) addPlayer = False elif gamestart: if fight_music: fight_music = False welcome_music = True pygame.mixer.init() pygame.mixer.music.load(fight_music_path) pygame.mixer.music.set_volume(0.2) pygame.mixer.music.play(-1) for event in pygame.event.get(): # 检测事件 if event.type == QUIT: pygame.quit() sys.exit() elif event.type == MOUSEBUTTONDOWN: # 鼠标按下 if event.button == 1 and paused_rect.collidepoint( event.pos): # 1代表左键,并且时间范围在paused_rect内 paused = not paused #取反 if paused: pygame.time.set_timer(SUPPLY_TIME, 0) pygame.mixer.music.pause() pygame.mixer.pause() else: pygame.mixer.music.unpause() pygame.mixer.unpause() elif event.type == MOUSEMOTION: if paused_rect.collidepoint(event.pos): if paused: paused_image = resume_pressed_image else: paused_image = pause_pressed_image else: if paused: paused_image = resume_nor_image else: paused_image = pause_nor_image elif event.type == KEYDOWN: if event.key == K_SPACE: if bomb_num > 0: bomb_num -= 1 for each in enemis: if each.rect.bottom > 0: # 屏幕内的所有敌机炸毁 each.active = False elif event.type == SUPPLY_TIME: if choice([True, False]): bomb_supply.reset() else: bullet_supply.reset() elif event.type == DOUBLE_BULLET_TIME: is_double_bullet = False pygame.time.set_timer(DOUBLE_BULLET_TIME, 0) elif event.type == INVINCIBLE_TIME: for each in myplanes: # 计时器时间结束 each.invincible = False pygame.time.set_timer(INVINCIBLE_TIME, 0) #绘制屏幕 screen.blit(background, (0, 0)) # 根据用户得分增加难度 if level == 1 and score > 50000: level_up_sound.play() level = 2 # 增加3架小飞机,2架中型飞机,1架大型飞机 add_small_enemis(small_enemis, enemis, 3) add_mid_enemis(mid_enemis, enemis, 2) add_big_enemis(big_enemis, enemis, 1) # 提升敌机的速度 inc_speed(small_enemis, 1) elif level == 2 and score > 300000: level_up_sound.play() level = 3 # 增加4架小飞机,增加3架中型飞机,增加2个大型敌机 add_small_enemis(small_enemis, enemis, 3) add_mid_enemis(mid_enemis, enemis, 3) add_big_enemis(big_enemis, enemis, 1) inc_speed(mid_enemis, 1) elif level == 3 and score > 600000: level_up_sound.play() level = 4 # 增加4架小飞机,增加4架中型飞机,增加1个大型敌机 add_small_enemis(small_enemis, enemis, 3) add_mid_enemis(mid_enemis, enemis, 2) add_big_enemis(big_enemis, enemis, 1) inc_speed(mid_enemis, 1) inc_speed(big_enemis, 1) elif level == 4 and score > 1200000: level_up_sound.play() level = 5 # 增加4架小飞机,增加5架中型飞机,增加1个大型敌机 add_small_enemis(small_enemis, enemis, 3) add_mid_enemis(mid_enemis, enemis, 2) add_big_enemis(big_enemis, enemis, 1) inc_speed(mid_enemis, 1) inc_speed(big_enemis, 1) elif level == 5 and score > 2400000: level_up_sound.play() # 增加6架小飞机,增加6架中型飞机,增加5个大型敌机 add_small_enemis(small_enemis, enemis, 6) add_mid_enemis(mid_enemis, enemis, 6) add_big_enemis(big_enemis, enemis, 1) inc_speed(small_enemis, 1) inc_speed(mid_enemis, 1) inc_speed(big_enemis, 1) if (not doublePlayer and me1.energy and not paused) or (doublePlayer and (me1.energy or me2.energy) and not paused): # 检测用户键盘操作 key_pressed = pygame.key.get_pressed() if key_pressed[K_UP]: me1.moveUp() if key_pressed[K_DOWN]: me1.moveDown() if key_pressed[K_LEFT]: me1.moveLeft() if key_pressed[K_RIGHT]: me1.moveRight() if doublePlayer: if key_pressed[K_w]: me2.moveUp() if key_pressed[K_s]: me2.moveDown() if key_pressed[K_a]: me2.moveLeft() if key_pressed[K_d]: me2.moveRight() # 绘制全屏炸弹补给并检测能否获得 if bomb_supply.active: bomb_supply.move() screen.blit(bomb_supply.image, bomb_supply.rect) if pygame.sprite.spritecollide(bomb_supply, myplanes, False): if bomb_num < 3: bomb_num += 1 bomb_supply.active = False # 绘制强化攻击补给并检测能否获得 if bullet_supply.active: bullet_supply.move() screen.blit(bullet_supply.image, bullet_supply.rect) if pygame.sprite.spritecollide(bullet_supply, myplanes, False): # 发射超级子弹 is_double_bullet = True pygame.time.set_timer(DOUBLE_BULLET_TIME, 18 * 1000) bullet_supply.active = False # 装填子弹 if delay % 10 == 0: bullet_sound.play() if is_double_bullet: me1.bullets = me1.bullet2 me1.bullets[me1.bullet2_index].reset( (me1.rect.centerx - 33, me1.rect.centery)) me1.bullets[me1.bullet2_index + 1].reset( (me1.rect.centerx + 30, me1.rect.centery)) me1.bullet2_index = (me1.bullet2_index + 2) % BULLET2_NUM if doublePlayer: me2.bullets = me2.bullet2 me2.bullets[me2.bullet2_index].reset( (me2.rect.centerx - 33, me2.rect.centery)) me2.bullets[me2.bullet2_index + 1].reset( (me2.rect.centerx + 30, me2.rect.centery)) me2.bullet2_index = (me2.bullet2_index + 2) % BULLET2_NUM else: me1.bullets = me1.bullet1 me1.bullets[me1.bullet1_index].reset(me1.rect.midtop) me1.bullet1_index = (me1.bullet1_index + 1) % BULLET1_NUM if doublePlayer: me2.bullets = me2.bullet1 me2.bullets[me2.bullet1_index].reset( me2.rect.midtop) me2.bullet1_index = (me2.bullet1_index + 1) % BULLET1_NUM # 发射子弹+检测子弹是否击中敌机 for each in myplanes: for b in each.bullets: if b.active: b.move() screen.blit(b.image, b.rect) enemy_hit = pygame.sprite.spritecollide( b, enemis, False, pygame.sprite.collide_mask) if enemy_hit: b.active = False for e in enemy_hit: if e in mid_enemis or e in big_enemis: e.hit = True e.energy -= 1 if e.energy == 0: e.active = False else: e.active = False # 检测我方飞机是否发生碰撞 for each in myplanes: enemis_down = pygame.sprite.spritecollide( each, enemis, False, pygame.sprite.collide_mask) if enemis_down and not each.invincible: each.active = False for e in enemis_down: e.active = False #绘制我方飞机 for me in myplanes: if me.active: if switch_image: screen.blit(me.image1, me.rect) else: screen.blit(me.image2, me.rect) else: # 毁灭 if delay % 3 == 0: if me_destory_index == 0: me_down_sound.play() screen.blit(me.destory_images[me_destory_index], me.rect) me_destory_index = (me_destory_index + 1) % 4 if me_destory_index == 0: if me.energy > 0: me.energy -= 1 me.reset() pygame.time.set_timer( INVINCIBLE_TIME, 1 * 1000) if me.energy <= 0: myplanes.remove(me) # 绘制全屏炸弹 screen.blit(bomb_image, bomb_rect) bomb_text = bomb_font.render("x %d" % bomb_num, True, WHITE) text_rect = bomb_text.get_rect() screen.blit( bomb_text, (20 + bomb_rect.width, height - 5 - text_rect.height)) # 绘制生命值图标 if me1.energy: life_text = score_font.render("1P", True, WHITE) screen.blit(life_text, (width - life_rect.width * 4, height - life_rect.height - 10)) for i in range(me1.energy): screen.blit(life_image, (5 + width - life_rect.width * (i + 1), height - life_rect.height - 10)) if doublePlayer: if me2.energy: life2_text = score_font.render("2P", True, WHITE) screen.blit(life2_text, (width - life_rect.width * 4, height - life_rect.height * 2 - 10)) for i in range(me2.energy): screen.blit(life_image, (5 + width - life_rect.width * (i + 1), height - life_rect.height * 2 - 10)) # 绘制大飞机 for each in big_enemis: if each.active: each.move() # 即将出现在画面中,给个牌面 if each.rect.bottom == -20: enemy3_fly_sound.play(-1) if each.hit: screen.blit(each.image_hit, each.rect) each.hit = False else: if switch_image: screen.blit(each.image1, each.rect) else: screen.blit(each.image2, each.rect) # 绘制血条 pygame.draw.line(screen, BLACK, (each.rect.left, each.rect.top - 5), (each.rect.right, each.rect.top - 5), 2) # 当生命值大于20%显示绿色,否则红色 energy_remain = each.energy / enemy.BigEnemy.energy if energy_remain > 0.2: energy_color = GREEN else: energy_color = RED pygame.draw.line( screen, energy_color, (each.rect.left, each.rect.top - 5), (each.rect.left + each.rect.width * energy_remain, each.rect.top - 5), 2) else: # 毁灭 if delay % 3 == 0: if e3_destory_index == 0: enemy3_down_sound.play() screen.blit(each.destory_images[e3_destory_index], each.rect) e3_destory_index = (e3_destory_index + 1) % 6 if e3_destory_index == 0: score += 10000 enemy3_fly_sound.stop() each.reset() # 绘制中飞机 for each in mid_enemis: if each.active: each.move() if each.hit: screen.blit(each.image_hit, each.rect) each.hit = False else: screen.blit(each.image, each.rect) # 绘制血条 pygame.draw.line(screen, BLACK, (each.rect.left, each.rect.top - 5), (each.rect.right, each.rect.top - 5), 2) # 当生命值大于20%显示绿色,否则红色 energy_remain = each.energy / enemy.MidEnemy.energy if energy_remain > 0.2: energy_color = GREEN else: energy_color = RED pygame.draw.line( screen, energy_color, (each.rect.left, each.rect.top - 5), (each.rect.left + each.rect.width * energy_remain, each.rect.top - 5), 2) else: #毁灭 if delay % 3 == 0: if e2_destory_index == 0: enemy2_down_sound.play() screen.blit(each.destory_images[e2_destory_index], each.rect) e2_destory_index = (e2_destory_index + 1) % 4 if e2_destory_index == 0: score += 6000 each.reset() # 绘制小飞机 for each in small_enemis: if each.active: each.move() screen.blit(each.image, each.rect) else: # 毁灭 if e1_destory_index == 0: enemy1_down_sound.play() if delay % 3 == 0: screen.blit(each.destory_images[e1_destory_index], each.rect) e1_destory_index = (e1_destory_index + 1) % 4 if e1_destory_index == 0: score += 1000 each.reset() # 分数 score_text = score_font.render( "Score : {0}".format(str(score)), True, WHITE) screen.blit(score_text, (10, 5)) # 玩家死亡 elif (not doublePlayer and not me1.energy) or (not me1.energy and not me2.energy): # 背景音乐停止 pygame.mixer.music.stop() # 停止全部音效 pygame.mixer.stop() # 停止发放补给 pygame.time.set_timer(SUPPLY_TIME, 0) # 判断是否将分数记录在记录文件中 if not recorded: recorded = True # 读取历史最高得分 with open("maxScore.txt", "r") as f: stream = f.read() if stream == '': stream = f.read() + '0' record_score = int(stream) # 如果玩家得分大于历史最高分,则存档 if score > record_score: with open("maxScore.txt", "w") as f: f.write(str(score)) # 绘制游戏结束界面 screen.blit(gameover_img, (0, 0)) record_score_text = score_font.render( "Best Score : {0}".format(record_score), True, (0, 0, 255)) screen.blit(record_score_text, (20, 10)) # 在屏幕中央绘制'你的分数' your_score_text = gameover_font.render("Your Score", True, WHITE) your_score_text_rect = your_score_text.get_rect() your_score_text_rect.left,your_score_text_rect.top = (width - your_score_text_rect.width)//2,\ height//2-your_score_text_rect.height-40 screen.blit(your_score_text, your_score_text_rect) # 在'你的分数'下方绘制本局分数 gameover_text = gameover_font.render(str(score), True, WHITE) gameover_text_rect = gameover_text.get_rect() gameover_text_rect.left,gameover_text_rect.top = (width-gameover_text_rect.width)//2,\ your_score_text_rect.bottom + 50 screen.blit(gameover_text, gameover_text_rect) # 绘制重新开始按钮图标 again_rect.left,again_rect.top = (width-again_rect.width)//2,\ gameover_text_rect.bottom+50 screen.blit(again_image, again_rect) # 绘制退出游戏按钮图标 return_rect.left, return_rect.top = (width - return_rect.width) // 2, \ again_rect.bottom + 50 screen.blit(return_image, return_rect) # 检测用户的鼠标操作 # 如果按下左键 if pygame.mouse.get_pressed()[0]: # 获取鼠标坐标 pos = pygame.mouse.get_pos() #如果鼠标在“重新开始”上 if again_rect.left < pos[ 0] < again_rect.right and again_rect.top < pos[ 1] < again_rect.bottom: # 调用main函数重新开始游戏 main() elif return_rect.left < pos[ 0] < return_rect.right and return_rect.top < pos[ 1] < return_rect.bottom: # 退出游戏 pygame.quit() sys.exit() if (not doublePlayer and me1.energy) or (doublePlayer and (me1.energy or me2.energy)): # 绘制暂停按钮 screen.blit(paused_image, paused_rect) #设定延迟 if delay % 5 == 0: switch_image = not switch_image delay -= 1 if delay == 0: delay = 100 pygame.display.flip() clock.tick(60)
def main(): # 创建背景图片对象 position = 0, height buss = [] background = background_1.Screen(position, bg_size) # background = background_1.Ground(bg_size) buss.append(background) my_dist = 1 # 播放背景音乐 pygame.mixer.music.play(-1) # 生成我方飞机 me = myplane.MyPlane(bg_size) enemies = pygame.sprite.Group() # 生成敌方小型飞机 small_enemies = pygame.sprite.Group() add_small_enemies(small_enemies, enemies, 15) # 生成敌方中型飞机 mid_enemies = pygame.sprite.Group() add_mid_enemies(mid_enemies, enemies, 4) # 生成敌方大型飞机 big_enemies = pygame.sprite.Group() add_big_enemies(big_enemies, enemies, 2) # 生成普通子弹 bullet1 = [] bullet1_index = 0 BULLET1_NUM = 100 for i in range(BULLET1_NUM): bullet1.append(bullet.Bullet1(me.rect.midtop)) # 生成超级子弹 bullet2 = [] bullet2_index = 0 BULLET2_NUM = 200 for i in range(BULLET2_NUM // 2): bullet2.append(bullet.Bullet2((me.rect.centerx - 33, me.rect.centery))) bullet2.append(bullet.Bullet2((me.rect.centerx + 30, me.rect.centery))) clock = pygame.time.Clock() # 中弹图片索引 e1_destroy_index = 0 e2_destroy_index = 0 e3_destroy_index = 0 me_destroy_index = 0 # 统计得分 score = 0 score_font = pygame.font.SysFont("arial", 30) # 标志是否暂停游戏 paused = False pause_nor_image = pygame.image.load("images/pause_nor.png").convert_alpha() pause_pressed_image = pygame.image.load( "images/pause_pressed.png").convert_alpha() resume_nor_image = pygame.image.load( "images/resume_nor.png").convert_alpha() resume_pressed_image = pygame.image.load( "images/resume_pressed.png").convert_alpha() paused_rect = pause_nor_image.get_rect() paused_rect.left, paused_rect.top = width - paused_rect.width - 10, 10 paused_image = pause_nor_image # 设置难度级别 level = 1 # 全屏炸弹 bomb_image = pygame.image.load("images/bomb.png").convert_alpha() bomb_rect = bomb_image.get_rect() bomb_font = pygame.font.SysFont("arial", 35) bomb_num = 3 # 每30秒发放一个补给包 bullet_supply = supply.Bullet_Supply(bg_size) bomb_supply = supply.Bomb_Supply(bg_size) SUPPLY_TIME = USEREVENT pygame.time.set_timer(SUPPLY_TIME, 30 * 1000) # 超级子弹定时器 DOUBLE_BULLET_TIME = USEREVENT + 1 # 标志是否使用超级子弹 is_double_bullet = False # 解除我方无敌状态定时器 INVINCIBLE_TIME = USEREVENT + 2 # 生命数量 life_image = pygame.image.load("images/life.png").convert_alpha() life_rect = life_image.get_rect() life_num = 3 # 用于阻止重复打开记录文件 recorded = False # 游戏结束画面 gameover_font = pygame.font.SysFont("arial", 35) again_image = pygame.image.load("images/again.png").convert_alpha() again_rect = again_image.get_rect() gameover_image = pygame.image.load("images/gameover.png").convert_alpha() gameover_rect = gameover_image.get_rect() # 用于切换图片 switch_image = True # 用于延迟 delay = 100 running = True while running: s = delay for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() elif event.type == MOUSEBUTTONDOWN: if event.button == 1 and paused_rect.collidepoint(event.pos): paused = not paused if paused: pygame.time.set_timer(SUPPLY_TIME, 0) pygame.mixer.music.pause() pygame.mixer.pause() else: pygame.time.set_timer(SUPPLY_TIME, 30 * 1000) pygame.mixer.music.unpause() pygame.mixer.unpause() elif event.type == MOUSEMOTION: if paused_rect.collidepoint(event.pos): if paused: paused_image = resume_pressed_image else: paused_image = pause_pressed_image else: if paused: paused_image = resume_nor_image else: paused_image = pause_nor_image # 全屏炸弹 elif event.type == KEYDOWN: if event.key == K_SPACE: if bomb_num: bomb_num -= 1 move_hz = 0 bomb_sound.play() hongzha = Bomber.HongZha(screen) while move_hz <= 100: for each in buss: screen.blit(each.image, each.rect) for each in enemies: screen.blit(each.image, each.rect) screen.blit(me.image, me.rect) # 显示轰炸机 hongzha.move(move_hz) # 轰炸机的移动 hongzha.display() pygame.display.update() # time.sleep(0.05) move_hz += 1 for each in enemies: if each.rect.bottom > 0: each.active = False elif event.type == SUPPLY_TIME: supply_sound.play() if choice([True, False]): bomb_supply.reset() else: bullet_supply.reset() elif event.type == DOUBLE_BULLET_TIME: is_double_bullet = False pygame.time.set_timer(DOUBLE_BULLET_TIME, 0) elif event.type == INVINCIBLE_TIME: me.invincible = False pygame.time.set_timer(INVINCIBLE_TIME, 0) # 绘制背景 for each in buss: each.move() if each.rect.top > height: buss.remove(each) each.action = False if my_dist < 10: screen.blit(each.image, each.rect) if 10 < my_dist < 20: screen.blit(each.image, each.rect) if 20 < my_dist < 30: screen.blit(each.image, each.rect) if 30 < my_dist < 40: screen.blit(each.image, each.rect) if 40 < my_dist < 50: screen.blit(each.image, each.rect) if 50 < my_dist < 60: screen.blit(each.image, each.rect) if 160 < my_dist < 70: screen.blit(each.image, each.rect) if each.action: position = each.rect.left, each.rect.top speed_test = [0, 1] background = background_1.Screen(position, bg_size) buss.append(background) # **************************************************************** # 根据用户的得分增加难度 if level == 1 and score >= 50000: level = 2 upgrade_sound.play() # 增加3架小型敌机、2架中型敌机和1架大型敌机 add_small_enemies(small_enemies, enemies, 3) add_mid_enemies(mid_enemies, enemies, 2) add_big_enemies(big_enemies, enemies, 1) # 提升小型敌机的速度 inc_speed(small_enemies, 1) elif level == 2 and score >= 300000: level = 3 upgrade_sound.play() # 增加5架小型敌机、3架中型敌机和2架大型敌机 add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 3) add_big_enemies(big_enemies, enemies, 2) # 提升小型敌机的速度 inc_speed(small_enemies, 1) inc_speed(mid_enemies, 1) elif level == 3 and score >= 600000: level = 4 upgrade_sound.play() # 增加5架小型敌机、3架中型敌机和2架大型敌机 add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 3) add_big_enemies(big_enemies, enemies, 2) # 提升小型敌机的速度 inc_speed(small_enemies, 1) inc_speed(mid_enemies, 1) elif level == 4 and score >= 1000000: level = 5 upgrade_sound.play() # 增加5架小型敌机、3架中型敌机和2架大型敌机 add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 3) add_big_enemies(big_enemies, enemies, 2) # 提升小型敌机的速度 inc_speed(small_enemies, 1) inc_speed(mid_enemies, 1) # screen.blit(background, (0, 0)) if life_num and not paused: # 检测用户的键盘操作 key_pressed = pygame.key.get_pressed() if key_pressed[K_w] or key_pressed[K_UP]: me.moveUp() if key_pressed[K_s] or key_pressed[K_DOWN]: me.moveDown() if key_pressed[K_a] or key_pressed[K_LEFT]: me.moveLeft() if key_pressed[K_d] or key_pressed[K_RIGHT]: me.moveRight() # 绘制全屏炸弹补给并检测是否获得 if bomb_supply.active: bomb_supply.move() screen.blit(bomb_supply.image, bomb_supply.rect) if pygame.sprite.collide_mask(bomb_supply, me): get_bomb_sound.play() if bomb_num < 3: bomb_num += 1 bomb_supply.active = False # 绘制超级子弹补给并检测是否获得 if bullet_supply.active: bullet_supply.move() screen.blit(bullet_supply.image, bullet_supply.rect) if pygame.sprite.collide_mask(bullet_supply, me): get_bullet_sound.play() is_double_bullet = True pygame.time.set_timer(DOUBLE_BULLET_TIME, 18 * 1000) bullet_supply.active = False s = s * level if level == 3: if not((s + 2) % 10): s += 2 if not((s + 1) % 10): s += 1 if level == 4: if s % 10 != 0: s += 2 # 发射子弹 if not(s % 10): # bullet_sound.play() if is_double_bullet: bullets = bullet2 bullets[bullet2_index].reset( (me.rect.centerx - 105, me.rect.centery - 20)) bullets[bullet2_index + 1].reset((me.rect.centerx - 15, me.rect.centery - 20)) bullet2_index = (bullet2_index + 2) % BULLET2_NUM else: bullets = bullet1 bullets[bullet1_index].reset( (me.rect.midtop[0] - 17, me.rect.midtop[1])) bullet1_index = (bullet1_index + 1) % BULLET1_NUM # 检测子弹是否击中敌机 for b in bullets: if b.active: b.move() screen.blit(b.image, b.rect) enemy_hit = pygame.sprite.spritecollide( b, enemies, False, pygame.sprite.collide_mask) if enemy_hit: b.active = False for e in enemy_hit: if e in mid_enemies or e in big_enemies: e.hit = True e.energy -= 1 if e.energy == 0: e.active = False else: e.active = False # 绘制大型敌机 for each in big_enemies: if each.active: each.move() # screen.blit(each.image, each.rect) if each.hit: screen.blit(each.image_hit, each.rect) each.hit = False else: if switch_image: screen.blit(each.image, each.rect) else: screen.blit(each.image1, each.rect) # 绘制血槽 pygame.draw.line(screen, BLACK, (each.rect.left, each.rect.top - 5), (each.rect.right, each.rect.top - 5), 2) # 当生命大于20%显示绿色,否则显示红色 energy_remain = each.energy / enemy.BigEnemy.energy if energy_remain > 0.2: energy_color = GREEN else: energy_color = RED pygame.draw.line(screen, energy_color, (each.rect.left, each.rect.top - 5), (each.rect.left + each.rect.width * energy_remain, each.rect.top - 5), 2) # 即将出现在画面中,播放音效 if each.rect.bottom == -50: enemy3_fly_sound.play(-1) else: # 毁灭 if not(delay % 3): if e3_destroy_index == 0: enemy3_down_sound.play() screen.blit(each.destroy_images[ e3_destroy_index], each.rect) e3_destroy_index = (e3_destroy_index + 1) % 6 if e3_destroy_index == 0: enemy3_fly_sound.stop() score += 10000 each.reset() # 绘制中型敌机: for each in mid_enemies: if each.active: each.move() screen.blit(each.image, each.rect) if each.hit: screen.blit(each.image_hit, each.rect) each.hit = False else: screen.blit(each.image, each.rect) # 绘制血槽 pygame.draw.line(screen, BLACK, (each.rect.left, each.rect.top - 5), (each.rect.right, each.rect.top - 5), 2) # 当生命大于20%显示绿色,否则显示红色 energy_remain = each.energy / enemy.MidEnemy.energy if energy_remain > 0.2: energy_color = GREEN else: energy_color = RED pygame.draw.line(screen, energy_color, (each.rect.left, each.rect.top - 5), (each.rect.left + each.rect.width * energy_remain, each.rect.top - 5), 2) else: # 毁灭 if not(delay % 3): if e2_destroy_index == 0: enemy2_down_sound.play() screen.blit(each.destroy_images[ e2_destroy_index], each.rect) e2_destroy_index = (e2_destroy_index + 1) % 4 if e2_destroy_index == 0: score += 6000 each.reset() # 绘制小型敌机: for each in small_enemies: if each.active: each.move() screen.blit(each.image, each.rect) else: # 毁灭 if not(delay % 3): if e1_destroy_index == 0: enemy1_down_sound.play() screen.blit(each.destroy_images[ e1_destroy_index], each.rect) e1_destroy_index = (e1_destroy_index + 1) % 4 if e1_destroy_index == 0: score += 10000 each.reset() # 检测我方飞机是否被撞 enemies_down = pygame.sprite.spritecollide( me, enemies, False, pygame.sprite.collide_mask) if enemies_down and not me.invincible: me.active = False for e in enemies_down: e.active = False # 绘制我方飞机 if me.active: if switch_image: screen.blit(me.image, me.rect) else: screen.blit(me.image1, me.rect) else: # 毁灭 if not(delay % 3): if me_destroy_index == 0: me_down_sound.play() screen.blit(me.destroy_images[me_destroy_index], me.rect) me_destroy_index = (me_destroy_index + 1) % 4 if me_destroy_index == 0: life_num -= 1 bomb_num = 3 me.reset() pygame.time.set_timer(INVINCIBLE_TIME, 3 * 1000) # 绘制全屏炸弹数量 bomb_text = bomb_font.render("× %d" % bomb_num, True, WHITE) text_rect = bomb_text.get_rect() screen.blit(bomb_image, (10, height - 10 - bomb_rect.height)) screen.blit(bomb_text, (20 + bomb_rect.width, height - 5 - text_rect.height)) # 绘制剩余生命数量 if life_num: for i in range(life_num): screen.blit(life_image, (width - 10 - (i + 1) * life_rect.width, height - 10 - life_rect.height)) # 绘制得分 score_text = score_font.render( "Score : %s" % str(score), True, WHITE) screen.blit(score_text, (10, 5)) # 绘制游戏结束画面 elif life_num == 0: # 背景音乐停止 pygame.mixer.music.stop() # 停止全部音效 pygame.mixer.stop() bomb_num = 0 # 停止发放补给 pygame.time.set_timer(SUPPLY_TIME, 0) if not recorded: recorded = True # 读取历史最高得分 with open("record.txt", "r") as f: record_score = int(f.read()) # 如果玩家得分高于历史最高得分,则存档 if score > record_score: with open("record.txt", "w") as f: f.write(str(score)) # 绘制结束画面 record_score_text = score_font.render( "Best : %d" % record_score, True, (255, 255, 255)) screen.blit(record_score_text, (50, 50)) gameover_text1 = gameover_font.render( "Your Score", True, (255, 255, 255)) gameover_text1_rect = gameover_text1.get_rect() gameover_text1_rect.left, gameover_text1_rect.top = \ (width - gameover_text1_rect.width) // 2, height // 3 screen.blit(gameover_text1, gameover_text1_rect) gameover_text2 = gameover_font.render( str(score), True, (255, 255, 255)) gameover_text2_rect = gameover_text2.get_rect() gameover_text2_rect.left, gameover_text2_rect.top = \ (width - gameover_text2_rect.width) // 2, \ gameover_text1_rect.bottom + 10 screen.blit(gameover_text2, gameover_text2_rect) again_rect.left, again_rect.top = \ (width - again_rect.width) // 2, \ gameover_text2_rect.bottom + 50 screen.blit(again_image, again_rect) gameover_rect.left, gameover_rect.top = \ (width - again_rect.width) // 2, \ again_rect.bottom + 10 screen.blit(gameover_image, gameover_rect) # 检测用户的鼠标操作 # 如果用户按下鼠标左键 if pygame.mouse.get_pressed()[0]: # 获取鼠标坐标 pos = pygame.mouse.get_pos() # 如果用户点击“重新开始” if again_rect.left < pos[0] < again_rect.right and \ again_rect.top < pos[1] < again_rect.bottom: # 调用main函数,重新开始游戏 main() # 如果用户点击“结束游戏” elif gameover_rect.left < pos[0] < gameover_rect.right and \ gameover_rect.top < pos[1] < gameover_rect.bottom: # 退出游戏 pygame.quit() sys.exit() # 绘制暂停按钮 screen.blit(paused_image, paused_rect) # 切换图片 if not(delay % 5): switch_image = not switch_image delay -= 1 if not delay: delay = 100 pygame.display.flip() clock.tick(60)
def main(): pygame.mixer.music.play(-1) # �����ҷ��ɻ� me = myplane.MyPlane(bg_size) enemies = pygame.sprite.Group() # ���ɵз�С�ͷɻ� small_enemies = pygame.sprite.Group() add_small_enemies(small_enemies, enemies, 15) # ���ɵз����ͷɻ� mid_enemies = pygame.sprite.Group() add_mid_enemies(mid_enemies, enemies, 4) # ���ɵз����ͷɻ� big_enemies = pygame.sprite.Group() add_big_enemies(big_enemies, enemies, 2) # ������ͨ�ӵ� bullet1 = [] bullet1_index = 0 BULLET1_NUM = 4 for i in range(BULLET1_NUM): bullet1.append(bullet.Bullet1(me.rect.midtop)) # ���ɳ����ӵ� bullet2 = [] bullet2_index = 0 BULLET2_NUM = 8 for i in range(BULLET2_NUM // 2): bullet2.append(bullet.Bullet2((me.rect.centerx - 33, me.rect.centery))) bullet2.append(bullet.Bullet2((me.rect.centerx + 30, me.rect.centery))) clock = pygame.time.Clock() # �е�ͼƬ���� e1_destroy_index = 0 e2_destroy_index = 0 e3_destroy_index = 0 me_destroy_index = 0 # ͳ�Ƶ÷� score = 0 score_font = pygame.font.Font("font/font.ttf", 36) # ��־�Ƿ���ͣ��Ϸ paused = False pause_nor_image = pygame.image.load("images/pause_nor.png").convert_alpha() pause_pressed_image = pygame.image.load("images/pause_pressed.png").convert_alpha() resume_nor_image = pygame.image.load("images/resume_nor.png").convert_alpha() resume_pressed_image = pygame.image.load("images/resume_pressed.png").convert_alpha() paused_rect = pause_nor_image.get_rect() paused_rect.left, paused_rect.top = width - paused_rect.width - 10, 10 paused_image = pause_nor_image # �����Ѷȼ��� level = 1 # ȫ��ը�� bomb_image = pygame.image.load("images/bomb.png").convert_alpha() bomb_rect = bomb_image.get_rect() bomb_font = pygame.font.Font("font/font.ttf", 48) bomb_num = 3 # ÿ30�뷢��һ�������� bullet_supply = supply.Bullet_Supply(bg_size) bomb_supply = supply.Bomb_Supply(bg_size) SUPPLY_TIME = USEREVENT pygame.time.set_timer(SUPPLY_TIME, 30 * 1000) # �����ӵ���ʱ�� DOUBLE_BULLET_TIME = USEREVENT + 1 # ��־�Ƿ�ʹ�ó����ӵ� is_double_bullet = False # ����ҷ���״̬��ʱ�� INVINCIBLE_TIME = USEREVENT + 2 # �������� life_image = pygame.image.load("images/life.png").convert_alpha() life_rect = life_image.get_rect() life_num = 5 # ������ֹ�ظ���¼�ļ� recorded = False # ��Ϸ�������� gameover_font = pygame.font.Font("font/font.TTF", 48) again_image = pygame.image.load("images/again.png").convert_alpha() again_rect = again_image.get_rect() gameover_image = pygame.image.load("images/gameover.png").convert_alpha() gameover_rect = gameover_image.get_rect() # �����л�ͼƬ switch_image = True # �����ӳ� delay = 100 running = True while running: for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() elif event.type == MOUSEBUTTONDOWN: if event.button == 1 and paused_rect.collidepoint(event.pos): paused = not paused if paused: pygame.time.set_timer(SUPPLY_TIME, 0) pygame.mixer.music.pause() pygame.mixer.pause() else: pygame.time.set_timer(SUPPLY_TIME, 30 * 1000) pygame.mixer.music.unpause() pygame.mixer.unpause() elif event.type == MOUSEMOTION: if paused_rect.collidepoint(event.pos): if paused: paused_image = resume_pressed_image else: paused_image = pause_pressed_image else: if paused: paused_image = resume_nor_image else: paused_image = pause_nor_image elif event.type == KEYDOWN: if event.key == K_SPACE: if bomb_num: bomb_num -= 1 bomb_sound.play() for each in enemies: if each.rect.bottom > 0: each.active = False elif event.type == SUPPLY_TIME: supply_sound.play() if choice([True, False]): bomb_supply.reset() else: bullet_supply.reset() elif event.type == DOUBLE_BULLET_TIME: is_double_bullet = False pygame.time.set_timer(DOUBLE_BULLET_TIME, 0) elif event.type == INVINCIBLE_TIME: me.invincible = False pygame.time.set_timer(INVINCIBLE_TIME, 0) # �����û��ĵ÷������Ѷ� if level == 1 and score > 10000: level = 2 upgrade_sound.play() # ����3��С�͵л���2�����͵л���1�ܴ��͵л� add_small_enemies(small_enemies, enemies, 3) add_mid_enemies(mid_enemies, enemies, 2) add_big_enemies(big_enemies, enemies, 1) # ����С�͵л����ٶ� inc_speed(small_enemies, 1) elif level == 2 and score > 50000: level = 3 upgrade_sound.play() # ����5��С�͵л���3�����͵л���2�ܴ��͵л� add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 3) add_big_enemies(big_enemies, enemies, 2) # ����С�͵л����ٶ� inc_speed(small_enemies, 1) inc_speed(mid_enemies, 1) elif level == 3 and score > 200000: level = 4 upgrade_sound.play() # ����5��С�͵л���3�����͵л���2�ܴ��͵л� add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 3) add_big_enemies(big_enemies, enemies, 2) # ����С�͵л����ٶ� inc_speed(small_enemies, 1) inc_speed(mid_enemies, 1) elif level == 4 and score > 500000: level = 5 upgrade_sound.play() # ����5��С�͵л���3�����͵л���2�ܴ��͵л� add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 3) add_big_enemies(big_enemies, enemies, 2) # ����С�͵л����ٶ� inc_speed(small_enemies, 1) inc_speed(mid_enemies, 1) screen.blit(background, (0, 0)) if life_num and not paused: # ����û��ļ��̲��� key_pressed = pygame.key.get_pressed() if key_pressed[K_w] or key_pressed[K_UP]: me.moveUp() if key_pressed[K_s] or key_pressed[K_DOWN]: me.moveDown() if key_pressed[K_a] or key_pressed[K_LEFT]: me.moveLeft() if key_pressed[K_d] or key_pressed[K_RIGHT]: me.moveRight() # ����ȫ��ը������������Ƿ��� if bomb_supply.active: bomb_supply.move() screen.blit(bomb_supply.image, bomb_supply.rect) if pygame.sprite.collide_mask(bomb_supply, me): get_bomb_sound.play() if bomb_num < 3: bomb_num += 1 bomb_supply.active = False # ���Ƴ����ӵ�����������Ƿ��� if bullet_supply.active: bullet_supply.move() screen.blit(bullet_supply.image, bullet_supply.rect) if pygame.sprite.collide_mask(bullet_supply, me): get_bullet_sound.play() is_double_bullet = True pygame.time.set_timer(DOUBLE_BULLET_TIME, 18 * 1000) bullet_supply.active = False # �����ӵ� if not (delay % 10): bullet_sound.play() if is_double_bullet: bullets = bullet2 bullets[bullet2_index].reset((me.rect.centerx - 33, me.rect.centery)) bullets[bullet2_index + 1].reset((me.rect.centerx + 30, me.rect.centery)) bullet2_index = (bullet2_index + 2) % BULLET2_NUM else: bullets = bullet1 bullets[bullet1_index].reset(me.rect.midtop) bullet1_index = (bullet1_index + 1) % BULLET1_NUM # ����ӵ��Ƿ���ел� for b in bullets: if b.active: b.move() screen.blit(b.image, b.rect) enemy_hit = pygame.sprite.spritecollide(b, enemies, False, pygame.sprite.collide_mask) if enemy_hit: b.active = False for e in enemy_hit: if e in mid_enemies or e in big_enemies: e.hit = True e.energy -= 1 if e.energy == 0: e.active = False else: e.active = False # ���ƴ��͵л� for each in big_enemies: if each.active: each.move() if each.hit: screen.blit(each.image_hit, each.rect) each.hit = False else: if switch_image: screen.blit(each.image1, each.rect) else: screen.blit(each.image2, each.rect) # ����Ѫ�� pygame.draw.line(screen, BLACK, \ (each.rect.left, each.rect.top - 5), \ (each.rect.right, each.rect.top - 5), \ 2) # ����������20%��ʾ��ɫ��������ʾ��ɫ energy_remain = each.energy / enemy.BigEnemy.energy if energy_remain > 0.2: energy_color = GREEN else: energy_color = RED pygame.draw.line(screen, energy_color, \ (each.rect.left, each.rect.top - 5), \ (each.rect.left + each.rect.width * energy_remain, \ each.rect.top - 5), 2) # ���������ڻ����У�������Ч if each.rect.bottom == -50: enemy3_fly_sound.play(-1) else: # ���� if not (delay % 3): if e3_destroy_index == 0: enemy3_down_sound.play() screen.blit(each.destroy_images[e3_destroy_index], each.rect) e3_destroy_index = (e3_destroy_index + 1) % 6 if e3_destroy_index == 0: enemy3_fly_sound.stop() score += 10000 each.reset() # �������͵л��� for each in mid_enemies: if each.active: each.move() if each.hit: screen.blit(each.image_hit, each.rect) each.hit = False else: screen.blit(each.image, each.rect) # ����Ѫ�� pygame.draw.line(screen, BLACK, \ (each.rect.left, each.rect.top - 5), \ (each.rect.right, each.rect.top - 5), \ 2) # ����������20%��ʾ��ɫ��������ʾ��ɫ energy_remain = each.energy / enemy.MidEnemy.energy if energy_remain > 0.2: energy_color = GREEN else: energy_color = RED pygame.draw.line(screen, energy_color, \ (each.rect.left, each.rect.top - 5), \ (each.rect.left + each.rect.width * energy_remain, \ each.rect.top - 5), 2) else: # ���� if not (delay % 3): if e2_destroy_index == 0: enemy2_down_sound.play() screen.blit(each.destroy_images[e2_destroy_index], each.rect) e2_destroy_index = (e2_destroy_index + 1) % 4 if e2_destroy_index == 0: score += 6000 each.reset() # ����С�͵л��� for each in small_enemies: if each.active: each.move() screen.blit(each.image, each.rect) else: # ���� if not (delay % 3): if e1_destroy_index == 0: enemy1_down_sound.play() screen.blit(each.destroy_images[e1_destroy_index], each.rect) e1_destroy_index = (e1_destroy_index + 1) % 4 if e1_destroy_index == 0: score += 1000 each.reset() # ����ҷ��ɻ��Ƿ�ײ enemies_down = pygame.sprite.spritecollide(me, enemies, False, pygame.sprite.collide_mask) if enemies_down and not me.invincible: me.active = False for e in enemies_down: e.active = False # �����ҷ��ɻ� if me.active: if switch_image: screen.blit(me.image1, me.rect) else: screen.blit(me.image2, me.rect) else: # ���� if not (delay % 3): if me_destroy_index == 0: me_down_sound.play() screen.blit(me.destroy_images[me_destroy_index], me.rect) me_destroy_index = (me_destroy_index + 1) % 4 if me_destroy_index == 0: life_num -= 1 me.reset() pygame.time.set_timer(INVINCIBLE_TIME, 3 * 1000) # ����ȫ��ը������ bomb_text = bomb_font.render("�� %d" % bomb_num, True, WHITE) text_rect = bomb_text.get_rect() screen.blit(bomb_image, (10, height - 10 - bomb_rect.height)) screen.blit(bomb_text, (20 + bomb_rect.width, height - 5 - text_rect.height)) # ����ʣ���������� if life_num: for i in range(life_num): screen.blit(life_image, \ (width - 10 - (i + 1) * life_rect.width, \ height - 10 - life_rect.height)) # ���Ƶ÷� score_text = score_font.render("Score : %s" % str(score), True, WHITE) screen.blit(score_text, (10, 5)) # ������Ϸ�������� elif life_num == 0: # ��������ֹͣ pygame.mixer.music.stop() # ֹͣȫ����Ч pygame.mixer.stop() # ֹͣ���Ų��� pygame.time.set_timer(SUPPLY_TIME, 0) if not recorded: recorded = True # ��ȡ��ʷ��ߵ÷� with open("record.txt", "r") as f: record_score = int(f.read()) # �����ҵ÷ָ�����ʷ��ߵ÷֣���浵 if score > record_score: with open("record.txt", "w") as f: f.write(str(score)) # ���ƽ������� record_score_text = score_font.render("Best : %d" % record_score, True, (255, 255, 255)) screen.blit(record_score_text, (50, 50)) gameover_text1 = gameover_font.render("Your Score", True, (255, 255, 255)) gameover_text1_rect = gameover_text1.get_rect() gameover_text1_rect.left, gameover_text1_rect.top = \ (width - gameover_text1_rect.width) // 2, height // 3 screen.blit(gameover_text1, gameover_text1_rect) gameover_text2 = gameover_font.render(str(score), True, (255, 255, 255)) gameover_text2_rect = gameover_text2.get_rect() gameover_text2_rect.left, gameover_text2_rect.top = \ (width - gameover_text2_rect.width) // 2, \ gameover_text1_rect.bottom + 10 screen.blit(gameover_text2, gameover_text2_rect) again_rect.left, again_rect.top = \ (width - again_rect.width) // 2, \ gameover_text2_rect.bottom + 50 screen.blit(again_image, again_rect) gameover_rect.left, gameover_rect.top = \ (width - again_rect.width) // 2, \ again_rect.bottom + 10 screen.blit(gameover_image, gameover_rect) # ����û��������� # ����û����������� if pygame.mouse.get_pressed()[0]: # ��ȡ������� pos = pygame.mouse.get_pos() # ����û���������¿�ʼ�� if again_rect.left < pos[0] < again_rect.right and \ again_rect.top < pos[1] < again_rect.bottom: # ����main���������¿�ʼ��Ϸ main() # ����û������������Ϸ�� elif gameover_rect.left < pos[0] < gameover_rect.right and \ gameover_rect.top < pos[1] < gameover_rect.bottom: # �˳���Ϸ pygame.quit() sys.exit() # ������ͣ��ť screen.blit(paused_image, paused_rect) # �л�ͼƬ if not (delay % 5): switch_image = not switch_image delay -= 1 if not delay: delay = 100 pygame.display.flip() clock.tick(60)
def main(): pygame.mixer.music.play(-1) #生成我放飞机 me = myplane.MyPlane(bg_size) #生成敌方飞机 enemies = pygame.sprite.Group() small_enemies = pygame.sprite.Group() add_small_enemies(small_enemies, enemies, 15) mid_enemies = pygame.sprite.Group() add_mid_enemies(mid_enemies, enemies, 10) big_enemies = pygame.sprite.Group() add_big_enemies(big_enemies, enemies, 8) #生成普通子弹 bullet1 = [] bullet1_index = 0 bullet1_num = 4 for i in range(bullet1_num): bullet1.append(bullet.Bullet1(me.rect.midtop)) #生成超级子弹 bullet2 = [] bullet2_index = 0 bullet2_num = 8 for i in range(bullet2_num // 2): bullet2.append(bullet.Bullet2((me.rect.centerx - 33, me.rect.centery))) bullet2.append(bullet.Bullet2((me.rect.centerx + 30, me.rect.centery))) #飞机毁灭图片 e1_destroy_index = 0 e2_destroy_index = 0 e3_destroy_index = 0 me_destroy_index = 0 #统计得分 score = 0 score_font = pygame.font.Font('font/font.ttf', 36) #标识是否暂停游戏 paused = False pause_nor_image = pygame.image.load('images/pause_nor.png').convert_alpha() pause_pressed_image = pygame.image.load( 'images/pause_pressed.png').convert_alpha() resume_nor_image = pygame.image.load( 'images/resume_nor.png').convert_alpha() resume_pressed_image = pygame.image.load( 'images/resume_pressed.png').convert_alpha() paused_rect = pause_nor_image.get_rect() paused_rect.left, paused_rect.top = width - paused_rect.width - 10, 10 paused_image = pause_nor_image #设置难度级别 level = 1 #全屏炸弹 bomb_image = pygame.image.load('images/bomb.png').convert_alpha() bomb_rect = bomb_image.get_rect() bomb_font = pygame.font.Font('font/font.ttf', 48) bomb_num = 5 #每30S发放一个补给包 bullet_supply = supply.Bullet_Supply(bg_size) bomb_supply = supply.Bomb_Supply(bg_size) SUPPLY_TIME = USEREVENT pygame.time.set_timer(SUPPLY_TIME, 25 * 1000) #超级子弹定时器 DOUBLE_BULLET_TIME = USEREVENT + 1 #无敌定时器 INVINCIBLE_TIME = USEREVENT + 2 #标志是使用超级子弹 is_double_bullet = False clock = pygame.time.Clock() #用于切换图片 switch_image = True #延时变量 delay = 100 #判断是否记录 recorded = False #生命数量 life_image = pygame.image.load('images/life.png').convert_alpha() life_rect = life_image.get_rect() life_num = 3 #游戏结束画面 gameover_font = pygame.font.Font('font/font.ttf', 48) again_image = pygame.image.load('images/again.png').convert_alpha() again_rect = again_image.get_rect() gameover_image = pygame.image.load('images/gameover.png').convert_alpha() gameover_rect = gameover_image.get_rect() running = True while running: for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() elif event.type == MOUSEBUTTONDOWN: if event.button == 1 and paused_rect.collidepoint(event.pos): paused = not paused if paused: pygame.time.set_timer(SUPPLY_TIME, 0) pygame.mixer.music.pause() pygame.mixer.pause() else: pygame.time.set_timer(SUPPLY_TIME, 30 * 1000) pygame.mixer.music.unpause() pygame.mixer.unpause() elif event.type == MOUSEMOTION: if paused_rect.collidepoint(event.pos): if paused: paused_image = resume_pressed_image else: paused_image = pause_pressed_image else: if paused: paused_image = resume_nor_image else: paused_image = pause_nor_image elif event.type == KEYDOWN: if event.key == K_SPACE: if bomb_num: bomb_num -= 1 bomb_sound.play() for each in enemies: if each.rect.bottom > 0: each.active = False elif event.type == SUPPLY_TIME: supply_sound.play() if choice([True, False]): bomb_supply.reset() else: bullet_supply.reset() elif event.type == DOUBLE_BULLET_TIME: is_double_bullet = False pygame.time.set_timer(DOUBLE_BULLET_TIME, 0) elif event.type == INVINCIBLE_TIME: me.invincible = False pygame.time.set_timer(INVINCIBLE_TIME, 0) #根据用户的分来提升难度 if level == 1 and score > 10000: level = 2 upgrade_sound.play() #增加飞机 add_small_enemies(small_enemies, enemies, 3) add_mid_enemies(mid_enemies, enemies, 2) add_big_enemies(big_enemies, enemies, 1) #提升小型飞机速度 inc_speed(small_enemies, 1) elif level == 2 and score > 40000: level = 3 upgrade_sound.play() #增加飞机 add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 3) add_big_enemies(big_enemies, enemies, 2) #提升小型飞机速度 inc_speed(small_enemies, 1) inc_speed(mid_enemies, 1) elif level == 3 and score > 100000: level = 4 upgrade_sound.play() #增加飞机 add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 3) add_big_enemies(big_enemies, enemies, 2) #提升小型飞机速度 inc_speed(small_enemies, 1) inc_speed(mid_enemies, 1) elif level == 4 and score > 500000: level = 5 upgrade_sound.play() #增加飞机 add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 3) add_big_enemies(big_enemies, enemies, 2) #提升小型飞机速度 inc_speed(small_enemies, 1) inc_speed(mid_enemies, 1) screen.blit(background, (0, 0)) if not paused and life_num: #检测用户键盘操作 key_pressed = pygame.key.get_pressed() if key_pressed[K_w] or key_pressed[K_UP]: me.moveUp() if key_pressed[K_s] or key_pressed[K_DOWN]: me.moveDown() if key_pressed[K_a] or key_pressed[K_LEFT]: me.moveLeft() if key_pressed[K_d] or key_pressed[K_RIGHT]: me.moveRight() #绘制全屏炸弹并检测是否获得 if bomb_supply.active: bomb_supply.move() screen.blit(bomb_supply.image, bomb_supply.rect) if pygame.sprite.collide_mask(bomb_supply, me): get_bomb_sound.play() if bomb_num < 9: bomb_num += 1 bomb_supply.active = False #绘制超级子弹补给并检测是否获得 if bullet_supply.active: bullet_supply.move() screen.blit(bullet_supply.image, bullet_supply.rect) if pygame.sprite.collide_mask(bullet_supply, me): get_bullet_sound.play() is_double_bullet = True pygame.time.set_timer(DOUBLE_BULLET_TIME, 18 * 1000) bullet_supply.active = False if not (delay % 10): bullet_sound.play() if is_double_bullet: bullets = bullet2 bullets[bullet2_index].reset( (me.rect.centerx - 33, me.rect.centery)) bullets[bullet2_index + 1].reset( (me.rect.centerx + 30, me.rect.centery)) bullet2_index = (bullet2_index + 2) % bullet2_num else: bullets = bullet1 bullets[bullet1_index].reset(me.rect.midtop) bullet1_index = (bullet1_index + 1) % bullet1_num #检测子弹是否击中敌机 for b in bullets: if b.active: b.move() screen.blit(b.image, b.rect) enemy_hit = pygame.sprite.spritecollide( b, enemies, False, pygame.sprite.collide_mask) if enemy_hit: b.active = False for e in enemy_hit: if e in mid_enemies or e in big_enemies: e.hit = True e.life -= 1 if e.life == 0: e.active = False else: e.active = False #检测我放飞机是否被撞 enemies_down = pygame.sprite.spritecollide( me, enemies, False, pygame.sprite.collide_mask) if enemies_down and not me.invincible: me.active = False for e in enemies_down: e.active = False #绘制我方飞机 if me.active: if switch_image: screen.blit(me.image1, me.rect) else: screen.blit(me.image2, me.rect) else: #毁灭飞机 me_down_sound.play() if not (delay % 3): screen.blit(me.destroy_images[me_destroy_index], me.rect) me_destroy_index = (me_destroy_index + 1) % 4 if me_destroy_index == 0: life_num -= 1 me.reset() pygame.time.set_timer(INVINCIBLE_TIME, 3 * 1000) #绘制生命数量 if life_num: for i in range(life_num): screen.blit(life_image,\ (width-10-(i+1)*life_rect.width,\ height - 10 - life_rect.height)) score_text = score_font.render('Score : %s' % str(score), True, WHITE) screen.blit(score_text, (10, 5)) #切换图片 if not (delay % 5): switch_image = not switch_image #绘制敌方飞机 for each in big_enemies: if each.active: each.move() if each.hit == True: screen.blit(each.image_hit, each.rect) each.hit = False else: if switch_image: screen.blit(each.image1, each.rect) else: screen.blit(each.image2, each.rect) #绘制血槽 pygame.draw.line(screen, BLACK,\ (each.rect.left, each.rect.top - 5),\ (each.rect.right,each.rect.top - 5), 2) #当生命大于20%显示绿色,否则红色 life_remain = each.life / enemy.BigEnemy.life if life_remain > 0.2: life_color = GREEN else: life_color = RED pygame.draw.line(screen,life_color,\ (each.rect.left, each.rect.top - 5),\ (each.rect.left + each.rect.width*life_remain, each.rect.top - 5),2) #大飞机来临前播放音效 if each.rect.bottom > -50: enemy3_fly_sound.play() else: #毁灭飞机 if not (delay % 3): if e3_destroy_index == 1: enemy3_down_sound.play() screen.blit(each.destroy_images[e3_destroy_index], each.rect) e3_destroy_index = (e3_destroy_index + 1) % 6 if e3_destroy_index == 0: enemy3_fly_sound.stop() score += 10000 each.reset() for each in mid_enemies: if each.active: each.move() if each.hit == True: screen.blit(each.image_hit, each.rect) each.hit = False else: screen.blit(each.image, each.rect) #绘制血槽 pygame.draw.line(screen, BLACK,\ (each.rect.left, each.rect.top - 5),\ (each.rect.right,each.rect.top - 5), 2) #当生命大于20%显示绿色,否则红色 life_remain = each.life / enemy.MidEnemy.life if life_remain > 0.2: life_color = GREEN else: life_color = RED pygame.draw.line(screen,life_color,\ (each.rect.left, each.rect.top - 5),\ (each.rect.left + each.rect.width*life_remain, each.rect.top - 5),2) else: #毁灭飞机 if not (delay % 3): if e2_destroy_index == 1: enemy2_down_sound.play() screen.blit(each.destroy_images[e2_destroy_index], each.rect) e2_destroy_index = (e2_destroy_index + 1) % 4 if e2_destroy_index == 0: score += 1000 each.reset() for each in small_enemies: if each.active: each.move() screen.blit(each.image, each.rect) else: #毁灭飞机 if not (delay % 3): if e1_destroy_index == 1: enemy1_down_sound.play() screen.blit(each.destroy_images[e1_destroy_index], each.rect) e1_destroy_index = (e1_destroy_index + 1) % 4 if e1_destroy_index == 0: score += 500 each.reset() #绘制炸弹数量 bomb_text = bomb_font.render('* %d' % bomb_num, True, WHITE) text_rect = bomb_text.get_rect() screen.blit(bomb_image, (10, height - 10 - bomb_rect.height)) screen.blit(bomb_text, (20 + bomb_rect.width, height - 5 - text_rect.height)) #绘制游戏结束画面 elif life_num == 0: #音乐停止 pygame.mixer.music.stop() pygame.mixer.stop() #补给停止 pygame.time.set_timer(SUPPLY_TIME, 0) if not recorded: recorded = not recorded #读取历史最高分 with open('record.txt', 'r') as f: record_score = int(f.read()) #如果玩家得分高于存档,则覆盖存档 if score > record_score: with open('record.txt', 'w') as f: f.write(str(score)) #绘制结束画面 record_score_text = score_font.render('Best : %d' % record_score, True, (255, 255, 255)) screen.blit(record_score_text, (50, 50)) gameover_text1 = gameover_font.render('You Score', True, (255, 255, 255)) gameover_text1_rect = gameover_text1.get_rect() gameover_text1_rect.left, gameover_text1_rect.top = \ (width - gameover_text1_rect.width)//2,\ height // 2 screen.blit(gameover_text1, gameover_text1_rect) gameover_text2 = gameover_font.render(str(score), True, (255, 255, 255)) gameover_text2_rect = gameover_text2.get_rect() gameover_text2_rect.left, gameover_text2_rect.top = \ (width - gameover_text2_rect.width)//2,\ height // 2 + 50 screen.blit(gameover_text2, gameover_text2_rect) again_rect.left, again_rect.top = \ (width - again_rect.width)//2,\ gameover_text2_rect.bottom + 50 screen.blit(again_image, again_rect) gameover_rect.left, gameover_rect.top = \ (width - again_rect.width)//2,\ again_rect.bottom + 10 screen.blit(gameover_image, gameover_rect) #检测用户鼠标操作 if pygame.mouse.get_pressed()[0]: pos = pos = pygame.mouse.get_pos() if again_rect.left < pos[0] < again_rect.right and \ again_rect.top < pos[1] < again_rect.bottom: main() elif gameover_rect.left < pos[0] < gameover_rect.right and\ gameover_rect.top < pos[1] < gameover_rect.bottom: pygame.quit() sys.exit() #绘制暂停按钮 screen.blit(paused_image, paused_rect) delay -= 1 if not delay: delay = 100 switch_image = not switch_image pygame.display.flip() clock.tick(60)
def main(): pygame.mixer.music.play(-1) # Create Player plane me = myplane.MyPlane(bg_size) enemies = pygame.sprite.Group() # Create Small Enemy small_enemies = pygame.sprite.Group() add_small_enemies(small_enemies, enemies, 15) # Create Mid Enemy mid_enemies = pygame.sprite.Group() add_mid_enemies(mid_enemies, enemies, 4) # Create Big Enemy big_enemies = pygame.sprite.Group() add_big_enemies(big_enemies, enemies, 2) # Create normal bullet bullet1 = [] bullet1_index = 0 BULLET1_NUM = 4 for i in range(BULLET1_NUM): bullet1.append(bullet.Bullet1(me.rect.midtop)) # Create super bullet bullet2 = [] bullet2_index = 0 BULLET2_NUM = 8 for i in range(BULLET2_NUM // 2): bullet2.append(bullet.Bullet2((me.rect.centerx - 33, me.rect.centery))) bullet2.append(bullet.Bullet2((me.rect.centerx + 30, me.rect.centery))) clock = pygame.time.Clock() # Hit pic index e1_destroy_index = 0 e2_destroy_index = 0 e3_destroy_index = 0 me_destroy_index = 0 # score score = 0 score_font = pygame.font.Font("font/font.ttf", 36) # pause paused = False pause_nor_image = pygame.image.load("images/pause_nor.png").convert_alpha() pause_pressed_image = pygame.image.load( "images/pause_pressed.png").convert_alpha() resume_nor_image = pygame.image.load( "images/resume_nor.png").convert_alpha() resume_pressed_image = pygame.image.load( "images/resume_pressed.png").convert_alpha() paused_rect = pause_nor_image.get_rect() paused_rect.left, paused_rect.top = width - paused_rect.width - 10, 10 paused_image = pause_nor_image # Difficulty level = 1 # Bomb pic bomb_image = pygame.image.load("images/bomb.png").convert_alpha() bomb_rect = bomb_image.get_rect() bomb_font = pygame.font.Font("font/font.ttf", 48) bomb_num = 3 # Supply every 30 sec bullet_supply = supply.Bullet_Supply(bg_size) bomb_supply = supply.Bomb_Supply(bg_size) SUPPLY_TIME = USEREVENT pygame.time.set_timer(SUPPLY_TIME, 30 * 1000) # Super bullet supply timer DOUBLE_BULLET_TIME = USEREVENT + 1 # Invincible timer INVINCIBLE_TIME = USEREVENT + 2 # Use super bullet or not is_double_bullet = False # switch image switch_image = True # delay delay = 100 # Life number life_image = pygame.image.load("images/life.png").convert_alpha() life_rect = life_image.get_rect() life_num = 3 # Limit file open time recorded = False # GameOver pic gameover_font = pygame.font.Font("font/font.ttf", 48) again_image = pygame.image.load("images/again1.png").convert_alpha() again_rect = again_image.get_rect() gameover_image = pygame.image.load("images/gameover1.png").convert_alpha() gameover_rect = gameover_image.get_rect() running = True while running: for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() elif event.type == MOUSEBUTTONDOWN: if event.button == 1 and paused_rect.collidepoint(event.pos): paused = not paused if paused: pygame.time.set_timer(SUPPLY_TIME, 0) pygame.mixer.music.pause() pygame.mixer.pause() else: pygame.time.set_timer(SUPPLY_TIME, 30 * 1000) pygame.mixer.music.unpause() pygame.mixer.unpause() elif event.type == MOUSEMOTION: if paused_rect.collidepoint(event.pos): if paused: paused_image = resume_pressed_image else: paused_image = pause_pressed_image else: if paused: paused_image = resume_nor_image else: paused_image = pause_nor_image elif event.type == KEYDOWN: if event.key == K_SPACE: if bomb_num: bomb_num -= 1 bomb_sound.play() for each in enemies: if each.rect.bottom > 0: each.active = False elif event.type == SUPPLY_TIME: supply_sound.play() if choice([True, False]): bomb_supply.reset() else: bullet_supply.reset() elif event.type == DOUBLE_BULLET_TIME: is_double_bullet = False pygame.time.set_timer(DOUBLE_BULLET_TIME, 0) elif event.type == INVINCIBLE_TIME: me.invincible = False pygame.time.set_timer(INVINCIBLE_TIME, 0) # Increase difficulty if level == 1 and score > 50000: level = 2 upgrade_sound.play() # add 3 small, 2 mid, 1 big enemy add_small_enemies(small_enemies, enemies, 3) add_mid_enemies(mid_enemies, enemies, 2) add_big_enemies(big_enemies, enemies, 1) # increase speed inc_speed(small_enemies, 1) elif level == 2 and score > 300000: level = 3 upgrade_sound.play() # add 5 small, 3 mid , 2 big enemy add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 3) add_big_enemies(big_enemies, enemies, 2) # increase speed inc_speed(small_enemies, 1) inc_speed(mid_enemies, 1) elif level == 3 and score > 600000: level = 4 upgrade_sound.play() # add 5 small, 3 mid , 2 big enemy add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 3) add_big_enemies(big_enemies, enemies, 2) # increase speed inc_speed(small_enemies, 1) inc_speed(mid_enemies, 1) elif level == 4 and score > 1000000: level = 5 upgrade_sound.play() # add 5 small, 3 mid , 2 big enemy add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 3) add_big_enemies(big_enemies, enemies, 2) # increase speed inc_speed(small_enemies, 1) inc_speed(mid_enemies, 1) screen.blit(background, (0, 0)) if life_num and not paused: # Check keyboard key_pressed = pygame.key.get_pressed() if key_pressed[K_w] or key_pressed[K_UP]: me.moveUp() if key_pressed[K_s] or key_pressed[K_DOWN]: me.moveDown() if key_pressed[K_a] or key_pressed[K_LEFT]: me.moveLeft() if key_pressed[K_d] or key_pressed[K_RIGHT]: me.moveRight() # Draw bomb supply if bomb_supply.active: bomb_supply.move() screen.blit(bomb_supply.image, bomb_supply.rect) if pygame.sprite.collide_mask(bomb_supply, me): get_bomb_sound.play() if bomb_num < 3: bomb_num += 1 bomb_supply.active = False # Draw super bullet supply if bullet_supply.active: bullet_supply.move() screen.blit(bullet_supply.image, bullet_supply.rect) if pygame.sprite.collide_mask(bullet_supply, me): get_bullet_sound.play() is_double_bullet = True pygame.time.set_timer(DOUBLE_BULLET_TIME, 18 * 1000) bullet_supply.active = False # Launch bullet if not (delay % 10): bullet_sound.play() if is_double_bullet: bullets = bullet2 bullets[bullet2_index].reset( (me.rect.centerx - 33, me.rect.centery)) bullets[bullet2_index + 1].reset( (me.rect.centerx + 30, me.rect.centery)) bullet2_index = (bullet2_index + 2) % BULLET2_NUM else: bullets = bullet1 bullets[bullet1_index].reset(me.rect.midtop) bullet1_index = (bullet1_index + 1) % BULLET1_NUM # Check Hit for b in bullets: if b.active: b.move() screen.blit(b.image, b.rect) enemy_hit = pygame.sprite.spritecollide( b, enemies, False, pygame.sprite.collide_mask) if enemy_hit: b.active = False for e in enemy_hit: if e in mid_enemies or e in big_enemies: e.hit = True e.energy -= 1 if e.energy == 0: e.active = False else: e.active = False # Draw big enemy for each in big_enemies: if each.active: each.move() if each.hit: screen.blit(each.image_hit, each.rect) each.hit = False else: if switch_image: screen.blit(each.image1, each.rect) else: screen.blit(each.image2, each.rect) # Energy pygame.draw.line(screen, BLACK, \ (each.rect.left, each.rect.top - 5), \ (each.rect.right, each.rect.top - 5), \ 2) # >20 % Green else Red energy_remain = each.energy / enemy.BigEnemy.energy if energy_remain > 0.2: energy_color = GREEN else: energy_color = RED pygame.draw.line(screen, energy_color, \ (each.rect.left, each.rect.top - 5), \ (each.rect.left + each.rect.width * energy_remain, \ each.rect.top - 5), 2) # Play sound if each.rect.bottom == -50: enemy3_fly_sound.play(-1) else: # Destroy if not (delay % 3): if e3_destroy_index == 0: enemy3_down_sound.play() screen.blit(each.destroy_images[e3_destroy_index], each.rect) e3_destroy_index = (e3_destroy_index + 1) % 6 if e3_destroy_index == 0: enemy3_fly_sound.stop() score += 10000 each.reset() # Draw Mid enemy for each in mid_enemies: if each.active: each.move() if each.hit: screen.blit(each.image_hit, each.rect) each.hit = False else: screen.blit(each.image, each.rect) # Energy pygame.draw.line(screen, BLACK, \ (each.rect.left, each.rect.top - 5), \ (each.rect.right, each.rect.top - 5), \ 2) # >20% Green else Red energy_remain = each.energy / enemy.MidEnemy.energy if energy_remain > 0.2: energy_color = GREEN else: energy_color = RED pygame.draw.line(screen, energy_color, \ (each.rect.left, each.rect.top - 5), \ (each.rect.left + each.rect.width * energy_remain, \ each.rect.top - 5), 2) else: # Destroy if not (delay % 3): if e2_destroy_index == 0: enemy2_down_sound.play() screen.blit(each.destroy_images[e2_destroy_index], each.rect) e2_destroy_index = (e2_destroy_index + 1) % 4 if e2_destroy_index == 0: score += 6000 each.reset() # Draw small enemy: for each in small_enemies: if each.active: each.move() screen.blit(each.image, each.rect) else: # Destroy if not (delay % 3): if e1_destroy_index == 0: enemy1_down_sound.play() screen.blit(each.destroy_images[e1_destroy_index], each.rect) e1_destroy_index = (e1_destroy_index + 1) % 4 if e1_destroy_index == 0: score += 1000 each.reset() # Check if player get hit enemies_down = pygame.sprite.spritecollide( me, enemies, False, pygame.sprite.collide_mask) if enemies_down and not me.invincible: me.active = False for e in enemies_down: e.active = False # Draw player if me.active: if switch_image: screen.blit(me.image1, me.rect) else: screen.blit(me.image2, me.rect) else: # Destroy if not (delay % 3): if me_destroy_index == 0: me_down_sound.play() screen.blit(me.destroy_images[me_destroy_index], me.rect) me_destroy_index = (me_destroy_index + 1) % 4 if me_destroy_index == 0: life_num -= 1 me.reset() pygame.time.set_timer(INVINCIBLE_TIME, 3 * 1000) # Draw Bomb number bomb_text = bomb_font.render("× %d" % bomb_num, True, WHITE) text_rect = bomb_text.get_rect() screen.blit(bomb_image, (10, height - 10 - bomb_rect.height)) screen.blit(bomb_text, (20 + bomb_rect.width, height - 5 - text_rect.height)) # Draw life number if life_num: for i in range(life_num): screen.blit(life_image, (width - 10 - (i + 1) * life_rect.width, \ height - 10 - life_rect.height)) # Draw score score_text = score_font.render("Score : %s" % str(score), True, WHITE) screen.blit(score_text, (10, 5)) elif life_num == 0: # Stop background music pygame.mixer.music.stop() # Stop sound pygame.mixer.stop() # Stop supply pygame.time.set_timer(SUPPLY_TIME, 0) if not recorded: recorded = True # Read history score with open("record.txt", "r") as f: record_score = int(f.read()) # If current score is higher than record, override if score > record_score: with open("record.txt", "w") as f: f.write(str(score)) # Draw GameOver record_score_text = score_font.render( "Best Score : %d" % record_score, True, WHITE) screen.blit(record_score_text, (50, 50)) gameover_text1 = gameover_font.render("Your Score: ", True, WHITE) gameover_text1_rect = gameover_text1.get_rect() gameover_text1_rect.left, gameover_text1_rect.top = \ (width - gameover_text1_rect.width) // 2, height // 3 screen.blit(gameover_text1, gameover_text1_rect) gameover_text2 = gameover_font.render(str(score), True, WHITE) gameover_text2_rect = gameover_text2.get_rect() gameover_text2_rect.left, gameover_text2_rect.top = \ (width - gameover_text2_rect.width) // 2, \ gameover_text1_rect.bottom + 10 screen.blit(gameover_text2, gameover_text2_rect) again_rect.left, again_rect.top = \ (width - again_rect.width) // 2, \ gameover_text2_rect.bottom + 50 screen.blit(again_image, again_rect) gameover_rect.left, gameover_rect.top = \ (width - again_rect.width) // 2, \ again_rect.bottom + 10 screen.blit(gameover_image, gameover_rect) # Check mouse action if pygame.mouse.get_pressed()[0]: # Get mouse pos pos = pygame.mouse.get_pos() # If again is clicked if again_rect.left < pos[0] < again_rect.right and \ again_rect.top < pos[1] < again_rect.bottom: # restart main() # If end is clicked elif gameover_rect.left < pos[0] < gameover_rect.right and \ gameover_rect.top < pos[1] < gameover_rect.bottom: # Quit pygame.quit() sys.exit() # Draw pause botton screen.blit(paused_image, paused_rect) # switch player image if not (delay % 5): switch_image = not switch_image delay -= 1 if not delay: delay = 100 pygame.display.flip() clock.tick(60)
def main(): pygame.mixer.music.play(-1) #mkdir myplace me = myplane.MyPlane(bg_size) #madir enemy enemies = pygame.sprite.Group() #madir small enemy small_enemies = pygame.sprite.Group() add_small_enemies(small_enemies, enemies, 15) #madir mid enemy mid_enemies = pygame.sprite.Group() add_mid_enemies(mid_enemies, enemies, 4) #madir big enemy big_enemies = pygame.sprite.Group() add_big_enemies(big_enemies, enemies, 2) #madir bullet1 bullet1 = [] bullet1_index = 0 BULLTE1_NUM = 4 for i in range(BULLTE1_NUM): bullet1.append(bullet.Bullet1(me.rect.midtop)) clock = pygame.time.Clock() #madir bullet2 bullet2 = [] bullet2_index = 0 BULLTE2_NUM = 8 for i in range(BULLTE2_NUM // 2): bullet2.append(bullet.Bullet2((me.rect.centerx - 33, me.rect.centery))) bullet2.append(bullet.Bullet2((me.rect.centerx + 30, me.rect.centery))) clock = pygame.time.Clock() #shot images e1_destroy_index = 0 e2_destroy_index = 0 e3_destroy_index = 0 me_destroy_index = 0 #score score = 0 score_font = pygame.font.Font("font/font.ttf", 36) #game over screen gameover_font = pygame.font.Font("font/font.ttf", 48) again_image = pygame.image.load("images/again.png").convert_alpha() again_rect = again_image.get_rect() gameover_image = pygame.image.load("images/gameover.png").convert_alpha() gameover_rect = gameover_image.get_rect() #pause paused = False pause_nor_image = pygame.image.load("images/pause_nor.png").convert_alpha() pause_pressed_image = pygame.image.load( "images/pause_pressed.png").convert_alpha() resume_nor_image = pygame.image.load( "images/resume_nor.png").convert_alpha() resume_pressed_image = pygame.image.load( "images/resume_pressed.png").convert_alpha() paused_rect = pause_nor_image.get_rect() paused_rect.left, paused_rect.top = width - paused_rect.width - 10, 10 paused_image = pause_nor_image #game level level = 1 #screen boom bomb_image = pygame.image.load("images/bomb.png").convert_alpha() bomb_rect = bomb_image.get_rect() bomb_font = pygame.font.Font("font/font.ttf", 48) bomb_num = 3 #every 30 seconds,supply one bullet_supply = supply.Bullet_Supply(bg_size) bomb_supply = supply.Bomb_Supply(bg_size) SUPPLY_TIME = USEREVENT pygame.time.set_timer(SUPPLY_TIME, 30 * 1000) #super bullet DOUBLE_BULLET_TIME = USEREVENT + 1 is_double_bullet = False # INVINCIBLE_TIME = USEREVENT + 2 #live number life_image = pygame.image.load("images/life.png").convert_alpha() life_rect = life_image.get_rect() life_num = 3 recorded = False #change planepicture switch_image = True #delay variable delay = 100 running = True while running: for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() elif event.type == MOUSEBUTTONDOWN: if event.button == 1 and paused_rect.collidepoint(event.pos): paused = not paused if paused: pygame.time.set_timer(SUPPLY_TIME, 0) pygame.mixer.music.pause() pygame.mixer.pause() else: pygame.time.set_timer(SUPPLY_TIME, 30 * 1000) pygame.mixer.music.unpause() pygame.mixer.unpause() elif event.type == MOUSEMOTION: if paused_rect.collidepoint(event.pos): if paused: paused_image = resume_pressed_image else: paused_image = pause_pressed_image else: if paused: paused_image = resume_nor_image else: paused_image = pause_nor_image elif event.type == KEYDOWN: if event.key == K_SPACE: if bomb_num: bomb_num -= 1 bomb_sound.play() for each in enemies: if each.rect.bottom > 0: each.active = False elif event.type == SUPPLY_TIME: supply_sound.play() if choice([True, False]): bomb_supply.reset() else: bullet_supply.reset() elif event.type == DOUBLE_BULLET_TIME: is_double_bullet = False pygame.time.set_timer(DOUBLE_BULLET_TIME, 0) elif event.type == INVINCIBLE_TIME: me.invincible = False pygame.time.set_timer(INVINCIBLE_TIME, 0) #level from score if level == 1 and score > 50000: level = 2 upgrade_sound.play() add_small_enemies(small_enemies, enemies, 3) add_mid_enemies(mid_enemies, enemies, 2) add_big_enemies(big_enemies, enemies, 1) inc_speed(small_enemies, 1) elif level == 2 and score > 300000: level = 3 upgrade_sound.play() add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 3) add_big_enemies(big_enemies, enemies, 2) inc_speed(small_enemies, 1) inc_speed(mid_enemies, 1) elif level == 3 and score > 600000: level = 4 upgrade_sound.play() add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 3) add_big_enemies(big_enemies, enemies, 2) inc_speed(small_enemies, 1) inc_speed(mid_enemies, 1) elif level == 4 and score > 1000000: level = 5 upgrade_sound.play() add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 3) add_big_enemies(big_enemies, enemies, 2) inc_speed(small_enemies, 1) inc_speed(mid_enemies, 1) screen.blit(background, (0, 0)) if life_num and not paused: #check user keyboard key_pressed = pygame.key.get_pressed() if key_pressed[K_w] or key_pressed[K_UP]: me.moveUp() if key_pressed[K_s] or key_pressed[K_DOWN]: me.moveDown() if key_pressed[K_a] or key_pressed[K_LEFT]: me.moveLeft() if key_pressed[K_d] or key_pressed[K_RIGHT]: me.moveRight() if bomb_supply.active: bomb_supply.move() screen.blit(bomb_supply.image, bomb_supply.rect) if pygame.sprite.collide_mask(bomb_supply, me): get_bomb_sound.play() if bomb_num < 3: bomb_num += 1 bomb_supply.active = False if bullet_supply.active: bullet_supply.move() screen.blit(bullet_supply.image, bullet_supply.rect) if pygame.sprite.collide_mask(bullet_supply, me): get_bullet_sound.play() pygame.time.set_timer(DOUBLE_BULLET_TIME, 18 * 1000) bullet_supply.active = False if not (delay % 10): bullet_sound.play() if is_double_bullet: bullets = bullet2 bullets[bullet2_index].reset( (me.rect.centerx - 33, me.rect.centery)) bullets[bullet2_index + 1].reset( (me.rect.centerx + 30, me.rect.centery)) bullet2_index = (bullet2_index + 2) % BULLTE2_NUM else: bullets = bullet1 bullet1[bullet1_index].reset(me.rect.midtop) bullet1_index = (bullet1_index + 1) % BULLTE1_NUM #check enemy shot by bullet for b in bullets: if b.active: b.move() screen.blit(b.image, b.rect) enemy_hit = pygame.sprite.spritecollide( b, enemies, False, pygame.sprite.collide_mask) if enemy_hit: b.active = False for e in enemy_hit: if e in mid_enemies or e in big_enemies: e.hit = True e.energy -= 1 if e.energy == 0: e.active = False else: e.active = False #draw big enemy for each in big_enemies: if each.active: each.move() if each.hit: screen.blit(each.image_hit, each.rect) each.hit = False else: if switch_image: screen.blit(each.image1, each.rect) else: screen.blit(each.image2, each.rect) #draw haemal strand pygame.draw.line(screen, BLACK, (each.rect.left, each.rect.top - 5), (each.rect.right, each.rect.top - 5), 2) energy_remain = each.energy / enemy.BigEnemy.energy if energy_remain > 0.2: energy_color = GREEN else: energy_color = RED pygame.draw.line( screen, energy_color, (each.rect.left, each.rect.top - 5), (each.rect.left + each.rect.width * energy_remain, each.rect.top - 5), 2) #when in the screen , music if each.rect.bottom == -50: enemy3_fly_sound.play(-1) else: #Out if not (delay % 3): if e3_destroy_index == 0: enemy3_down_sound.play() screen.blit(each.destroy_images[e3_destroy_index], each.rect) e3_destroy_index = (e3_destroy_index + 1) % 6 if e3_destroy_index == 0: enemy3_fly_sound.stop() score += 10000 each.reset() #draw mid enemy for each in mid_enemies: if each.active: each.move() if each.hit: screen.blit(each.image_hit, each.rect) each.hit = False else: screen.blit(each.image, each.rect) # draw haemal strand pygame.draw.line(screen, BLACK, (each.rect.left, each.rect.top - 5), (each.rect.right, each.rect.top - 5), 2) energy_remain = each.energy / enemy.MidEnemy.energy if energy_remain > 0.2: energy_color = GREEN else: energy_color = RED pygame.draw.line( screen, energy_color, (each.rect.left, each.rect.top - 5), (each.rect.left + each.rect.width * energy_remain, each.rect.top - 5), 2) else: #Out if not (delay % 3): if e2_destroy_index == 0: enemy2_down_sound.play() screen.blit(each.destroy_images[e2_destroy_index], each.rect) e3_destroy_index = (e2_destroy_index + 1) % 4 if e2_destroy_index == 0: score += 6000 each.reset() #draw small enemy for each in small_enemies: if each.active: each.move() screen.blit(each.image, each.rect) else: #Out if not (delay % 3): if e1_destroy_index == 0: enemy1_down_sound.play() screen.blit(each.destroy_images[e1_destroy_index], each.rect) e3_destroy_index = (e1_destroy_index + 1) % 4 if e1_destroy_index == 0: score += 1000 each.reset() #Check myplane collide enemeies_down = pygame.sprite.spritecollide( me, enemies, False, pygame.sprite.collide_mask) if enemeies_down and not me.invincible: me.active = False for e in enemeies_down: e.active = False #draw myplane if me.active: if switch_image: screen.blit(me.image1, me.rect) else: screen.blit(me.image2, me.rect) else: #Out if not (delay % 3): if me_destroy_index == 0: me_down_sound.play() screen.blit(me.destroy_images[me_destroy_index], me.rect) me_destroy_index = (me_destroy_index + 1) % 3 if me_destroy_index == 0: life_num -= 1 me.reset() pygame.time.set_timer(INVINCIBLE_TIME, 3 * 1000) #draw bomb bomb_text = bomb_font.render("X %d" % bomb_num, True, WHITE) text_rect = bomb_text.get_rect() screen.blit(bomb_image, (10, height - 10 - bomb_rect.height)) screen.blit(bomb_text, (20 + bomb_rect.width, height - 5 - text_rect.height)) #draw life number if life_num: for i in range(life_num): screen.blit(life_image, (width - 10 - (i + 1) * life_rect.width, height - 10 - life_rect.height)) score_text = score_font.render("Score: %s" % str(score), True, WHITE) screen.blit(score_text, (10, 5)) elif life_num == 0: pygame.mixer.music.stop() pygame.mixer.stop() pygame.time.set_timer(SUPPLY_TIME, 0) if not recorded: recorded = True with open("record.txt", "r") as f: record_score = int(f.read()) if score > record_score: with open("record.txt", "w") as f: f.write(str(score)) record_score_text = score_font.render("Best: %d" % record_score, True, WHITE) screen.blit(record_score_text, (50, 50)) gameover_text1 = gameover_font.render("Your Score: ", True, WHITE) gameover_text1_rect = gameover_text1.get_rect() gameover_text1_rect.left, gameover_text1_rect.top = ( width - gameover_text1_rect.width) // 2, height // 2 screen.blit(gameover_text1, gameover_text1_rect) gameover_text2 = gameover_font.render(str(score), True, WHITE) gameover_text2_rect = gameover_text2.get_rect() gameover_text2_rect.left, gameover_text2_rect.top = ( width - gameover_text2_rect.width ) // 2, gameover_text1_rect.bottom + 10 screen.blit(gameover_text2, gameover_text2_rect) again_rect.left, again_rect.top = ( width - again_rect.width) // 2, gameover_text2_rect.bottom + 50 screen.blit(again_image, again_rect) gameover_rect.left, gameover_rect.top = ( width - again_rect.width) // 2, again_rect.bottom + 10 screen.blit(gameover_image, gameover_rect) # 检测用户的鼠标操作 # 如果用户按下鼠标左键 if pygame.mouse.get_pressed()[0]: pos = pygame.mouse.get_pos() if again_rect.left < pos[ 0] < again_rect.right and again_rect.top < pos[ 1] < again_rect.bottom: main() elif gameover_rect.left < pos[ 0] < gameover_rect.right and gameover_rect.top < pos[ 1] < gameover_rect.bottom: pygame.quit() sys.exit() screen.blit(paused_image, paused_rect) if not (delay % 5): switch_image = not switch_image delay -= 1 if not delay: delay = 100 pygame.display.flip() clock.tick(60)
def main(): pygame.mixer.music.play(-1) clock = pygame.time.Clock() # 中弹图片索引 e1_destroy_index = 0 e2_destroy_index = 0 e3_destroy_index = 0 me_destroy_index = 0 me = myplane.MyPlane(bg_size) enemies = pygame.sprite.Group() # 生成敌方小型飞机 small_enemies = pygame.sprite.Group() add_small_enemies(small_enemies, enemies, 15) mid_enemies = pygame.sprite.Group() add_mid_enemies(mid_enemies, enemies, 5) big_enemies = pygame.sprite.Group() add_big_enemies(big_enemies, enemies, 1) running = True switch_image = True delay = 100 score = 0 score_font = pygame.font.Font("font/font.ttf", 36) bullets = [] # 生成普通子弹 bullet1 = [] bullet1_index = 0 BULLET1_NUM = 4 for i in range(BULLET1_NUM): bullet1.append(bullet.Bullet1(me.rect.midtop)) # 生命数量 life_image = pygame.image.load("images/life.png").convert_alpha() life_rect = life_image.get_rect() life_num = 3 # 游戏结束画面 gameover_font = pygame.font.Font("font/font.ttf", 48) again_image = pygame.image.load("images/again.png").convert_alpha() again_rect = again_image.get_rect() gameover_image = pygame.image.load("images/gameover.png").convert_alpha() gameover_rect = gameover_image.get_rect() DOUBLE_BULLET_TIME = USEREVENT + 1 # 解除我方飞机无敌状态 INVINCEBLE_TIME = USEREVENT + 2 # 生成超级子弹 bullet2 = [] bullet2_index = 0 BULLET2_NUM = 8 for i in range(BULLET2_NUM // 2): bullet2.append(bullet.Bullet2((me.rect.centerx - 33, me.rect.centery))) bullet2.append(bullet.Bullet2((me.rect.centerx + 30, me.rect.centery))) # 标记是否使用超级子弹 is_double_bullet = False level = 1 # 全屏炸弹 bomb_image = pygame.image.load("images/bomb.png").convert_alpha() bomb_rect = bomb_image.get_rect() bomb_font = pygame.font.Font("font/font.ttf", 48) bomb_num = 3 # 每30秒发放一个补给包 bullet_supply = supply.Bullet_Supply(bg_size) bomb_supply = supply.Bomb_Supply(bg_size) SUPPLY_TIME = USEREVENT pygame.time.set_timer(SUPPLY_TIME, 30 * 1000) # 阻止重复读取成绩记录文件 recorded = False # 标志是否暂停游戏 paused = False paused_nor_image = pygame.image.load( "images/pause_nor.png").convert_alpha() pause_pressed_image = pygame.image.load( "images/pause_pressed.png").convert_alpha() resume_nor_image = pygame.image.load( "images/resume_nor.png").convert_alpha() resume_pressed_image = pygame.image.load( "images/resume_pressed.png").convert_alpha() paused_rect = paused_nor_image.get_rect() paused_rect.left, paused_rect.top = width - paused_rect.width - 10, 10 paused_image = paused_nor_image while running: for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() elif event.type == MOUSEBUTTONDOWN: if event.button == 1 and paused_rect.collidepoint(event.pos): paused = not paused if paused: pygame.time.set_timer(SUPPLY_TIME, 0) pygame.mixer.music.pause() pygame.mixer.pause() paused_image = resume_pressed_image else: pygame.time.set_timer(SUPPLY_TIME, 30 * 1000) pygame.mixer.music.unpause() pygame.mixer.unpause() paused_image = pause_pressed_image elif event.type == MOUSEMOTION: if paused_rect.collidepoint(event.pos): if paused: paused_image = resume_pressed_image else: paused_image = pause_pressed_image else: if paused: paused_image = resume_nor_image else: paused_image = paused_nor_image elif event.type == KEYDOWN: if event.key == K_SPACE: if bomb_num: bomb_num -= 1 bomb_sound.play() for each in enemies: if each.rect.bottom > 0: each.active = False elif event.type == SUPPLY_TIME: supply_sound.play() if random.choice([True, False]): bomb_supply.reset() else: bullet_supply.reset() elif event.type == DOUBLE_BULLET_TIME: is_double_bullet = False pygame.time.set_timer(DOUBLE_BULLET_TIME, 0) elif event.type == INVINCEBLE_TIME: me.invincible = False pygame.time.set_timer(INVINCEBLE_TIME, 0) # 根据用户的得分增加难度 if level == 1 and score > 50000: level = 2 upgrade_sound.play() add_small_enemies(small_enemies, enemies, 3) add_mid_enemies(mid_enemies, enemies, 2) add_big_enemies(big_enemies, enemies, 1) inc_speed(small_enemies, 1) elif level == 2 and score > 300000: level = 3 upgrade_sound.play() add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 3) add_big_enemies(big_enemies, enemies, 2) inc_speed(small_enemies, 1) inc_speed(mid_enemies, 1) elif level == 3 and score > 300000: level = 4 upgrade_sound.play() add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 3) add_big_enemies(big_enemies, enemies, 2) inc_speed(small_enemies, 1) inc_speed(mid_enemies, 1) elif level == 4 and score > 1000000: level = 5 upgrade_sound.play() add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 3) add_big_enemies(big_enemies, enemies, 2) inc_speed(small_enemies, 1) inc_speed(mid_enemies, 1) screen.blit(background, (0, 0)) if life_num and not paused: # 绘制全屏炸弹补给并检测是否获得 if bomb_supply.active: bomb_supply.move() screen.blit(bomb_supply.image, bomb_supply.rect) if pygame.sprite.collide_mask(bomb_supply, me): get_bomb_sound.play() if bomb_num < 3: bomb_num += 1 bomb_supply.active = False #发射子弹 if not (delay % 10): bullet_sound.play() if is_double_bullet: bullets = bullet2 bullets[bullet2_index].reset( (me.rect.centerx - 33, me.rect.centery)) bullets[bullet2_index + 1].reset( (me.rect.centerx + 33, me.rect.centery)) bullet2_index = (bullet2_index + 2) % BULLET2_NUM else: bullets = bullet1 bullets[bullet1_index].reset(me.rect.midtop) bullet1_index = (bullet1_index + 1) % BULLET1_NUM #检测子弹是否击中敌机 for b in bullets: if b.active: b.move() screen.blit(b.image, b.rect) enemy_hit = pygame.sprite.spritecollide( b, enemies, False, pygame.sprite.collide_mask) if enemy_hit: b.active = False for e in enemy_hit: if e in mid_enemies or e in big_enemies: e.hit = True e.energy -= 1 if e.energy == 0: e.active = False else: e.active = False # 绘制全屏炸弹补给并检测是否获得 if bullet_supply.active: bullet_supply.move() screen.blit(bullet_supply.image, bullet_supply.rect) if pygame.sprite.collide_mask(bullet_supply, me): get_bullet_sound.play() is_double_bullet = True pygame.time.set_timer(DOUBLE_BULLET_TIME, 18 * 1000) bullet_supply.active = False # 绘制大型敌机 for each in big_enemies: if each.active: each.move() if each.hit: screen.blit(each.image_hit, each.rect) each.hit = False else: if switch_image: screen.blit(each.image1, each.rect) else: screen.blit(each.image2, each.rect) if each.rect.bottom == -50: enemy3_fly_sound.play(-1) # 绘制血槽 pygame.draw.line(screen, BLACK, \ (each.rect.left, each.rect.top - 5),\ (each.rect.right, each.rect.top - 5), \ 2) energy_remain = each.energy / enemy.BigEnemy.energy if energy_remain > 0.2: energy_color = GREEN else: energy_color = RED pygame.draw.line(screen, energy_color, \ (each.rect.left, each.rect.top -5), \ (each.rect.left + each.rect.width * energy_remain, \ each.rect.top - 5), \ 2) else: if not (delay % 3): if e3_destroy_index == 0: enemy3_down_sound.play() screen.blit(each.destroy_images[e3_destroy_index], each.rect) e3_destroy_index = (e3_destroy_index + 1) % 6 if e3_destroy_index == 0: me_down_sound.stop() score += 10000 each.reset() # 绘制中型敌机 for each in mid_enemies: if each.active: each.move() if each.hit: screen.blit(each.image_hit, each.rect) each.hit = False else: screen.blit(each.image1, each.rect) # 绘制血槽 pygame.draw.line(screen, BLACK, \ (each.rect.left, each.rect.top - 5),\ (each.rect.right, each.rect.top - 5), \ 2) energy_remain = each.energy / enemy.MidEnemy.energy if energy_remain > 0.2: energy_color = GREEN else: energy_color = RED pygame.draw.line(screen, energy_color, \ (each.rect.left, each.rect.top -5), \ (each.rect.left + each.rect.width * energy_remain, \ each.rect.top - 5), \ 2) else: if not (delay % 3): if e2_destroy_index == 0: enemy2_down_sound.play() screen.blit(each.destroy_images[e2_destroy_index], each.rect) e2_destroy_index = (e2_destroy_index + 1) % 4 if e2_destroy_index == 0: score += 5000 each.reset() # 绘制小型敌机 for each in small_enemies: if each.active: each.move() screen.blit(each.image1, each.rect) else: if not (delay % 3): if e1_destroy_index == 0: enemy1_down_sound.play() screen.blit(each.destroy_images[e1_destroy_index], each.rect) e1_destroy_index = (e1_destroy_index + 1) % 4 if e1_destroy_index == 0: score += 1000 each.reset() key_pressed = pygame.key.get_pressed() if key_pressed[K_w] or key_pressed[K_UP]: me.moveUp() if key_pressed[K_s] or key_pressed[K_DOWN]: me.moveDown() if key_pressed[K_a] or key_pressed[K_LEFT]: me.moveLeft() if key_pressed[K_d] or key_pressed[K_RIGHT]: me.moveRight() # 检测我方飞机是否被撞 enemies_down = pygame.sprite.spritecollide( me, enemies, False, pygame.sprite.collide_mask) if enemies_down and not me.invincible: me.active = False for e in enemies_down: e.active = False # 绘制我方飞机 if me.active: if switch_image: screen.blit(me.image1, me.rect) else: screen.blit(me.image2, me.rect) else: me_down_sound.play() if not (delay % 3): screen.blit(each.destroy_images[me_destroy_index], each.rect) me_destroy_index = (me_destroy_index + 1) % 4 # 剩余生命数量 if me_destroy_index == 0: life_num -= 1 me.reset() pygame.time.set_timer(INVINCEBLE_TIME, 3 * 1000) # 绘制剩余炸弹数量 bomb_text = bomb_font.render("x %d" % bomb_num, True, WHITE) text_rect = bomb_text.get_rect() screen.blit(bomb_image, (10, height - 10 - bomb_rect.height)) screen.blit(bomb_text, (20 + bomb_rect.width, height - 5 - text_rect.height)) if life_num: for i in range(life_num): screen.blit(life_image,\ (width - 10 - (i+1)*life_rect.width, \ height - 10 - life_rect.height)) score_text = score_font.render(str("Score: %s" % score), True, WHITE) screen.blit(score_text, (10, 5)) elif life_num == 0: pygame.mixer.music.stop() pygame.mixer.stop() # 停止发放补给 pygame.time.set_timer(SUPPLY_TIME, 0) if not recorded: recorded = True # 读取历史最高分 with open("record.txt", "r") as f: record_score = int(f.read()) if score > record_score: with open("record.txt", "w") as f: f.write(str(score)) with open("user.txt", "a") as fe: fe.write(usr_name + ' ' + str(score) + '\n') # 绘制结束画面 record_score_text = score_font.render("Best: %d" % record_score, True, WHITE) screen.blit(record_score_text, (50, 50)) gameover_text1 = gameover_font.render("Your Score: ", True, WHITE) gameover_text1_rect = gameover_text1.get_rect() gameover_text1_rect.left, gameover_text1_rect.top = \ (width - gameover_text1_rect.width) // 2, height // 2 screen.blit(gameover_text1, gameover_text1_rect) gameover_text2 = gameover_font.render(str(score), True, WHITE) gameover_text2_rect = gameover_text2.get_rect() gameover_text2_rect.left, gameover_text2_rect.top = \ (width - gameover_text2_rect.width) // 2, \ gameover_text1_rect.bottom + 10 screen.blit(gameover_text2, gameover_text2_rect) again_rect.left, again_rect.top = \ (width - again_rect.width) // 2,\ gameover_text2_rect.bottom + 50 screen.blit(again_image, again_rect) gameover_rect.left, gameover_rect.top = \ (width - again_rect.width) // 2, \ again_rect.bottom + 10 screen.blit(gameover_image, gameover_rect) # 检测用户的鼠标操作 # 如果用户按下鼠标左键 if pygame.mouse.get_pressed()[0]: pos = pygame.mouse.get_pos() if again_rect.left < pos[0] < again_rect.right and \ again_rect.top < pos[1] < again_rect.bottom: main() elif gameover_rect.left < pos[0] < gameover_rect.right and \ gameover_rect.top < pos[1] < gameover_rect.bottom: pygame.quit() sys.exit() screen.blit(paused_image, paused_rect) # 切换图片 if not (delay % 5): switch_image = not switch_image delay -= 1 if not delay: delay = 100 pygame.display.flip() clock.tick(60)
def main(): pygame.mixer.music.play(-1) # 生成我方飞机 me = myplane.MyPlane(bg_size) enemies = pygame.sprite.Group() # 生成敌方小型飞机 small_enemies = pygame.sprite.Group() add_small_enemies(small_enemies, enemies, 15) # 生成敌方中型飞机 mid_enemies = pygame.sprite.Group() add_mid_enemies(mid_enemies, enemies, 4) # 生成敌方大型飞机 big_enemies = pygame.sprite.Group() add_big_enemies(big_enemies, enemies, 2) # 生成普通子弹 bullet1 = [] bullet1_index = 0 BULLET1_NUM = 200 for i in range(BULLET1_NUM): bullet1.append(bullet.Bullet1(me.rect.midtop)) # 生成超级子弹 bullet2 = [] bullet2_index = 0 BULLET2_NUM = 200 for i in range(BULLET2_NUM//2): bullet2.append(bullet.Bullet2((me.rect.centerx-33, me.rect.centery))) bullet2.append(bullet.Bullet2((me.rect.centerx+30, me.rect.centery))) clock = pygame.time.Clock() # 中弹图片索引 e1_destroy_index = 0 e2_destroy_index = 0 e3_destroy_index = 0 me_destroy_index = 0 # 统计得分 score = 0 score_font = pygame.font.Font("font/font.ttf", 36) # 标志是否暂停游戏 paused = False pause_nor_image = pygame.image.load("images/pause_nor.png").convert_alpha() pause_pressed_image = pygame.image.load("images/pause_pressed.png").convert_alpha() resume_nor_image = pygame.image.load("images/resume_nor.png").convert_alpha() resume_pressed_image = pygame.image.load("images/resume_pressed.png").convert_alpha() paused_rect = pause_nor_image.get_rect() paused_rect.left, paused_rect.top = width - paused_rect.width - 10, 10 paused_image = pause_nor_image # 设置难度级别 level = 1 # 全屏炸弹 bomb_image = pygame.image.load("images/bomb.png").convert_alpha() bomb_rect = bomb_image.get_rect() bomb_font = pygame.font.Font("font/font.ttf", 48) bomb_num = 3 # 每30秒发放一个补给包 bullet_supply = supply.Bullet_Supply(bg_size) bomb_supply = supply.Bomb_Supply(bg_size) SUPPLY_TIME = USEREVENT pygame.time.set_timer(SUPPLY_TIME, 30 * 1000) # 超级子弹定时器 DOUBLE_BULLET_TIME = USEREVENT + 1 # 标志是否使用超级子弹 is_double_bullet = False # 解除我方无敌状态定时器 INVINCIBLE_TIME = USEREVENT + 2 # 生命数量 life_image = pygame.image.load("images/life.png").convert_alpha() life_rect = life_image.get_rect() life_num = 3 # 用于阻止重复打开记录文件 recorded = False # 游戏结束画面 gameover_font = pygame.font.Font("font/font.TTF", 48) again_image = pygame.image.load("images/again.png").convert_alpha() again_rect = again_image.get_rect() gameover_image = pygame.image.load("images/gameover.png").convert_alpha() gameover_rect = gameover_image.get_rect() # 跳转网页按钮 congratulation_image = pygame.image.load("images/Congratulations.png").convert_alpha() congratulation_rect = congratulation_image.get_rect() jump_image = pygame.image.load("images/jump.png").convert_alpha() jump_rect = jump_image.get_rect() # 用于切换图片 switch_image = True # 用于延迟 delay = 100 # 射速 shoot_speed = 25 # 目标分数 target_score = 20150217 running = True while running: # 检查是否达到目标分数 if score > target_score: paused = True pygame.time.set_timer(SUPPLY_TIME, 0) pygame.mixer.music.pause() pygame.mixer.pause() for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() elif event.type == MOUSEBUTTONDOWN: if event.button == 1 and paused_rect.collidepoint(event.pos): paused = not paused if paused: pygame.time.set_timer(SUPPLY_TIME, 0) pygame.mixer.music.pause() pygame.mixer.pause() else: if score > target_score: target_score = 9999999999999999 pygame.time.set_timer(SUPPLY_TIME, 30 * 1000) pygame.mixer.music.unpause() pygame.mixer.unpause() elif event.button == 1 and score > target_score and jump_rect.collidepoint(event.pos): webbrowser.open("https://chiangel.github.io/gift/love.html") elif event.type == MOUSEMOTION: if paused_rect.collidepoint(event.pos): if paused: paused_image = resume_pressed_image else: paused_image = pause_pressed_image else: if paused: paused_image = resume_nor_image else: paused_image = pause_nor_image elif event.type == KEYDOWN: if event.key == K_SPACE: if bomb_num: bomb_num -= 1 bomb_sound.play() for each in enemies: if each.rect.bottom > 0: each.active = False elif event.type == SUPPLY_TIME: supply_sound.play() if choice([True, False]): bomb_supply.reset() else: bullet_supply.reset() elif event.type == DOUBLE_BULLET_TIME: is_double_bullet = False pygame.time.set_timer(DOUBLE_BULLET_TIME, 0) elif event.type == INVINCIBLE_TIME: me.invincible = False pygame.time.set_timer(INVINCIBLE_TIME, 0) # 根据用户的得分增加难度 if level == 1 and score > 1000000: level = 2 upgrade_sound.play() # 增加3架小型敌机、2架中型敌机和1架大型敌机 add_small_enemies(small_enemies, enemies, 3) add_mid_enemies(mid_enemies, enemies, 2) add_big_enemies(big_enemies, enemies, 1) # 提升小型敌机的速度 inc_speed(small_enemies, 1) elif level == 2 and score > 5000000: level = 3 upgrade_sound.play() # 增加5架小型敌机、3架中型敌机和2架大型敌机 add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 3) add_big_enemies(big_enemies, enemies, 2) # 提升小型敌机的速度 inc_speed(small_enemies, 1) inc_speed(mid_enemies, 1) # 增加射速 shoot_speed = 20 elif level == 3 and score > 10000000: level = 4 upgrade_sound.play() # 增加5架小型敌机、3架中型敌机和2架大型敌机 add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 3) add_big_enemies(big_enemies, enemies, 2) # 提升小型敌机的速度 inc_speed(mid_enemies, 1) # 增加射速 shoot_speed = 10 elif level == 4 and score > 15000000: level = 5 upgrade_sound.play() # 增加5架小型敌机、3架中型敌机和2架大型敌机 add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 3) add_big_enemies(big_enemies, enemies, 2) # 提升小型敌机的速度 # inc_speed(small_enemies, 1) # inc_speed(mid_enemies, 1) # 增加射速 shoot_speed = 3 screen.blit(background, (0, 0)) if life_num and not paused: # 检测用户的键盘操作 key_pressed = pygame.key.get_pressed() if key_pressed[K_w] or key_pressed[K_UP]: me.moveUp() if key_pressed[K_s] or key_pressed[K_DOWN]: me.moveDown() if key_pressed[K_a] or key_pressed[K_LEFT]: me.moveLeft() if key_pressed[K_d] or key_pressed[K_RIGHT]: me.moveRight() # 绘制全屏炸弹补给并检测是否获得 if bomb_supply.active: bomb_supply.move() screen.blit(bomb_supply.image, bomb_supply.rect) if pygame.sprite.collide_mask(bomb_supply, me): get_bomb_sound.play() if bomb_num < 3: bomb_num += 1 bomb_supply.active = False # 绘制超级子弹补给并检测是否获得 if bullet_supply.active: bullet_supply.move() screen.blit(bullet_supply.image, bullet_supply.rect) if pygame.sprite.collide_mask(bullet_supply, me): get_bullet_sound.play() is_double_bullet = True pygame.time.set_timer(DOUBLE_BULLET_TIME, 18 * 1000) bullet_supply.active = False # 发射子弹 if not(delay % shoot_speed): bullet_sound.play() if is_double_bullet: bullets = bullet2 bullets[bullet2_index].reset((me.rect.centerx-33, me.rect.centery)) bullets[bullet2_index+1].reset((me.rect.centerx+30, me.rect.centery)) bullet2_index = (bullet2_index + 2) % BULLET2_NUM else: bullets = bullet1 bullets[bullet1_index].reset(me.rect.midtop) bullet1_index = (bullet1_index + 1) % BULLET1_NUM # 检测子弹是否击中敌机 for b in bullets: if b.active: b.move() screen.blit(b.image, b.rect) enemy_hit = pygame.sprite.spritecollide(b, enemies, False, pygame.sprite.collide_mask) if enemy_hit: b.active = False for e in enemy_hit: if e in mid_enemies or e in big_enemies: e.hit = True e.energy -= 1 if e.energy == 0: e.active = False else: e.active = False # 绘制大型敌机 for each in big_enemies: if each.active: each.move() if each.hit: screen.blit(each.image_hit, each.rect) each.hit = False else: if switch_image: screen.blit(each.image1, each.rect) else: screen.blit(each.image2, each.rect) # 绘制血槽 pygame.draw.line(screen, BLACK, \ (each.rect.left, each.rect.top - 5), \ (each.rect.right, each.rect.top - 5), \ 2) # 当生命大于20%显示绿色,否则显示红色 energy_remain = each.energy / enemy.BigEnemy.energy if energy_remain > 0.2: energy_color = GREEN else: energy_color = RED pygame.draw.line(screen, energy_color, \ (each.rect.left, each.rect.top - 5), \ (each.rect.left + each.rect.width * energy_remain, \ each.rect.top - 5), 2) # 即将出现在画面中,播放音效 if each.rect.bottom == -50: enemy3_fly_sound.play(-1) else: # 毁灭 if not(delay % 3): if e3_destroy_index == 0: enemy3_down_sound.play() screen.blit(each.destroy_images[e3_destroy_index], each.rect) e3_destroy_index = (e3_destroy_index + 1) % 6 if e3_destroy_index == 0: enemy3_fly_sound.stop() score += 400000 each.reset() # 绘制中型敌机: for each in mid_enemies: if each.active: each.move() if each.hit: screen.blit(each.image_hit, each.rect) each.hit = False else: screen.blit(each.image, each.rect) # 绘制血槽 pygame.draw.line(screen, BLACK, \ (each.rect.left, each.rect.top - 5), \ (each.rect.right, each.rect.top - 5), \ 2) # 当生命大于20%显示绿色,否则显示红色 energy_remain = each.energy / enemy.MidEnemy.energy if energy_remain > 0.2: energy_color = GREEN else: energy_color = RED pygame.draw.line(screen, energy_color, \ (each.rect.left, each.rect.top - 5), \ (each.rect.left + each.rect.width * energy_remain, \ each.rect.top - 5), 2) else: # 毁灭 if not(delay % 3): if e2_destroy_index == 0: enemy2_down_sound.play() screen.blit(each.destroy_images[e2_destroy_index], each.rect) e2_destroy_index = (e2_destroy_index + 1) % 4 if e2_destroy_index == 0: score += 160000 each.reset() # 绘制小型敌机: for each in small_enemies: if each.active: each.move() screen.blit(each.image, each.rect) else: # 毁灭 if not(delay % 3): if e1_destroy_index == 0: enemy1_down_sound.play() screen.blit(each.destroy_images[e1_destroy_index], each.rect) e1_destroy_index = (e1_destroy_index + 1) % 4 if e1_destroy_index == 0: score += 30000 each.reset() # 检测我方飞机是否被撞 enemies_down = pygame.sprite.spritecollide(me, enemies, False, pygame.sprite.collide_mask) if enemies_down and not me.invincible: me.active = False for e in enemies_down: e.active = False # 绘制我方飞机 if me.active: if switch_image: screen.blit(me.image1, me.rect) else: screen.blit(me.image2, me.rect) else: # 毁灭 if not(delay % 3): if me_destroy_index == 0: me_down_sound.play() screen.blit(me.destroy_images[me_destroy_index], me.rect) me_destroy_index = (me_destroy_index + 1) % 4 if me_destroy_index == 0: life_num -= 1 me.reset() pygame.time.set_timer(INVINCIBLE_TIME, 3 * 1000) # 绘制全屏炸弹数量 bomb_text = bomb_font.render("× %d" % bomb_num, True, WHITE) text_rect = bomb_text.get_rect() screen.blit(bomb_image, (10, height - 10 - bomb_rect.height)) screen.blit(bomb_text, (20 + bomb_rect.width, height - 5 - text_rect.height)) # 绘制剩余生命数量 if life_num: for i in range(life_num): screen.blit(life_image, \ (width-10-(i+1)*life_rect.width, \ height-10-life_rect.height)) elif paused and score > target_score: congratulation_rect.left, congratulation_rect.top = (width - congratulation_rect.width) // 2, 150 screen.blit(congratulation_image, congratulation_rect) jump_rect.left, jump_rect.top = (width - jump_rect.width) // 2, congratulation_rect.bottom + 10 screen.blit(jump_image, jump_rect) '''# 检测用户的鼠标操作 # 如果用户按下鼠标左键 if pygame.mouse.get_pressed()[0]: # 获取鼠标坐标 pos = pygame.mouse.get_pos() # 如果用户点击“跳转至精美相册” if jump_rect.left < pos[0] < jump_rect.right and \ jump_rect.top < pos[1] < jump_rect.bottom: # 跳转网页 target_score = 9999999999999999 webbrowser.open("https://chiangel.github.io/gift/love.html") # 如果用户点击“暂停/继续按钮” elif paused_rect.left < pos[0] < paused_rect.right and \ paused_rect.top < pos[1] < paused_rect.bottom: # 继续游戏 paused = False pygame.time.set_timer(SUPPLY_TIME, 30 * 1000) pygame.mixer.music.unpause() pygame.mixer.unpause()''' # 绘制游戏结束画面 elif life_num == 0: # 背景音乐停止 pygame.mixer.music.stop() # 停止全部音效 pygame.mixer.stop() # 停止发放补给 pygame.time.set_timer(SUPPLY_TIME, 0) if not recorded: recorded = True # 读取历史最高得分 try: with open("recor.txt", "r") as f: print(type(f)) record_score = int(f.read()) except: record_score = 0 # 如果玩家得分高于历史最高得分,则存档 if score > record_score: record_score = score with open("record.txt", "w") as f: f.write(str(record_score)) # 绘制结束画面 record_score_text = score_font.render("Best : %d" % record_score, True, (255, 255, 255)) screen.blit(record_score_text, (10, 100)) gameover_text1 = gameover_font.render("Your Score", True, (255, 255, 255)) gameover_text1_rect = gameover_text1.get_rect() gameover_text1_rect.left, gameover_text1_rect.top = \ (width - gameover_text1_rect.width) // 2, height // 3 screen.blit(gameover_text1, gameover_text1_rect) gameover_text2 = gameover_font.render(str(score), True, (255, 255, 255)) gameover_text2_rect = gameover_text2.get_rect() gameover_text2_rect.left, gameover_text2_rect.top = \ (width - gameover_text2_rect.width) // 2, \ gameover_text1_rect.bottom + 10 screen.blit(gameover_text2, gameover_text2_rect) again_rect.left, again_rect.top = \ (width - again_rect.width) // 2, \ gameover_text2_rect.bottom + 50 screen.blit(again_image, again_rect) gameover_rect.left, gameover_rect.top = \ (width - again_rect.width) // 2, \ again_rect.bottom + 10 screen.blit(gameover_image, gameover_rect) # 检测用户的鼠标操作 # 如果用户按下鼠标左键 if pygame.mouse.get_pressed()[0]: # 获取鼠标坐标 pos = pygame.mouse.get_pos() # 如果用户点击“重新开始” if again_rect.left < pos[0] < again_rect.right and \ again_rect.top < pos[1] < again_rect.bottom: # 调用main函数,重新开始游戏 main() # 如果用户点击“结束游戏” elif gameover_rect.left < pos[0] < gameover_rect.right and \ gameover_rect.top < pos[1] < gameover_rect.bottom: # 退出游戏 pygame.quit() sys.exit() # 绘制暂停按钮 screen.blit(paused_image, paused_rect) # 绘制目标得分 target_score_text = score_font.render("Target : %s" % str(target_score), True, WHITE) screen.blit(target_score_text, (10, 5)) # 绘制得分 score_text = score_font.render("Score : %s" % str(score), True, WHITE) screen.blit(score_text, (10, 50)) # 切换图片 if not(delay % 5): switch_image = not switch_image delay -= 1 if not delay: delay = 100 pygame.display.flip() clock.tick(60)
def main(): pygame.mixer.music.play(-1) #生成我方飞机 me = myplane.MyPlane(bg_size) enemies = pygame.sprite.Group() #生成小飞机 small_enemies = pygame.sprite.Group() add_small_enemies(small_enemies, enemies, 15) #生成中飞机 mid_enemies = pygame.sprite.Group() add_mid_enemies(mid_enemies, enemies, 4) #生成大飞机 big_enemies = pygame.sprite.Group() add_big_enemies(big_enemies, enemies, 2) #生成一级子弹 bullet1 = [] bullet1_index = 0 BULLET1_NUM = 4 for i in range(BULLET1_NUM): bullet1.append(bullet.Bullet1(me.rect.midtop)) #生成2级子弹 bullet2 = [] bullet2_index = 0 BULLET2_NUM = 8 for i in range(BULLET2_NUM // 2): bullet2.append(bullet.Bullet2((me.rect.centerx - 33, me.rect.centery))) bullet2.append(bullet.Bullet2((me.rect.centerx + 30, me.rect.centery))) clock = pygame.time.Clock() running = True switch_image = True delay = 100 e1_destroy_index = 0 e2_destroy_index = 0 e3_destroy_index = 0 me_destroy_index = 0 #分数统计 score = 0 score_font = pygame.font.Font("font/font.ttf", 36) #是否暂停 pause_nor_image = pygame.image.load("images/pause_nor.png").convert_alpha() pause_pressed_image = pygame.image.load( "images/pause_pressed.png").convert_alpha() resume_nor_image = pygame.image.load( "images/resume_nor.png").convert_alpha() resume_pressed_image = pygame.image.load( "images/resume_pressed.png").convert_alpha() paused_rect = pause_nor_image.get_rect() paused_rect.left, paused_rect.top = width - paused_rect.width - 10, 10 paused_image = pause_nor_image paused = False # 游戏结束画面 gameover_font = pygame.font.Font("font/font.TTF", 48) again_image = pygame.image.load("images/again.png").convert_alpha() again_rect = again_image.get_rect() gameover_image = pygame.image.load("images/gameover.png").convert_alpha() gameover_rect = gameover_image.get_rect() #难度级别 level = 1 #全屏炸弹 bomb_image = pygame.image.load("images/bomb.png").convert_alpha() bomb_rect = bomb_image.get_rect() bomb_font = pygame.font.Font("font/font.ttf", 48) bomb_num = 3 #补给包 bullet_supply = supply.Bullet_Supply(bg_size) bomb_supply = supply.Bomb_Supply(bg_size) SUPPLY_TIME = USEREVENT pygame.time.set_timer(SUPPLY_TIME, 30 * 1000) #二级子弹计时 DOUBLE_BULLET_TIME = USEREVENT + 1 #无敌时间 INVINCIBLE_TIME = USEREVENT + 2 #是否为二级子弹 is_double_bullet = False #生命数量 life_image = pygame.image.load("images/life.png").convert_alpha() life_rect = life_image.get_rect() life_num = 3 #分数记录文件只打开一次 recorded = False while running: for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() elif event.type == MOUSEBUTTONDOWN: if event.button == 1 and paused_rect.collidepoint(event.pos): paused = not paused if paused: pygame.time.set_timer(SUPPLY_TIME, 0) pygame.mixer.music.pause() pygame.mixer.pause() else: pygame.time.set_timer(SUPPLY_TIME, 30 * 1000) pygame.mixer.music.unpause() pygame.mixer.unpause() elif event.type == MOUSEMOTION: if paused_rect.collidepoint(event.pos): if paused: paused_image = resume_pressed_image else: paused_image = pause_pressed_image else: if paused: paused_image = resume_nor_image else: paused_image = pause_nor_image elif event.type == KEYDOWN: if event.key == K_SPACE: if bomb_num: bomb_num -= 1 bomb_sound.play() for each in enemies: if each.rect.bottom > 0: each.active = False elif event.type == SUPPLY_TIME: supply_sound.play() if random.choice([True, False]): bomb_supply.reset() else: bullet_supply.reset() elif event.type == DOUBLE_BULLET_TIME: is_double_bullet = False pygame.time.set_timer(DOUBLE_BULLET_TIME, 0) elif event.type == INVINCIBLE_TIME: me.invincible = False pygame.time.set_timer(INVINCIBLE_TIME, 0) if level == 1 and score > 50000: level = 2 upgrade_sound.play() add_small_enemies(small_enemies, enemies, 3) add_mid_enemies(mid_enemies, enemies, 2) add_big_enemies(big_enemies, enemies, 1) inc_speed(small_enemies, 1) elif level == 2 and score > 300000: level = 3 upgrade_sound.play() add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 3) add_big_enemies(big_enemies, enemies, 2) inc_speed(small_enemies, 1) inc_speed(mid_enemies, 1) elif level == 3 and score > 800000: level = 4 upgrade_sound.play() add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 3) add_big_enemies(big_enemies, enemies, 2) inc_speed(small_enemies, 1) inc_speed(mid_enemies, 1) elif level == 4 and score > 2000000: level = 5 upgrade_sound.play() add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 3) add_big_enemies(big_enemies, enemies, 2) inc_speed(small_enemies, 1) inc_speed(mid_enemies, 1) screen.blit(background, (0, 0)) if life_num and not paused: key_pressed = pygame.key.get_pressed() if key_pressed[K_w] or key_pressed[K_UP]: me.moveUp() if key_pressed[K_s] or key_pressed[K_DOWN]: me.moveDown() if key_pressed[K_a] or key_pressed[K_LEFT]: me.moveLeft() if key_pressed[K_d] or key_pressed[K_RIGHT]: me.moveRight() #绘制补给 if bomb_supply.active: bomb_supply.move() screen.blit(bomb_supply.image, bomb_supply.rect) if pygame.sprite.collide_mask(bomb_supply, me): get_bullet_sound.play() if bomb_num < 3: bomb_num += 1 bomb_supply.active = False if bullet_supply.active: bullet_supply.move() screen.blit(bullet_supply.image, bullet_supply.rect) if pygame.sprite.collide_mask(bullet_supply, me): get_bullet_sound.play() is_double_bullet = True pygame.time.set_timer(DOUBLE_BULLET_TIME, 18 * 1000) bullet_supply.active = False #发射子弹 if not (delay % 10): bullet_sound.play() if is_double_bullet: bullets = bullet2 bullets[bullet2_index].reset( (me.rect.centerx - 33, me.rect.centery)) bullets[bullet2_index + 1].reset( (me.rect.centerx + 30, me.rect.centery)) bullet2_index = (bullet2_index + 2) % BULLET2_NUM else: bullets = bullet1 bullet1[bullet1_index].reset(me.rect.midtop) bullet1_index = (bullet1_index + 1) % BULLET1_NUM #检测敌机是否被击中 for b in bullets: if b.active: b.move() screen.blit(b.image, b.rect) enemy_hit = pygame.sprite.spritecollide( b, enemies, False, pygame.sprite.collide_mask) if enemy_hit: b.active = False for e in enemy_hit: if e in mid_enemies or e in big_enemies: e.hit = True e.energy -= 1 if e.energy == 0: e.active = False else: e.active = False #绘制大飞机 for each in big_enemies: if each.active: each.move() if each.hit: screen.blit(each.image_hit, each.rect) each.hit = False else: if switch_image: screen.blit(each.image1, each.rect) else: screen.blit(each.image2, each.rect) pygame.draw.line(screen, BLACK,\ (each.rect.left, each.rect.top -5 ),\ (each.rect.right, each.rect.top -5 ), 2) energy_remain = each.energy / enemy.BigEnemy.energy if energy_remain > 0.2: energy_color = GREEN else: energy_color = RED pygame.draw.line(screen, energy_color,\ (each.rect.left, each.rect.top - 5),\ (each.rect.left + each.rect.width * energy_remain,\ each.rect.top - 5), 2) if each.rect.bottom > -50: enemy3_flying_sound.play(-1) else: if not (delay % 5): if e1_destroy_index == 0: enemy3_down_sound.play() screen.blit(each.destroy_images[e3_destroy_index], each.rect) e3_destroy_index = (e3_destroy_index + 1) % 6 if e3_destroy_index == 0: score += 10000 enemy3_flying_sound.stop() each.reset() #绘制中飞机 for each in mid_enemies: if each.active: each.move() if each.hit: screen.blit(each.image_hit, each.rect) each.hit = False else: screen.blit(each.image, each.rect) pygame.draw.line(screen, BLACK,\ (each.rect.left, each.rect.top -5 ),\ (each.rect.right, each.rect.top -5 ), 2) energy_remain = each.energy / enemy.MidEnemy.energy if energy_remain > 0.2: energy_color = GREEN else: energy_color = RED pygame.draw.line(screen, energy_color,\ (each.rect.left, each.rect.top - 5),\ (each.rect.left + each.rect.width * energy_remain,\ each.rect.top - 5), 2) else: if not (delay % 5): if e2_destroy_index == 0: enemy2_down_sound.play() screen.blit(each.destroy_images[e2_destroy_index], each.rect) e2_destroy_index = (e2_destroy_index + 1) % 4 if e2_destroy_index == 0: score += 6000 each.reset() #绘制小飞机 for each in small_enemies: if each.active: each.move() screen.blit(each.image, each.rect) else: if not (delay % 5): if e1_destroy_index == 0: enemy1_down_sound.play() screen.blit(each.destroy_images[e1_destroy_index], each.rect) e1_destroy_index = (e1_destroy_index + 1) % 4 if e1_destroy_index == 0: score += 1000 each.reset() #检测我方飞机是否碰撞 enemies_down = pygame.sprite.spritecollide( me, enemies, False, pygame.sprite.collide_mask) if enemies_down and not me.invincible: me.active = False for e in enemies_down: e.active = False #绘制我方飞机 if me.active: if switch_image: screen.blit(me.image1, me.rect) else: screen.blit(me.image2, me.rect) else: if not (delay % 5): if me_destroy_index == 0: me_down_sound.play() screen.blit(each.destroy_images[me_destroy_index], me.rect) me_destroy_index = (me_destroy_index + 1) % 4 if me_destroy_index == 0: life_num -= 1 me.reset() pygame.time.set_timer(INVINCIBLE_TIME, 3 * 1000) #绘制炸弹数 bomb_text = bomb_font.render("x %d" % bomb_num, True, WHITE) text_rect = bomb_text.get_rect() screen.blit(bomb_image, (10, height - 10 - bomb_rect.height)) screen.blit(bomb_text, (20 + bomb_rect.width, height - 5 - text_rect.height)) #绘制life数 if life_num: for i in range(life_num): screen.blit(life_image,\ (width-10-(i+1)*life_rect.width,\ height-10-life_rect.height)) #绘制分数 score_text = score_font.render("Score: %s" % str(score), True, WHITE) screen.blit(score_text, (10, 5)) #绘制结束画面 elif life_num == 0: #关背景音乐 pygame.mixer.music.stop() #关其他音效 pygame.mixer.stop() #关闭补给 pygame.time.set_timer(SUPPLY_TIME, 0) if not recorded: recorded = True #读取历史最高分与当前得分比较 with open("record.txt", "r") as f: record_score = int(f.read()) #保存比较结果 if score > record_score: with open("record.txt", "w") as f: f.write(str(score)) #绘制结束界面 record_score_text = score_font.render("Best : %d" % record_score, True, (255, 255, 255)) screen.blit(record_score_text, (50, 50)) gameover_text1 = gameover_font.render("Your Score", True, (255, 255, 255)) gameover_text1_rect = gameover_text1.get_rect() gameover_text1_rect.left, gameover_text1_rect.top = \ (width - gameover_text1_rect.width) // 2, height // 3 screen.blit(gameover_text1, gameover_text1_rect) gameover_text2 = gameover_font.render(str(score), True, (255, 255, 255)) gameover_text2_rect = gameover_text2.get_rect() gameover_text2_rect.left, gameover_text2_rect.top = \ (width - gameover_text2_rect.width) // 2, \ gameover_text1_rect.bottom + 10 screen.blit(gameover_text2, gameover_text2_rect) again_rect.left, again_rect.top = \ (width - again_rect.width) // 2, \ gameover_text2_rect.bottom + 50 screen.blit(again_image, again_rect) gameover_rect.left, gameover_rect.top = \ (width - again_rect.width) // 2, \ again_rect.bottom + 10 screen.blit(gameover_image, gameover_rect) # 检测用户的鼠标操作 # 如果用户按下鼠标左键 if pygame.mouse.get_pressed()[0]: # 获取鼠标坐标 pos = pygame.mouse.get_pos() # 如果用户点击“重新开始” if again_rect.left < pos[0] < again_rect.right and \ again_rect.top < pos[1] < again_rect.bottom: # 调用main函数,重新开始游戏 main() # 如果用户点击“结束游戏” elif gameover_rect.left < pos[0] < gameover_rect.right and \ gameover_rect.top < pos[1] < gameover_rect.bottom: # 退出游戏 pygame.quit() sys.exit() #绘制暂停按钮 screen.blit(paused_image, paused_rect) #切换图片 if not (delay % 5): switch_image = not switch_image delay -= 1 if not delay: delay = 100 pygame.display.flip() clock.tick(60)
def main(): pygame.mixer.music.play(-1) # 生成我方飞机 me = myplane.MyPlane(bg_size) enemies = pygame.sprite.Group() # 生成敌方小型飞机 small_enemies = pygame.sprite.Group() add_small_enemies(small_enemies, enemies, 15) # 生成敌方中型飞机 mid_enemies = pygame.sprite.Group() add_mid_enemies(mid_enemies, enemies, 4) # 生成敌方大型飞机 big_enemies = pygame.sprite.Group() add_big_enemies(big_enemies, enemies, 2) # 生成普通子弹 bullet1 = [] bullet1_index = 0 BULLET1_NUM = 4 for i in range(BULLET1_NUM): bullet1.append(bullet.Bullet1(me.rect.midtop)) # 生成超级子弹 bullet2 = [] bullet2_index = 0 BULLET2_NUM = 8 for i in range(BULLET2_NUM // 2): bullet2.append(bullet.Bullet2((me.rect.centerx - 33, me.rect.centery))) bullet2.append(bullet.Bullet2((me.rect.centerx + 30, me.rect.centery))) clock = pygame.time.Clock() # 中弹图片索引 e1_destroy_index = 0 e2_destroy_index = 0 e3_destroy_index = 0 me_destroy_index = 0 # 统计得分 score = 0 score_font = pygame.font.Font("font/font.ttf", 36) # 标志是否暂停游戏 paused = False pause_nor_image = pygame.image.load("images/pause_nor.png").convert_alpha() pause_pressed_image = pygame.image.load( "images/pause_pressed.png").convert_alpha() resume_nor_image = pygame.image.load( "images/resume_nor.png").convert_alpha() resume_pressed_image = pygame.image.load( "images/resume_pressed.png").convert_alpha() paused_rect = pause_nor_image.get_rect() paused_rect.left, paused_rect.top = width - paused_rect.width - 10, 10 paused_image = pause_nor_image # 设置难度级别 level = 1 # 全屏炸弹 bomb_image = pygame.image.load("images/bomb.png").convert_alpha() bomb_rect = bomb_image.get_rect() bomb_font = pygame.font.Font("font/font.ttf", 48) bomb_num = 3 # 每30秒发放一个补给包 bullet_supply = supply.Bullet_Supply(bg_size) bomb_supply = supply.Bomb_Supply(bg_size) SUPPLY_TIME = USEREVENT pygame.time.set_timer(SUPPLY_TIME, 30 * 1000) # 超级子弹定时器 DOUBLE_BULLET_TIME = USEREVENT + 1 # 标志是否使用超级子弹 is_double_bullet = False # 用于切换图片 switch_image = True # 用于延迟 delay = 100 running = True while running: for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() elif event.type == MOUSEBUTTONDOWN: if event.button == 1 and paused_rect.collidepoint(event.pos): paused = not paused if paused: pygame.time.set_timer(SUPPLY_TIME, 0) pygame.mixer.music.pause() pygame.mixer.pause() else: pygame.time.set_timer(SUPPLY_TIME, 30 * 1000) pygame.mixer.music.unpause() pygame.mixer.unpause() elif event.type == MOUSEMOTION: if paused_rect.collidepoint(event.pos): if paused: paused_image = resume_pressed_image else: paused_image = pause_pressed_image else: if paused: paused_image = resume_nor_image else: paused_image = pause_nor_image elif event.type == KEYDOWN: if event.key == K_SPACE: if bomb_num: bomb_num -= 1 bomb_sound.play() for each in enemies: if each.rect.bottom > 0: each.active = False elif event.type == SUPPLY_TIME: supply_sound.play() if choice([True, False]): bomb_supply.reset() else: bullet_supply.reset() elif event.type == DOUBLE_BULLET_TIME: is_double_bullet = False pygame.time.set_timer(DOUBLE_BULLET_TIME, 0) # 根据用户的得分增加难度 if level == 1 and score > 50000: level = 2 upgrade_sound.play() # 增加3架小型敌机、2架中型敌机和1架大型敌机 add_small_enemies(small_enemies, enemies, 3) add_mid_enemies(mid_enemies, enemies, 2) add_big_enemies(big_enemies, enemies, 1) # 提升小型敌机的速度 inc_speed(small_enemies, 1) elif level == 2 and score > 300000: level = 3 upgrade_sound.play() # 增加5架小型敌机、3架中型敌机和2架大型敌机 add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 3) add_big_enemies(big_enemies, enemies, 2) # 提升小型敌机的速度 inc_speed(small_enemies, 1) inc_speed(mid_enemies, 1) elif level == 3 and score > 600000: level = 4 upgrade_sound.play() # 增加5架小型敌机、3架中型敌机和2架大型敌机 add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 3) add_big_enemies(big_enemies, enemies, 2) # 提升小型敌机的速度 inc_speed(small_enemies, 1) inc_speed(mid_enemies, 1) elif level == 4 and score > 1000000: level = 5 upgrade_sound.play() # 增加5架小型敌机、3架中型敌机和2架大型敌机 add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 3) add_big_enemies(big_enemies, enemies, 2) # 提升小型敌机的速度 inc_speed(small_enemies, 1) inc_speed(mid_enemies, 1) screen.blit(background, (0, 0)) if not paused: # 检测用户的键盘操作 key_pressed = pygame.key.get_pressed() if key_pressed[K_w] or key_pressed[K_UP]: me.moveUp() if key_pressed[K_s] or key_pressed[K_DOWN]: me.moveDown() if key_pressed[K_a] or key_pressed[K_LEFT]: me.moveLeft() if key_pressed[K_d] or key_pressed[K_RIGHT]: me.moveRight() # 绘制全屏炸弹补给并检测是否获得 if bomb_supply.active: bomb_supply.move() screen.blit(bomb_supply.image, bomb_supply.rect) if pygame.sprite.collide_mask(bomb_supply, me): get_bomb_sound.play() if bomb_num < 3: bomb_num += 1 bomb_supply.active = False # 绘制超级子弹补给并检测是否获得 if bullet_supply.active: bullet_supply.move() screen.blit(bullet_supply.image, bullet_supply.rect) if pygame.sprite.collide_mask(bullet_supply, me): get_bullet_sound.play() is_double_bullet = True pygame.time.set_timer(DOUBLE_BULLET_TIME, 18 * 1000) bullet_supply.active = False # 发射子弹 if not (delay % 10): bullet_sound.play() if is_double_bullet: bullets = bullet2 bullets[bullet2_index].reset( (me.rect.centerx - 33, me.rect.centery)) bullets[bullet2_index + 1].reset( (me.rect.centerx + 30, me.rect.centery)) bullet2_index = (bullet2_index + 2) % BULLET2_NUM else: bullets = bullet1 bullets[bullet1_index].reset(me.rect.midtop) bullet1_index = (bullet1_index + 1) % BULLET1_NUM # 检测子弹是否击中敌机 for b in bullets: if b.active: b.move() screen.blit(b.image, b.rect) enemy_hit = pygame.sprite.spritecollide( b, enemies, False, pygame.sprite.collide_mask) if enemy_hit: b.active = False for e in enemy_hit: if e in mid_enemies or e in big_enemies: e.hit = True e.energy -= 1 if e.energy == 0: e.active = False else: e.active = False # 绘制大型敌机 for each in big_enemies: if each.active: each.move() if each.hit: screen.blit(each.image_hit, each.rect) each.hit = False else: if switch_image: screen.blit(each.image1, each.rect) else: screen.blit(each.image2, each.rect) # 绘制血槽 pygame.draw.line(screen, BLACK, \ (each.rect.left, each.rect.top - 5), \ (each.rect.right, each.rect.top - 5), \ 2) # 当生命大于20%显示绿色,否则显示红色 energy_remain = each.energy / enemy.BigEnemy.energy if energy_remain > 0.2: energy_color = GREEN else: energy_color = RED pygame.draw.line(screen, energy_color, \ (each.rect.left, each.rect.top - 5), \ (each.rect.left + each.rect.width * energy_remain, \ each.rect.top - 5), 2) # 即将出现在画面中,播放音效 if each.rect.bottom == -50: enemy3_fly_sound.play(-1) else: # 毁灭 if not (delay % 3): if e3_destroy_index == 0: enemy3_down_sound.play() screen.blit(each.destroy_images[e3_destroy_index], each.rect) e3_destroy_index = (e3_destroy_index + 1) % 6 if e3_destroy_index == 0: enemy3_fly_sound.stop() score += 10000 each.reset() # 绘制中型敌机: for each in mid_enemies: if each.active: each.move() if each.hit: screen.blit(each.image_hit, each.rect) each.hit = False else: screen.blit(each.image, each.rect) # 绘制血槽 pygame.draw.line(screen, BLACK, \ (each.rect.left, each.rect.top - 5), \ (each.rect.right, each.rect.top - 5), \ 2) # 当生命大于20%显示绿色,否则显示红色 energy_remain = each.energy / enemy.MidEnemy.energy if energy_remain > 0.2: energy_color = GREEN else: energy_color = RED pygame.draw.line(screen, energy_color, \ (each.rect.left, each.rect.top - 5), \ (each.rect.left + each.rect.width * energy_remain, \ each.rect.top - 5), 2) else: # 毁灭 if not (delay % 3): if e2_destroy_index == 0: enemy2_down_sound.play() screen.blit(each.destroy_images[e2_destroy_index], each.rect) e2_destroy_index = (e2_destroy_index + 1) % 4 if e2_destroy_index == 0: score += 6000 each.reset() # 绘制小型敌机: for each in small_enemies: if each.active: each.move() screen.blit(each.image, each.rect) else: # 毁灭 if not (delay % 3): if e1_destroy_index == 0: enemy1_down_sound.play() screen.blit(each.destroy_images[e1_destroy_index], each.rect) e1_destroy_index = (e1_destroy_index + 1) % 4 if e1_destroy_index == 0: score += 1000 each.reset() # 检测我方飞机是否被撞 enemies_down = pygame.sprite.spritecollide( me, enemies, False, pygame.sprite.collide_mask) if enemies_down: # me.active = False for e in enemies_down: e.active = False # 绘制我方飞机 if me.active: if switch_image: screen.blit(me.image1, me.rect) else: screen.blit(me.image2, me.rect) else: # 毁灭 if not (delay % 3): if me_destroy_index == 0: me_down_sound.play() screen.blit(me.destroy_images[me_destroy_index], me.rect) me_destroy_index = (me_destroy_index + 1) % 4 if me_destroy_index == 0: print("Game Over!") running = False # 绘制全屏炸弹数量 bomb_text = bomb_font.render("× %d" % bomb_num, True, WHITE) text_rect = bomb_text.get_rect() screen.blit(bomb_image, (10, height - 10 - bomb_rect.height)) screen.blit(bomb_text, (20 + bomb_rect.width, height - 5 - text_rect.height)) # 绘制得分 score_text = score_font.render("Score : %s" % str(score), True, WHITE) screen.blit(score_text, (10, 5)) # 绘制暂停按钮 screen.blit(paused_image, paused_rect) # 切换图片 if not (delay % 5): switch_image = not switch_image delay -= 1 if not delay: delay = 100 pygame.display.flip() clock.tick(60)
def main(): pygame.mixer.music.play(-1) #生成主角飞机 me = myplane.MyPlane(bg_size) #生成敌机 enemies = pygame.sprite.Group() #小飞机 small_enemies = pygame.sprite.Group() add_small_enemies(small_enemies, enemies, 15) #中飞机 mid_enemies = pygame.sprite.Group() add_mid_enemies(mid_enemies, enemies, 4) #大飞机 big_enemies = pygame.sprite.Group() add_big_enemies(big_enemies, enemies, 15) #只打开一次文件 recorded = False #一般的子弹 bullet1 = [] bullet1_index = 0 BULLET1_NUM = 6 for i in range(BULLET1_NUM): bullet1.append(bullet.Bullet1(me.rect.midtop)) clock = pygame.time.Clock() #超级子弹 DOUBLE_BULLTET_TIME = USEREVENT + 1 is_double_bullet = False bullet2 = [] bullet2_index = 0 BULLET2_NUM = 12 for i in range(BULLET2_NUM // 2): bullet2.append(bullet.Bullet2((me.rect.centerx - 33, me.rect.centery))) bullet2.append(bullet.Bullet2((me.rect.centerx + 30, me.rect.centery))) clock = pygame.time.Clock() #无敌时间 INVINCIBLE_TIME = USEREVENT + 2 #命 life_image = pygame.image.load('images/life.png').convert_alpha() life_rect = life_image.get_rect() life_num = 5 #中弹图片索引 e1_destroy_index = 0 e2_destroy_index = 0 e3_destroy_index = 0 me_destroy_index = 0 #统计得分 score = 0 score_font = pygame.font.Font('font/againts refresh.ttf', 44) #难度 level = 1 #炸弹 bomb_image = pygame.image.load('images/bomb.png').convert_alpha() bomb_rect = bomb_image.get_rect() bomb_font = pygame.font.Font('font/againts refresh.ttf', 54) bomb_num = 3 # 游戏结束画面 gameover_font = pygame.font.Font('font/againts refresh.ttf', 48) again_image = pygame.image.load("images/again.png").convert_alpha() again_rect = again_image.get_rect() gameover_image = pygame.image.load("images/gameover.png").convert_alpha() gameover_rect = gameover_image.get_rect() #发放补给包 bullet_supply = supply.Bullet_Supply(bg_size) bomb_supply = supply.Bomb_Supply(bg_size) SUPPLY_TIME = USEREVENT pygame.time.set_timer(SUPPLY_TIME, 15 * 1000) #暂停 paused = False pause_nor_image = pygame.image.load('images/pause_nor.png').convert_alpha() pause_pressed_image = pygame.image.load( 'images/pause_pressed.png').convert_alpha() resume_nor_image = pygame.image.load( 'images/resume_pressed.png').convert_alpha() resume_pressed_image = pygame.image.load( 'images/resume_nor.png').convert_alpha() paused_rect = pause_nor_image.get_rect() paused_rect.left, paused_top = width - paused_rect.width - 10, 10 paused_image = pause_nor_image #飞机喷气 switch_image = True #更优秀的喷气 delay = 100 running = True while running: for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() elif event.type == MOUSEBUTTONDOWN: if event.button == 1 and paused_rect.collidepoint(event.pos): paused = not paused if paused: pygame.time.set_timer(SUPPLY_TIME, 0) pygame.mixer.music.pause() pygame.mixer.pause() else: pygame.time.set_timer(SUPPLY_TIME, 30 * 1000) pygame.mixer.music.unpause() pygame.mixer.unpause() elif event.type == MOUSEMOTION: if paused_rect.collidepoint(event.pos): if paused: paused_image = resume_pressed_image else: paused_image = pause_pressed_image else: if paused: paused_image = resume_nor_image else: paused_image = pause_nor_image elif event.type == KEYDOWN: if event.key == K_SPACE: if bomb_num: bomb_num -= 1 bomb_sound.play() for each in enemies: if each.rect.bottom > 0: each.active = False elif event.type == SUPPLY_TIME: supply_sound.play() if choice([True, False]): bomb_supply.reset() else: bullet_supply.reset() elif event.type == DOUBLE_BULLTET_TIME: is_double_bullet = False pygame.time.set_timer(DOUBLE_BULLTET_TIME, 0) elif event.type == INVINCIBLE_TIME: me.invincible = False pygame.time.set_timer(INVINCIBLE_TIME, 0) #根据得分增加难度 if level == 1 and score > 5000: level += 1 upgrade_sound.play() #增加3架小型,2架中型,1架大型 add_small_enemies(small_enemies, enemies, 3) add_mid_enemies(mid_enemies, enemies, 2) add_small_enemies(big_enemies, enemies, 1) inc_speed(small_enemies, 1) elif level == 2 and score > 30000: level += 1 upgrade_sound.play() #增加5架小型,2架中型,1架大型 add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 3) add_small_enemies(big_enemies, enemies, 2) inc_speed(small_enemies, 1) inc_speed(mid_enemies, 1) elif level == 3 and score > 60000: level += 1 upgrade_sound.play() #增加5架小型,2架中型,1架大型 add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 3) add_small_enemies(big_enemies, enemies, 2) inc_speed(small_enemies, 1) inc_speed(mid_enemies, 1) inc_speed(big_enemies, 1) elif level == 4 and score > 100000: level += 1 upgrade_sound.play() #增加5架小型,2架中型,1架大型 add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 3) add_small_enemies(big_enemies, enemies, 2) inc_speed(small_enemies, 1) inc_speed(mid_enemies, 1) inc_speed(big_enemies, 1) elif level == 5 and score > 200000: level += 1 upgrade_sound.play() #增加5架小型,2架中型,1架大型 add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 3) add_small_enemies(big_enemies, enemies, 2) inc_speed(small_enemies, 1) inc_speed(mid_enemies, 1) inc_speed(big_enemies, 1) elif level == 6 and score > 500000: level += 1 upgrade_sound.play() #增加5架小型,2架中型,1架大型 add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 3) add_small_enemies(big_enemies, enemies, 2) inc_speed(small_enemies, 1) inc_speed(mid_enemies, 1) inc_speed(big_enemies, 1) elif level == 7 and score > 1000000: level += 1 upgrade_sound.play() #增加5架小型,2架中型,1架大型 add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 3) add_small_enemies(big_enemies, enemies, 2) inc_speed(small_enemies, 1) inc_speed(mid_enemies, 1) inc_speed(big_enemies, 1) screen.blit(background, (0, 0)) if not paused and life_num: #检测用户的操作 key_pressed = pygame.key.get_pressed() if key_pressed[K_w] or key_pressed[K_UP]: me.moveUp() if key_pressed[K_s] or key_pressed[K_DOWN]: me.moveDown() if key_pressed[K_a] or key_pressed[K_LEFT]: me.moveLeft() if key_pressed[K_d] or key_pressed[K_RIGHT]: me.moveRight() if bomb_supply.active: bomb_supply.move() screen.blit(bomb_supply.image, bomb_supply.rect) if pygame.sprite.collide_mask(me, bomb_supply): get_bomb_sound.play() if bomb_num < 10: bomb_num += 1 bomb_supply.active = False # 绘制超级子弹补给 if bullet_supply.active: bullet_supply.move() screen.blit(bullet_supply.image, bullet_supply.rect) if pygame.sprite.collide_mask(me, bullet_supply): get_bullet_sound.play() # 发射超级子弹 is_double_bullet = True pygame.time.set_timer(DOUBLE_BULLTET_TIME, 15 * 1000) bullet_supply.active = False #发射子弹 if not (delay % 10): bullet_sound.play() if is_double_bullet: bullets = bullet2 bullets[bullet2_index].reset( (me.rect.centerx - 33, me.rect.centery)) bullets[bullet2_index + 1].reset( (me.rect.centerx + 30, me.rect.centery)) bullet2_index = (bullet2_index + 2) % BULLET2_NUM else: bullets = bullet1 bullets[bullet1_index].reset(me.rect.midtop) bullet1_index = (bullet1_index + 1) % BULLET1_NUM #检测子弹碰撞 for b in bullets: if b.active: b.move() screen.blit(b.image, b.rect) enemy_hit = pygame.sprite.spritecollide( b, enemies, False, pygame.sprite.collide_mask) if enemy_hit: b.active = False for e in enemy_hit: if e in mid_enemies or e in big_enemies: e.hit = True e.energy -= 1 if e.energy == 0: e.active = False else: e.hit = True e.energy -= 1 if e.energy == 0: e.active = False # 绘制敌方大型机 for each in big_enemies: if each.active: each.move() if each.hit: screen.blit(each.image_hit, each.rect) each.hit = False else: if switch_image: screen.blit(each.image1, each.rect) else: screen.blit(each.image2, each.rect) # 绘制血槽 pygame.draw.line(screen, BLACK, (each.rect.left, each.rect.top - 5), (each.rect.right, each.rect.top - 5), 2) # 当生命大于20%显示绿色, 否则显示红色 energy_remain = each.energy / enemy.BigEnemy.energy if energy_remain > 0.2: energy_color = GREEN else: energy_color = RED pygame.draw.line( screen, energy_color, (each.rect.left, each.rect.top - 5), (each.rect.left + each.rect.width * energy_remain, each.rect.top - 5), 2) # 即将出现在画面, 播放音效 if each.rect.bottom == -5: enemy3_fly_sound.play(-1) else: enemy3_down_sound.play() enemy3_fly_sound.stop() score += 1000 each.reset() #毁灭 # if e3_destroy_index == 0: # enemy3_down_sound.play() # if not(delay % 2): # screen.blit(each.destroy_images[ # e3_destroy_index], each.rect) # e3_destroy_index = (e3_destroy_index + 2) % 6 # if e3_destroy_index == 0: # enemy3_fly_sound.stop() # score += 1000 # each.reset() #画中型机 for M in mid_enemies: if M.active: M.move() if M.hit: screen.blit(M.image_hit, M.rect) M.hit = False else: screen.blit(M.image, M.rect) pygame.draw.line(screen,BLACK,\ (M.rect.left,M.rect.top -5),\ (M.rect.right,M.rect.top -5),\ 2) #血量低于20%变红 energy_remain = M.energy / enemy.MidEnemy.energy if energy_remain > 0.2: energy_color = GREEN else: energy_color = RED pygame.draw.line(screen,energy_color,\ (M.rect.left,M.rect.top-5),\ (M.rect.left+M.rect.width*energy_remain,\ M.rect.top-5),2) else: # 毁灭 if e2_destroy_index == 0: enemy2_down_sound.play() if not (delay % 2): screen.blit(M.destroy_images[e2_destroy_index], M.rect) e2_destroy_index = (e2_destroy_index + 1) % 4 if e2_destroy_index == 0: score += 600 M.reset() #画小飞机 for S in small_enemies: if S.active: S.move() if M.hit: screen.blit(M.image_hit, M.rect) M.hit = False else: screen.blit(S.image, S.rect) else: if e1_destroy_index == 0: enemy1_down_sound.play() if not (delay % 3): screen.blit(S.destroy_images[e1_destroy_index], S.rect) e1_destroy_index = (e1_destroy_index + 1) % 4 if e1_destroy_index == 0: score += 100 S.reset() #检测碰撞 enemies_down = pygame.sprite.spritecollide( me, enemies, False, pygame.sprite.collide_mask) if enemies_down and not me.invincible: me.active = False for e in enemies_down: e.active = False #画出我方飞机 if me.active: if switch_image: screen.blit(me.image1, me.rect) else: screen.blit(me.image2, me.rect) else: if not (delay % 3): if me_destroy_index == 0: me_down_sound.play() screen.blit(me.destroy_images[me_destroy_index], me.rect) me_destroy_index = (me_destroy_index + 1) % 4 if me_destroy_index == 0: life_num -= 1 me.reset() pygame.time.set_timer(INVINCIBLE_TIME, 3 * 1000) #画炸弹 bomb_text = bomb_font.render('X %d' % bomb_num, True, WHITE) text_rect = bomb_text.get_rect() screen.blit(bomb_image, (10, height - 10 - bomb_rect.height - 20)) screen.blit(bomb_text, (20 + bomb_rect.width, height - text_rect.height)) #画命 if life_num: for i in range(life_num): screen.blit(life_image,\ (width-10-(i+1)*life_rect.width,\ height-10-life_rect.height)) elif life_num == 0: # 背景音乐停止 pygame.mixer.music.stop() # 停止全部音效 pygame.mixer.stop() # 停止发放补给 pygame.time.set_timer(SUPPLY_TIME, 0) if not recorded: recorded = True # 读取历史最高分 with open('record.txt', 'r') as f: record_score = int(f.read()) # 判断是否高于历史最高分 if score > record_score: with open('record.txt', 'w') as f: f.write(str(score)) # 绘制结束界面 record_score_text = score_font.render("Best : %d" % record_score, True, (255, 255, 255)) screen.blit(record_score_text, (50, 50)) gameover_text1 = gameover_font.render("Your Score", True, (255, 255, 255)) gameover_text1_rect = gameover_text1.get_rect() gameover_text1_rect.left, gameover_text1_rect.top = \ (width - gameover_text1_rect.width) // 2, height // 3 screen.blit(gameover_text1, gameover_text1_rect) gameover_text2 = gameover_font.render(str(score), True, (255, 255, 255)) gameover_text2_rect = gameover_text2.get_rect() gameover_text2_rect.left, gameover_text2_rect.top = \ (width - gameover_text2_rect.width) // 2, \ gameover_text1_rect.bottom + 10 screen.blit(gameover_text2, gameover_text2_rect) again_rect.left, again_rect.top = \ (width - again_rect.width) // 2, \ gameover_text2_rect.bottom + 50 screen.blit(again_image, again_rect) gameover_rect.left, gameover_rect.top = \ (width - again_rect.width) // 2, \ again_rect.bottom + 10 screen.blit(gameover_image, gameover_rect) #画得分 score_text = score_font.render('Score : %s' % str(score), True, WHITE) screen.blit(score_text, (10, 5)) screen.blit(paused_image, paused_rect) #5帧切换一次 if not (delay % 5): switch_image = not switch_image delay -= 1 if not delay: delay = 100 pygame.display.flip() clock.tick(60)
def main(): pygame.mixer.music.play(-1) # -1表示循环播放 # 生成玩家飞机 me = my_plane.MyPlane(bg_size) # 生成子弹 bullets = [] nor_bullets = [] nor_bullet_index = 0 nor_bullet_num = 6 for i in range(nor_bullet_num): nor_bullets.append(bullet.Nor_bullet(me.rect.midtop)) # 生成超级子弹 sup_bullets = [] sup_bullet_index = 0 sup_bullet_num = 12 for i in range(sup_bullet_num//2): sup_bullets.append(bullet.Sup_bullet((me.rect.centerx-33, me.rect.centery))) sup_bullets.append(bullet.Sup_bullet((me.rect.centerx+30, me.rect.centery))) # 累计得分 score = 0 score_font = pygame.font.Font("H:/font/font.ttf", 36) # 生成敌方飞机 enemies = pygame.sprite.Group() small_enemies = pygame.sprite.Group() add_small_enemies(small_enemies, enemies, 15) mid_enemies = pygame.sprite.Group() add_mid_enemies(mid_enemies, enemies, 4) big_enemies = pygame.sprite.Group() add_big_enemies(big_enemies, enemies, 2) # 切换飞机图片的变量 switch_plane = True # 用于延时变量,使飞机突突突 tim_delay = 5 # 表示是否暂停游戏的按钮 pause = False paused_not_image = pygame.image.load("H:/images/pause_nor.png").convert_alpha() paused_pressed_image = pygame.image.load("H:/images/pause_pressed.png").convert_alpha() resume_not_image = pygame.image.load("H:/images/resume_nor.png").convert_alpha() resume_pressed_image = pygame.image.load("H:/images/resume_pressed.png").convert_alpha() pause_rect = paused_not_image.get_rect() pause_rect.left, pause_rect.top = width - pause_rect.width - 10, 10 paused_image = paused_not_image running = True # 用于阻止重复打开记录文件 recording = True # 设置难度级别 leave = 1 # 击落图片索引 e1_destroy_index = 0 e2_destroy_index = 0 e3_destroy_index = 0 me_destroy_index = 0 # 解除玩家飞机复活无敌定时器 invincible_tim = USEREVENT + 2 # 游戏结束画面 gameover_font = pygame.font.Font("H:/font/font.TTF", 48) again_image = pygame.image.load("H:/images/again.png").convert_alpha() again_rect = again_image.get_rect() gameover_image = pygame.image.load("H:/images/gameover.png").convert_alpha() gameover_rect = gameover_image.get_rect() # 炸弹补给 boom_image = pygame.image.load("H:/images/bomb.png").convert_alpha() boom_rect = boom_image.get_rect() boom_font = pygame.font.Font("H:/font/font.ttf", 48) boom_num = 3 # 超级子弹定时器 super_bullet_tim = USEREVENT + 1 super_bullet_choice = False # 玩家生命数量 life_image = pygame.image.load("H:/images/life.png") life_rect = life_image.get_rect() life_num = 3 # 每30秒发放一个补给包 bullet_supply = supply.Bullet_Supply(bg_size) bomb_supply = supply.Boom_Supply(bg_size) supply_tim = USEREVENT pygame.time.set_timer(supply_tim, 30*1000) clock = pygame.time.Clock() while running: for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() # 按下暂停键 elif event.type == MOUSEBUTTONDOWN: if event.button == 1 and pause_rect.collidepoint(event.pos): pause = not pause if pause: pygame.time.set_timer(supply_tim, 0) pygame.mixer.music.pause() pygame.mixer.pause() else: pygame.time.set_timer(supply_tim, 30*1000) pygame.mixer.music.play(-1) pygame.mixer.unpause() elif event.type == MOUSEMOTION: if pause_rect.collidepoint(event.pos): if pause: paused_image = resume_pressed_image else: paused_image = paused_pressed_image else: if pause: paused_image = resume_not_image else: paused_image = paused_not_image # 按下空格键,全屏轰炸 elif event.type == KEYDOWN: if event.key == K_SPACE: if boom_num: if not pause: boom_num -= 1 bomb_sound.play() for each in enemies: if each.rect.bottom > 0: each.active = False elif event.type == supply_tim: supply_sound.play() if random.choice([True, False]): bomb_supply.reset() else: bullet_supply.reset() elif event.type == super_bullet_tim: super_bullet_choice = False pygame.time.set_timer(super_bullet_tim, 0) elif event.type == invincible_tim: me.Invincible = False pygame.time.set_timer(invincible_tim, 0) # 绘制背景图片 screen.blit(background, (0, 0)) # 根据玩家的分增加难度 if leave == 1 and score > 90000: leave = 2 upgrade_sound.play() add_small_enemies(small_enemies, enemies, 3) add_mid_enemies(mid_enemies, enemies, 2) add_big_enemies(big_enemies, enemies, 1) enemy_speed_up(small_enemies, 1) elif leave == 2 and score > 300000: leave = 3 upgrade_sound.play() add_small_enemies(small_enemies, enemies, 3) add_mid_enemies(mid_enemies, enemies, 2) add_big_enemies(big_enemies, enemies, 1) enemy_speed_up(mid_enemies, 1) elif leave == 3 and score > 700000: leave = 4 upgrade_sound.play() add_small_enemies(small_enemies, enemies, 3) add_mid_enemies(mid_enemies, enemies, 2) add_big_enemies(big_enemies, enemies, 2) enemy_speed_up(small_enemies, 1) enemy_speed_up(mid_enemies, 2) elif leave == 4 and score > 1200000: leave = 5 upgrade_sound.play() add_small_enemies(small_enemies, enemies, 3) add_mid_enemies(mid_enemies, enemies, 2) add_big_enemies(big_enemies, enemies, 2) enemy_speed_up(small_enemies, 1) enemy_speed_up(big_enemies, 1) if not pause and life_num: # 检测玩家的键盘操作 key_pressed = pygame.key.get_pressed() # 玩家飞机移动 if key_pressed[K_w]: me.moveUp() if key_pressed[K_s]: me.moveDn() if key_pressed[K_a]: me.moveLf() if key_pressed[K_d]: me.moveRt() # 检测补给数目与是否能获得 if bomb_supply.active is True: bomb_supply.move() screen.blit(bomb_supply.image, bomb_supply.rect) if pygame.sprite.collide_mask(bomb_supply, me): if boom_num < 3: get_bomb_sound.play() boom_num += 1 bomb_supply.active = False # 检测补给数目与是否能获得 if bullet_supply.active: bullet_supply.move() screen.blit(bullet_supply.image, bullet_supply.rect) if pygame.sprite.collide_mask(bullet_supply, me): super_bullet_choice = True get_bullet_sound.play() bullet_supply.active = False pygame.time.set_timer(super_bullet_tim, 18*1000) # 类似定时器 tim_delay -= 1 if not tim_delay: tim_delay = 100 if tim_delay % 5 == 0: switch_plane = not switch_plane # 10帧发射一次子弹 if not (tim_delay % 9): bullet_sound.play() if super_bullet_choice: bullets = sup_bullets bullets[sup_bullet_index].reset((me.rect.centerx-33, me.rect.centery)) bullets[sup_bullet_index+1].reset((me.rect.centerx+30, me.rect.centery)) sup_bullet_index = (sup_bullet_index + 2) % 12 else: bullets = nor_bullets bullets[nor_bullet_index].reset(me.rect.midtop) nor_bullet_index = (nor_bullet_index + 1) % 4 # 检测子弹击中敌机 for each in bullets: if each.active: each.move() screen.blit(each.image, each.rect) hit = pygame.sprite.spritecollide(each, enemies, False, pygame.sprite.collide_mask) if hit: each.active = False for e in hit: if e in big_enemies or e in mid_enemies: e.energy = e.energy - 1 e.hit = True if e.energy <= 0: e.active = False else: e.active = False # 检测飞机碰撞 crashed = pygame.sprite.spritecollide(me, enemies, False, pygame.sprite.collide_mask) if crashed: if me.Invincible is False: me.active = False for e in crashed: e.active = False # 绘制玩家飞机 if me.active is True: if switch_plane: screen.blit(me.image, me.rect) else: screen.blit(me.image2, me.rect) else: if not (tim_delay % 3): if me_destroy_index == 1: me_down_sound.play() screen.blit(me.destroy_image[me_destroy_index], me.rect) me_destroy_index = (me_destroy_index + 1) % 4 if me_destroy_index == 0: life_num -= 1 me.reset() pygame.time.set_timer(invincible_tim, 3*1000) # 绘制地方飞机 for each in big_enemies: if each.active: each.move() if each.hit: screen.blit(each.image_hit, each.rect) each.hit = False else: if switch_plane: screen.blit(each.image, each.rect) else: screen.blit(each.image_2, each.rect) # 绘制血槽 pygame.draw.line(screen, black, (each.rect.left, each.rect.top - 5), (each.rect.right, each.rect.top - 5), 2) energy_part = each.energy / enemy.Big_enemy.energy if energy_part > 0.2: energy_color = green else: energy_color = red pygame.draw.line(screen, energy_color, (each.rect.left, each.rect.top - 5), (each.rect.left+energy_part*each.rect.width, each.rect.top - 5), 2) if each.rect.bottom == -50: enemy3_fly_sound.play(-1) else: # 敌机毁灭 if not (tim_delay % 3): screen.blit(each.destroy_images[e3_destroy_index], each.rect) e3_destroy_index = (e3_destroy_index + 1) % 6 if e3_destroy_index == 0: each.reset() enemy3_fly_sound.stop() enemy3_down_sound.play() score += 10000 # 显示得分 score_text = score_font.render("Score : %s" % str(score), True, white) screen.blit(score_text, (10, 5)) for each in mid_enemies: if each.active: each.move() if each.hit: screen.blit(each.image_hit, each.rect) each.hit = False else: screen.blit(each.image, each.rect) # 绘制血槽 pygame.draw.line(screen, black, (each.rect.left, each.rect.top - 5), (each.rect.right, each.rect.top - 5), 2) energy_part = each.energy / enemy.Mid_enemy.energy if energy_part > 0.2: energy_color = green else: energy_color = red pygame.draw.line(screen, energy_color, (each.rect.left, each.rect.top - 5), (each.rect.left+energy_part*each.rect.width, each.rect.top - 5), 2) else: # 敌机毁灭 if not (tim_delay % 3): if e2_destroy_index == 1: enemy2_down_sound.play() screen.blit(each.destroy_images[e2_destroy_index], each.rect) e2_destroy_index = (e2_destroy_index + 1) % 4 if e2_destroy_index == 0: each.reset() score += 6000 for each in small_enemies: if each.active: each.move() screen.blit(each.image, each.rect) else: # 敌机毁灭 if not (tim_delay % 3): if e1_destroy_index == 1: enemy1_down_sound.play() screen.blit(each.destroy_images[e1_destroy_index], each.rect) e1_destroy_index = (e1_destroy_index + 1) % 4 if e1_destroy_index == 0: each.reset() score += 1000 elif life_num == 0: # 背景音乐停止, 音效,停止发放补给 pygame.mixer.music.stop() pygame.mixer.stop() pygame.time.set_timer(supply_tim, 0) if recording: # 读取历史最高得分 recording = False with open("H:/record.txt", "r") as f: record_score = int(f.read()) if score > record_score: record_score = score with open("H:/record.txt", "w") as f: f.write(str(score)) # 绘制结束画面 record_score_text = score_font.render("Best : %d" % record_score, True, (255, 255, 255)) screen.blit(record_score_text, (50, 50)) gameover_text1 = gameover_font.render("Your Score", True, (255, 255, 255)) gameover_text1_rect = gameover_text1.get_rect() gameover_text1_rect.left, gameover_text1_rect.top = \ (width - gameover_text1_rect.width) // 2, height // 3 screen.blit(gameover_text1, gameover_text1_rect) gameover_text2 = gameover_font.render(str(score), True, (255, 255, 255)) gameover_text2_rect = gameover_text2.get_rect() gameover_text2_rect.left, gameover_text2_rect.top = \ (width - gameover_text2_rect.width) // 2, \ gameover_text1_rect.bottom + 10 screen.blit(gameover_text2, gameover_text2_rect) again_rect.left, again_rect.top = \ (width - again_rect.width) // 2, \ gameover_text2_rect.bottom + 50 screen.blit(again_image, again_rect) gameover_rect.left, gameover_rect.top = \ (width - again_rect.width) // 2, \ again_rect.bottom + 10 screen.blit(gameover_image, gameover_rect) # 检测用户的鼠标操作 # 如果用户按下鼠标左键 if pygame.mouse.get_pressed()[0]: # 获取鼠标坐标 pos = pygame.mouse.get_pos() # 如果用户点击“重新开始” if again_rect.left < pos[0] < again_rect.right and \ again_rect.top < pos[1] < again_rect.bottom: # 调用main函数,重新开始游戏 main() # 如果用户点击“结束游戏” elif gameover_rect.left < pos[0] < gameover_rect.right and \ gameover_rect.top < pos[1] < gameover_rect.bottom: # 退出游戏 pygame.quit() sys.exit() # 绘制剩余生命数量 if life_num: for i in range(life_num): screen.blit(life_image, (width - 10 - (i+1)*life_rect.width, height - 10 - life_rect.height)) # 绘制剩余炸弹补给 boom_text = boom_font.render("x %d" % boom_num, True, white) text_rect = boom_text.get_rect() screen.blit(boom_image, (10, height - 10 - boom_rect.height), boom_rect) screen.blit(boom_text, (20 + boom_rect.width, height - 5 - text_rect.height)) screen.blit(paused_image, pause_rect) pygame.display.flip() clock.tick(60)
def main(): #--背景音乐开始 循环 pygame.mixer_music.play(-1) #---生成我方飞机 me = myplane.MyPlane(bg_size) #生成敌方飞机 并把他们全放在这个enemies里 enemies = pygame.sprite.Group() #-生成敌方小型飞机 small_enemies = pygame.sprite.Group() add_small_enemies(small_enemies, enemies, 15) #-生成敌方中型飞机 mid_enemies = pygame.sprite.Group() add_mid_enemies(mid_enemies, enemies, 4) #-生成敌方大飞机 big_enemies = pygame.sprite.Group() add_big_enemies(big_enemies, enemies, 2) #-生成普通子弹 bullet1 = [] bullet1_index = 0 BULLET1_NUM = 4 #--定义4颗子弹 加上他的速度 大约有80%的射程 for i in range(BULLET1_NUM): bullet1.append(bullet.Bullet1( me.rect.midtop)) #---生成位置 rect.midtop 图片中央上方 #-生成超级子弹 bullet2 = [] bullet2_index = 0 BULLET2_NUM = 8 #--定义4颗子弹 加上他的速度 大约有80%的射程 for i in range(BULLET2_NUM // 2): bullet2.append(bullet.Bullet2((me.rect.centerx - 33, me.rect.centery))) bullet2.append(bullet.Bullet2((me.rect.centerx + 30, me.rect.centery))) #---控制帧率 clock = pygame.time.Clock() #--中弹图片索引 e1_destroy_index = 0 e2_destroy_index = 0 e3_destroy_index = 0 me_destroy_index = 0 #_--统计用户得分 score = 0 score_font = pygame.font.Font(None, 36) #--显示得分的字体 score_font.set_bold(True) #--标识是否暂停游戏 puased = False puase_nor_image = pygame.image.load( "G:/PersonPro/PythonPro/每日任务/爬虫的自我修养/pygame/飞机大战/images/pause_nor.png" ).convert_alpha() puase_pressed_image = pygame.image.load( "G:/PersonPro/PythonPro/每日任务/爬虫的自我修养/pygame/飞机大战/images/pause_pressed.png" ).convert_alpha() resume_nor_image = pygame.image.load( "G:/PersonPro/PythonPro/每日任务/爬虫的自我修养/pygame/飞机大战/images/resume_nor.png" ).convert_alpha() resume_pressed_image = pygame.image.load( "G:/PersonPro/PythonPro/每日任务/爬虫的自我修养/pygame/飞机大战/images/resume_pressed.png" ).convert_alpha() puased_rect = puase_nor_image.get_rect() puased_rect.left, puased_rect.top = width - puased_rect.width - 10, 10 puased_image = puase_nor_image #--设置游戏难度级别 level = 1 #--全屏炸弹 bomb_image = pygame.image.load( "G:/PersonPro/PythonPro/每日任务/爬虫的自我修养/pygame/飞机大战/images/bomb.png" ).convert_alpha() bomb_rect = bomb_image.get_rect() bomb_font = pygame.font.Font(None, 48) bomb_num = 3 #----每30秒获得一次补给 bullet_supply = supply.Bullet_Supply(bg_size) bomb_supply = supply.Bomb_Supply(bg_size) SUPPLY_TIME = USEREVENT #---自定义事件 pygame.time.set_timer(SUPPLY_TIME, 30 * 1000) #-设定事件每10秒触发一次 #--超级子弹定时器 DOUBLE_BULLET_TIME = USEREVENT + 1 #---解除我方无敌状态计时器 wudi_time = USEREVENT + 2 #--限制重复打开记录文件 read = False #--标识是否使用超级子弹 is_double_bullet = False #用于切换我方飞机图片 switch_iamge = True #用于延迟我方图片切换速度 delay = 100 #--我方飞机生命次数 life_image = pygame.image.load( "G:/PersonPro/PythonPro/每日任务/爬虫的自我修养/pygame/飞机大战/images/life.png" ).convert_alpha() life_rect = life_image.get_rect() life_num = 3 #----结束界面 gameover_font = pygame.font.Font(None, 48) again_image = pygame.image.load( "G:/PersonPro/PythonPro/每日任务/爬虫的自我修养/pygame/飞机大战/images/again.png" ).convert_alpha() again_rect = again_image.get_rect() gameover_image = pygame.image.load( "G:/PersonPro/PythonPro/每日任务/爬虫的自我修养/pygame/飞机大战/images/gameover.png" ).convert_alpha() gameover_rect = gameover_image.get_rect() runing = True while runing: for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() #--响应点击暂停开始 elif event.type == MOUSEBUTTONDOWN: if event.button == 1 and puased_rect.collidepoint( event.pos): #---event.pos会返回当前鼠标的位置 puased = not puased #collidepoint 会自动检测传入的这个点是否在矩形内 if puased: #-是返回True 不是返回Flase pygame.time.set_timer(SUPPLY_TIME, 0) pygame.mixer_music.pause() #--如果暂停 补给发放停止 背景音乐 音效暂停 pygame.mixer.pause() else: pygame.time.set_timer(SUPPLY_TIME, 30 * 1000) pygame.mixer_music.unpause() pygame.mixer.unpause() elif event.type == MOUSEMOTION: #-----当你的鼠标在这个界面有任何移动 if puased_rect.collidepoint(event.pos): if puased: puased_image = resume_pressed_image else: puased_image = puase_pressed_image else: if puased: puased_image = resume_nor_image else: puased_image = puase_nor_image elif event.type == KEYDOWN: #---如果空格 炸了 飞机死了 if event.key == K_SPACE: if bomb_num: bomb_num -= 1 bomb_sound.play() if bomb_num == 0: bomb_num += 1 #---终极sb行为 没了 固定加1ha哈哈哈 for each in enemies: if each.rect.bottom > 0: each.active = False elif event.type == SUPPLY_TIME: supply_sound.play() if random.choice([True, False]): bomb_supply.reset() #---事件产生 else: bullet_supply.reset() elif event.type == DOUBLE_BULLET_TIME: is_double_bullet = False pygame.time.set_timer(DOUBLE_BULLET_TIME, 0) elif event.type == wudi_time: me.wudi = False pygame.time.set_timer(wudi_time, 0) #--根据得分情况绘制难度 if level == 1 and score > 50000: level = 2 upgrade_sound.play() #--播放提升难度的音效 #--增加3架小飞机 增加2架中型飞机 和1架 大飞机 add_small_enemies(small_enemies, enemies, 3) add_mid_enemies(mid_enemies, enemies, 2) add_big_enemies(big_enemies, enemies, 1) #--小飞机速度提升 inc_speed(small_enemies, 1) elif level == 2 and score > 300000: level = 3 upgrade_sound.play() #--播放提升难度的音效 #--增加5架小飞机 增加3架中型飞机 和2架 大飞机 add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 2) add_big_enemies(big_enemies, enemies, 1) #--小飞机速度提升 inc_speed(small_enemies, 1) #--中飞机速度提升 inc_speed(mid_enemies, 1) elif level == 3 and score > 600000: level = 4 upgrade_sound.play() #--播放提升难度的音效 #--增加8架小飞机 增加4架中型飞机 和3架 大飞机 add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 2) add_big_enemies(big_enemies, enemies, 1) #--小飞机速度提升 inc_speed(small_enemies, 2) #--中飞机速度提升 inc_speed(mid_enemies, 1) elif level == 4 and score > 800000: level = 5 upgrade_sound.play() #--播放提升难度的音效 #--增加5架小飞机 增加3架中型飞机 和2架 大飞机 add_small_enemies(small_enemies, enemies, 3) add_mid_enemies(mid_enemies, enemies, 1) add_big_enemies(big_enemies, enemies, 2) #--小飞机速度提升 inc_speed(small_enemies, 1) #--中飞机速度提升 inc_speed(mid_enemies, 2) #--大飞机速度提升 inc_speed(big_enemies, 1) #--绘制背景 screen.blit(background, (0, 0)) if life_num and not puased: #------检测用户的键盘操作 key_pressed = pygame.key.get_pressed() if key_pressed[K_w] or key_pressed[K_UP]: me.moveUP() if key_pressed[K_s] or key_pressed[K_DOWN]: me.moveDOWN() if key_pressed[K_a] or key_pressed[K_LEFT]: me.moveLEFT() if key_pressed[K_d] or key_pressed[K_RIGHT]: me.moveRIGHT() #---绘制全屏炸弹补给并检测是否获得 if bomb_supply.active: bomb_supply.move() screen.blit(bomb_supply.image, bomb_supply.rect) if pygame.sprite.collide_mask(bomb_supply, me): get_bomb_sound.play() if bomb_num < 3: bomb_num += 1 bomb_supply.active = False #---绘制双倍子弹补给并检测是否获得 if bullet_supply.active: bullet_supply.move() screen.blit(bullet_supply.image, bullet_supply.rect) if pygame.sprite.collide_mask(bullet_supply, me): get_bullet_sound.play() is_double_bullet = True pygame.time.set_timer(DOUBLE_BULLET_TIME, 18 * 1000) bullet_supply.active = False #--发射普通子弹 每十帧一颗 if not (delay % 10): bullet_sound.play() if is_double_bullet: bullets = bullet2 bullets[bullet2_index].reset( (me.rect.centerx - 33, me.rect.centery)) bullets[bullet2_index + 1].reset( (me.rect.centerx + 30, me.rect.centery)) bullet2_index = (bullet2_index + 2) % BULLET2_NUM else: bullets = bullet1 bullets[bullet1_index].reset(me.rect.midtop) bullet1_index = (bullet1_index + 1) % BULLET1_NUM #--检测子弹是否击中敌方飞机 for b in bullets: if b.active: b.move() screen.blit(b.image, b.rect) enemy_hit = pygame.sprite.spritecollide( b, enemies, False, pygame.sprite.collide_mask) if enemy_hit: b.active = False for e in enemy_hit: if e in mid_enemies or e in big_enemies: #---在这里加了一个判断 如果是中型或者大型飞机 e.hit = True e.energy -= 1 #--先将他的energy-1 如果等于零 才毁灭 if e.energy == 0: e.active = False else: e.active = False #--绘制大型飞机 for each in big_enemies: if each.active: #-判断活着 each.move() if each.hit: #--绘制被击中特效 screen.blit(each.image_hit, each.rect) each.hit = False #-绘制结束 hit为false else: if switch_iamge: #--绘制正常形态 screen.blit(each.image1, each.rect) else: screen.blit(each.image2, each.rect) #--绘制血槽#--line画一条直线的line 颜色黑色 底部血槽起点 终点 宽度 pygame.draw.line(screen,BLACK,\ (each.rect.left,each.rect.top - 5),\ (each.rect.right,each.rect.top - 5),\ 2) #-当生命值大于20% 绘制绿色 否则红色 energy_remain = each.energy / enemy.BigEnemy.energy if energy_remain > 0.2: energy_color = GREEN else: energy_color = RED pygame.draw.line(screen,energy_color,\ (each.rect.left,each.rect.top - 5),\ (each.rect.left + each.rect.width * energy_remain,\ each.rect.top - 5),2) #--大型飞机即将出现在画面中出现音效 if each.rect.bottom > -50: enemy3_flying_sound.play(-1) else: #---毁灭 if not (delay % 3): if e3_destroy_index == 0: enemy3_down_sound.play() screen.blit(each.destroy_images[e3_destroy_index], each.rect) e3_destroy_index = ( e3_destroy_index + 1) % 6 #--默认索引进是0 绘制第一张 +1除6 除不尽 继续循环 然后第二张 if e3_destroy_index == 0: #---一直进来索引为5的图片 也就是最后一张 +1%6除尽了 0了 enemy3_flying_sound.stop() score += 10000 #--大型飞机毁灭 +10000 each.reset() #--执行 each.reset() #--绘制中型飞机 for each in mid_enemies: if each.active: each.move() if each.hit: screen.blit(each.image2_hit, each.rect) each.hit = False else: screen.blit(each.image, each.rect) #--绘制血槽 颜色黑色 底部血槽起点 终点 宽度 pygame.draw.line(screen,BLACK,\ (each.rect.left,each.rect.top - 5),\ (each.rect.right,each.rect.top - 5),\ 2) #-当生命值大于20% 绘制绿色 否则红色 energy_remain = each.energy / enemy.MidEnemy.energy if energy_remain > 0.2: energy_color = GREEN else: energy_color = RED pygame.draw.line(screen,energy_color,\ (each.rect.left,each.rect.top - 5),\ (each.rect.left + each.rect.width * energy_remain,\ each.rect.top - 5),2) else: #--毁灭 if not (delay % 3): if e2_destroy_index == 0: enemy2_down_sound.play() screen.blit(each.destroy_images[e2_destroy_index], each.rect) e2_destroy_index = (e2_destroy_index + 1) % 4 if e2_destroy_index == 0: score += 6000 each.reset() #--绘制小型敌机 for each in small_enemies: if each.active: each.move() screen.blit(each.image, each.rect) else: #---毁灭 if not (delay % 3): if e1_destroy_index == 0: enemy1_down_sound.play() screen.blit(each.destroy_images[e1_destroy_index], each.rect) e1_destroy_index = (e1_destroy_index + 1) % 4 if e1_destroy_index == 0: score += 1000 each.reset() #---检测我方飞机是否碰撞 memies_down = pygame.sprite.spritecollide( me, enemies, False, pygame.sprite.collide_mask ) #--检测me这个精灵 enemes一组精灵 如果碰撞 返回一个列表 if memies_down and not me.wudi: me.active = False for i in memies_down: i.active = False if me.active: #--绘制我方飞机 if switch_iamge: screen.blit(me.image1, me.rect) else: screen.blit(me.image2, me.rect) else: #---毁灭 if not (delay % 3): if me_destroy_index == 0: me_down_sound.play() screen.blit(me.destroy_images[me_destroy_index], me.rect) me_destroy_index = (me_destroy_index + 1) % 4 if me_destroy_index == 0: life_num -= 1 me.reset() pygame.time.set_timer(wudi_time, 3 * 1000) #----绘制炸弹 bomb_text = score_font.render("X %d" % bomb_num, True, WHITE) text_rect = bomb_text.get_rect() screen.blit(bomb_image, (10, height - 10 - bomb_rect.height)) screen.blit(bomb_text, (20 + bomb_rect.width, height - 5 - bomb_rect.height)) #---绘制我方飞机数量 if life_num: for i in range(life_num): screen.blit(life_image,\ (width-10-(i+1)*life_rect.width,\ height-10-life_rect.height)) #--绘制得分 score_text = score_font.render("Score : %s" % str(score), True, WHITE) #-用render函数将得分渲染成surface对象 #---渲染的东西 抗锯齿 颜色 screen.blit(score_text, (10, 5)) #--绘制游戏结束画面 elif life_num == 0: #-背景音乐停止 pygame.mixer_music.stop() #-停止全部音效 pygame.mixer.stop() #-停止发放补给 pygame.time.set_timer(SUPPLY_TIME, 0) if not read: read = True #-打开记录文件 #----读取历史最高分 with open("G:/PersonPro/PythonPro/每日任务/爬虫的自我修养/pygame/飞机大战/成绩.txt", "r") as f: record = int(f.read()) #-如果玩家高于历史 则存档 if score > record: with open( "G:/PersonPro/PythonPro/每日任务/爬虫的自我修养/pygame/飞机大战/成绩.txt", "w") as f: f.write(str(score)) #--绘制结束界面 record_text = score_font.render("Best:%d" % record, True, RED) #--最高分 screen.blit(record_text, (50, 50)) gameover_text1 = gameover_font.render("You Score", True, WHITE) gameover_text1_rect = gameover_text1.get_rect() #--你的成绩 gameover_text1_rect.left,gameover_text1_rect.top = \ (width - gameover_text1_rect.width)//2,height // 3 screen.blit(gameover_text1, gameover_text1_rect) gameover_text2 = gameover_font.render(str(score), True, GREEN) gameover_text2_rect = gameover_text2.get_rect() #---成绩 gameover_text2_rect.left, gameover_text2_rect.top = \ (width - gameover_text2_rect.width) // 2, \ gameover_text1_rect.bottom + 10 screen.blit(gameover_text2, gameover_text2_rect) again_rect.left, again_rect.top = \ (width - again_rect.width) // 2, gameover_text2_rect.bottom + 50 screen.blit(again_image, again_rect) #--继续游戏 gameover_rect.left, gameover_rect.top = \ (width - again_rect.width) // 2, again_rect.bottom + 10 screen.blit(gameover_image, gameover_rect) #-结束游戏 #---检查用户鼠标操作 #-如果按下左键 if pygame.mouse.get_pressed()[0]: #--获取鼠标坐标 pos = pygame.mouse.get_pos() #---如果用户点击重新开始 if again_rect.left < pos[0] < again_rect.right and\ again_rect.top < pos[1] < again_rect.bottom: #调用main()重新开始 main() #如果点击退出 if gameover_rect.left < pos[0] < gameover_rect.right and\ again_rect.top < pos[1] <gameover_rect.bottom: pygame.quit() sys.exit() #--绘制暂停按钮 screen.blit(puased_image, puased_rect) #---切换我方飞机 if not (delay % 5): switch_iamge = not switch_iamge #(只有delay能被五整出 才会not打开切换开关) delay -= 1 if not delay: #(每一帧-=1 如果没有重新给100) delay = 100 pygame.display.flip() clock.tick(60)
def main(): pygame.mixer.music.play(-1) clock = pygame.time.Clock() #初始化英雄飞机 heroPlan = hero.Hero(bg_size) #用于切换图片 switch_image = True #用于延迟 delay = 100 #中弹图片索引 e1_destroy_index = 0 e2_destroy_index = 0 e3_destroy_index = 0 hero_destroy_index = 0 #初始化敌机 enemies = pygame.sprite.Group() small_enemies = pygame.sprite.Group() add_small_enemies(small_enemies, enemies, 15) mid_enemies = pygame.sprite.Group() add_mid_enemies(mid_enemies, enemies, 4) big_enemies = pygame.sprite.Group() add_big_enemies(big_enemies, enemies, 2) # 生成普通子弹 bullet1 = [] bullet1_index = 0 BULLET1_NUM = 4 for i in range(BULLET1_NUM): bullet1.append(bullet.Bullet1(heroPlan.rect.midtop)) # 生成超级子弹 bullet2 = [] bullet2_index = 0 BULLET2_NUM = 8 for i in range(BULLET2_NUM // 2): bullet2.append( bullet.Bullet2( (heroPlan.rect.centerx - 25, heroPlan.rect.centery))) bullet2.append( bullet.Bullet2( (heroPlan.rect.centerx + 20, heroPlan.rect.centery))) #统计分数 score = 0 score_font = pygame.font.Font("font/font.otf", 36) #设置难度级别 level = 1 #全屏炸弹 bomb_image = pygame.image.load("images/bomb.png") bomb_rect = bomb_image.get_rect() bomb_font = pygame.font.Font("font/font.otf", 48) bomb_num = 3 #每30秒发放一个不补给包 bullet_supply = supply.Bullet_Supply(bg_size) bomb_supply = supply.Bomb_Supply(bg_size) SUPPLY_TIME = USEREVENT pygame.time.set_timer(SUPPLY_TIME, 30 * 1000) #超级子弹定时器 DOUBLE_BULLET_TIME = USEREVENT + 1 #标志是否使用超级子弹 is_double_bullet = False #标志是否暂停游戏 paused = False paused_nor_image = pygame.image.load("images/paused_nor.png") paused_pressed_image = pygame.image.load("images/paused_pressed.png") resume_nor_image = pygame.image.load("images/resume_nor.png") resume_pressed_image = pygame.image.load("images/resume_pressed.png") paused_rect = paused_nor_image.get_rect() paused_rect.left, paused_rect.top = width - paused_rect.width - 10, 10 paused_image = paused_nor_image #生命数量 life_image = pygame.image.load("images/life.png") life_rect = life_image.get_rect() life_num = 3 #解除英雄机无敌状态定时器 INVINCIBLE_TIME = USEREVENT + 2 #用于阻止重复打开记录文件 recorded = False #游戏结束画面 gameover_font = pygame.font.Font("font/font.otf", 48) restart_image = pygame.image.load("images/restart_nor.png") restart_rect = restart_image.get_rect() quit_image = pygame.image.load("images/quit_nor.png") quit_rect = quit_image.get_rect() #主流程 while True: # 设置需要显示的背景图 screen.blit(background, (0, 0)) for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() elif event.type == MOUSEBUTTONDOWN: if event.button == 1 and paused_rect.collidepoint(event.pos): paused = not paused if paused: pygame.time.set_timer(SUPPLY_TIME, 0) pygame.mixer.music.pause() pygame.mixer.pause() else: pygame.time.set_timer(SUPPLY_TIME, 30 * 1000) pygame.mixer.music.unpause() pygame.mixer.unpause() elif event.type == MOUSEMOTION: if paused_rect.collidepoint(event.pos): if paused: paused_image = resume_pressed_image else: paused_image = paused_pressed_image else: if paused: paused_image = resume_nor_image else: paused_image = paused_nor_image elif event.type == KEYDOWN: if event.key == K_SPACE: if bomb_num: bomb_num -= 1 bomb_sound.play() for each in enemies: if each.rect.bottom > 0: each.active = False elif event.type == SUPPLY_TIME: supply_sound.play() if random.choice([True, False]): bomb_supply.reset() else: bullet_supply.reset() elif event.type == DOUBLE_BULLET_TIME: is_double_bullet = False pygame.time.set_timer(DOUBLE_BULLET_TIME, 0) #根据用户的得分增加难度 if level == 1 and score > 5000: level = 2 upgrade_sound.play() #增加3架小型敌机,2架中型敌机,1架大型敌机 add_small_enemies(small_enemies, enemies, 3) add_mid_enemies(mid_enemies, enemies, 2) add_big_enemies(big_enemies, enemies, 1) #提高小型机的速度 add_speed(small_enemies, 1) elif level == 2 and score > 30000: level = 3 upgrade_sound.play() # 增加5架小型敌机,3架中型敌机,2架大型敌机 add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 3) add_big_enemies(big_enemies, enemies, 2) # 提高小型机的速度 add_speed(small_enemies, 1) add_speed(mid_enemies, 1) elif level == 3 and score > 60000: level = 4 upgrade_sound.play() # 增加5架小型敌机,3架中型敌机,2架大型敌机 add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 3) add_big_enemies(big_enemies, enemies, 2) # 提高小型机的速度 add_speed(small_enemies, 1) add_speed(mid_enemies, 1) elif level == 4 and score > 100000: level = 5 upgrade_sound.play() # 增加5架小型敌机,3架中型敌机,2架大型敌机 add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 3) add_big_enemies(big_enemies, enemies, 2) # 提高小型机的速度 add_speed(small_enemies, 1) add_speed(mid_enemies, 1) add_speed(big_enemies, 1) elif event.type == INVINCIBLE_TIME: heroPlan.invincible = False pygame.time.set_timer(INVINCIBLE_TIME, 0) if life_num and not paused: #检测用户的键盘操作 key_pressed = pygame.key.get_pressed() if key_pressed[K_w] or key_pressed[K_UP]: heroPlan.moveUp() if key_pressed[K_s] or key_pressed[K_DOWN]: heroPlan.moveDown() if key_pressed[K_a] or key_pressed[K_LEFT]: heroPlan.moveLeft() if key_pressed[K_d] or key_pressed[K_RIGHT]: heroPlan.moveRight() # 绘制超级子弹补给并检测是否获得 if bullet_supply.active: bullet_supply.move() screen.blit(bullet_supply.image, bullet_supply.rect) if pygame.sprite.collide_mask(bullet_supply, heroPlan): get_bomb_sound.play() #发射超级子弹 is_double_bullet = True pygame.time.set_timer(DOUBLE_BULLET_TIME, 18 * 1000) bullet_supply.active = False #绘制全屏炸弹补给并检测是否获得 if bomb_supply.active: bomb_supply.move() screen.blit(bomb_supply.image, bomb_supply.rect) if pygame.sprite.collide_mask(bomb_supply, heroPlan): get_bomb_sound.play() if bomb_num < 3: bomb_num += 1 bomb_supply.active = False # 发射子弹 if not (delay % 10): bullet_sound.play() if is_double_bullet: bullets = bullet2 bullets[bullet2_index].reset( (heroPlan.rect.centerx - 25, heroPlan.rect.centery)) bullets[bullet2_index + 1].reset( (heroPlan.rect.centerx + 20, heroPlan.rect.centery)) bullet2_index = (bullet2_index + 2) % BULLET2_NUM else: bullets = bullet1 bullets[bullet1_index].reset(heroPlan.rect.midtop) bullet1_index = (bullet1_index + 1) % BULLET1_NUM #检测子弹是否击中敌机 for b in bullets: if b.active: b.move() screen.blit(b.image, b.rect) enemy_hit = pygame.sprite.spritecollide( b, enemies, False, pygame.sprite.collide_mask) if enemy_hit: b.active = False for e in enemy_hit: if e in mid_enemies or e in big_enemies: e.hit = True e.energy -= 1 if e.energy == 0: e.active = False else: e.active = False #绘制大型敌机 for each in big_enemies: if each.active: each.move() if each.hit: screen.blit(each.image_hit, each.rect) each.hit = False else: if switch_image: screen.blit(each.image1, each.rect) else: screen.blit(each.image2, each.rect) #绘制血槽 pygame.draw.line(screen, BLACK, (each.rect.left, each.rect.top - 5), (each.rect.right, each.rect.top - 5), 2) #当生命大于20%显示绿色,否则显示红色 energy_remain = each.energy / enemy.BigEnemy.energy if energy_remain > 0.2: energy_color = GREEN else: energy_color = RED pygame.draw.line(screen,energy_color, (each.rect.left,each.rect.top - 5), (each.rect.left + each.rect.width * energy_remain,each.rect.top - 5),\ 2) #即将出场,播放音效 if each.rect.bottom == -50: enemy3_fly_sound.play(-1) else: #毁灭 if not (delay % 3): if e3_destroy_index == 0: enemy3_down_sound.play() screen.blit(each.destroy_images[e3_destroy_index], each.rect) e3_destroy_index = (e3_destroy_index + 1) % 6 if e3_destroy_index == 0: enemy3_fly_sound.stop() score += 10000 each.reset() #中型敌机 for each in mid_enemies: if each.active: each.move() if each.hit: screen.blit(each.image_hit, each.rect) each.hit = False else: screen.blit(each.image, each.rect) #绘制血槽 pygame.draw.line(screen, BLACK, (each.rect.left, each.rect.top - 5), (each.rect.right, each.rect.top - 5), 2) #当生命大于20%显示绿色,否则显示红色 energy_remain = each.energy / enemy.MidEnemy.energy if energy_remain > 0.2: energy_color = GREEN else: energy_color = RED pygame.draw.line(screen,energy_color, (each.rect.left,each.rect.top - 5), (each.rect.left + each.rect.width * energy_remain,each.rect.top - 5),\ 2) else: #毁灭 if not (delay % 3): screen.blit(each.destroy_images[e2_destroy_index], each.rect) e2_destroy_index = (e2_destroy_index + 1) % 4 if e2_destroy_index == 0: enemy2_down_sound.play() score += 6000 each.reset() #小型敌机 for each in small_enemies: if each.active: each.move() screen.blit(each.image, each.rect) else: #毁灭 if not (delay % 5): if e1_destroy_index == 0: enemy1_down_sound.play() screen.blit(each.destroy_images[e1_destroy_index], each.rect) e1_destroy_index = (e1_destroy_index + 1) % 4 if e1_destroy_index == 0: score += 1000 each.reset() #检测敌我飞机是否碰撞 enemies_down = pygame.sprite.spritecollide( heroPlan, enemies, False, pygame.sprite.collide_mask) if enemies_down and not heroPlan.invincible: heroPlan.active = False for e in enemies_down: e.active = False #绘制英雄飞机 if heroPlan.active: if switch_image: screen.blit(heroPlan.image1, heroPlan.rect) else: screen.blit(heroPlan.image2, heroPlan.rect) else: #毁灭 hero_down_sound.play() if not (delay % 3): screen.blit(heroPlan.destroy_images[hero_destroy_index], heroPlan.rect) hero_destroy_index = (hero_destroy_index + 1) % 4 if hero_destroy_index == 0: life_num -= 1 heroPlan.reset() pygame.time.set_timer(INVINCIBLE_TIME, 3 * 1000) #绘制剩余生命数量 if life_num: for i in range(life_num): screen.blit(life_image, (width - 10 - (i + 1) * life_rect.width, height - 10 - life_rect.height)) #绘制全屏炸弹数量 bomb_text = bomb_font.render("x %d" % bomb_num, True, RED) text_rect = bomb_text.get_rect() screen.blit(bomb_image, (10, height - 10 - bomb_rect.height)) screen.blit(bomb_text, (20 + bomb_rect.width, height - 5 - text_rect.height)) #绘制得分 score_text = score_font.render("Scroe : %s" % str(score), True, WHITE) screen.blit(score_text, (10, 5)) #绘制游戏结束画面 elif life_num == 0: #背景音乐停止 pygame.mixer.music.stop() #停止全部音效 pygame.mixer.stop() #停止发放补给 pygame.time.set_timer(SUPPLY_TIME, 0) if not recorded: recorded = True #读取历史最高得分 with open("record.txt", "r") as f: record_score = int(f.read()) #如果玩家得分高于历史最高得分,则存档 if score > record_score: with open("record.txt", "w") as f: f.write(str(score)) #绘制游戏结束画面 record_score_text = score_font.render("Best : %d" % record_score, True, WHITE) screen.blit(record_score_text, (50, 50)) gameover_text1 = gameover_font.render("Your Score", True, (255, 255, 255)) gameover_text1_rect = gameover_text1.get_rect() gameover_text1_rect.left,gameover_text1_rect.top = (width - gameover_text1_rect.width) //2,\ (height -gameover_text1_rect.height) // 2 - 50 screen.blit(gameover_text1, gameover_text1_rect) gameover_text2 = gameover_font.render(str(score), True, (255, 255, 255)) gameover_text2_rect = gameover_text2.get_rect() gameover_text2_rect.left,gameover_text2_rect.top = (width - gameover_text2_rect.width) //2,\ gameover_text1_rect.bottom + 10 screen.blit(gameover_text2, gameover_text2_rect) restart_rect.left, restart_rect.top = ( width - restart_rect.width) // 2, (gameover_text2_rect.bottom + 50) screen.blit(restart_image, restart_rect) quit_rect.left, quit_rect.top = ( width - quit_rect.width) // 2, restart_rect.bottom + 10 screen.blit(quit_image, quit_rect) #检测用户的鼠标操作 #如果用户按下鼠标左键 if pygame.mouse.get_pressed()[0]: #获取鼠标坐标 pos = pygame.mouse.get_pos() #如果用户点击“重新开始,重新开始游戏” if restart_rect.left < pos[ 0] < restart_rect.right and restart_rect.top < pos[ 1] < restart_rect.bottom: #调用main()函数,重新开始游戏 main() #如果用户点击“结束游戏” elif quit_rect.left < pos[ 0] < quit_rect.right and quit_rect.top < pos[ 1] < quit_rect.bottom: pygame.quit() sys.exit() #绘制暂停按钮 screen.blit(paused_image, paused_rect) # 显示需要显示的内容 # pygame.display.update() pygame.display.flip() clock.tick(60) #切换图片 if not (delay % 5): switch_image = not switch_image delay -= 1 if not delay: delay = 100 #增加延时,解决cup占用率较高的问题 time.sleep(0.01)
def main(): pygame.mixer.music.play(-1) bullets = [] #统计得分 score = 0 score_font = pygame.font.Font("font/59011=VTCBelialsBlade3d.ttf", 36) #标志是否暂停 paused = False pause_nor_image = pygame.image.load( "image/game_pause_nor.png").convert_alpha() pause_pressed_image = pygame.image.load( "image/game_pause_pressed.png").convert_alpha() resume_nor_image = pygame.image.load( "image/game_resume_nor.png").convert_alpha() resume_pressed_image = pygame.image.load( "image/game_resume_pressed.png").convert_alpha() paused_rect = pause_nor_image.get_rect() paused_rect.left, paused_rect.top = width - paused_rect.width - 10, 10 paused_image = pause_nor_image #设置难度级别 level = 1 #全屏炸弹 bomb_image = pygame.image.load("image/bomb.png").convert_alpha() bomb_rect = bomb_image.get_rect() bomb_font = pygame.font.SysFont("calibriz", 48) bomb_num = 3 #每30秒发放一个补给包 bullet_supply = supply.Bullet_Supply(bg_size) bomb_supply = supply.Bomb_Supply(bg_size) SUPPLY_TIME = USEREVENT pygame.time.set_timer(SUPPLY_TIME, 30 * 1000) #超级子弹定时器 DOUBLE_BULLET_TIME = USEREVENT + 1 #标志是否使用超级子弹 is_double_bullet = False #解除我方无敌状态定时器 INVINCIBLE_TIME = USEREVENT + 2 #用于阻止重复打开文件 recorded = False #游戏结束画面 gameover_font = pygame.font.SysFont("calibrib", 48) again_image = pygame.image.load("image/game_again.png").convert_alpha() again_rect = again_image.get_rect() gameover_image = pygame.image.load("image/game_over.png").convert_alpha() gameover_rect = gameover_image.get_rect() #游戏开始界面 start_flag = True gamestart_font = pygame.font.SysFont("ALGER", 55) game_start_text = gamestart_font.render("boom", True, BLUE) game_start_rect = game_start_text.get_rect() game_start_rect.left,game_start_rect.top = (width - game_start_rect.width)//2,\ (height - game_start_rect.height)//2 #设置开始定时器 START_TIME = USEREVENT + 3 pygame.time.set_timer(START_TIME, 5 * 1000) #生命数量 life_image = pygame.image.load("image/life.png").convert_alpha() life_rect = life_image.get_rect() life_num = 3 #生成我方飞机 me = myplane.MyPlane(bg_size) #生成敌方飞机 enemies = pygame.sprite.Group() #生成敌方小型飞机 small_enemies = pygame.sprite.Group() add_small_enemies(small_enemies, enemies, 15) #生成敌方中型飞机 mid_enemies = pygame.sprite.Group() add_mid_enemies(mid_enemies, enemies, 4) #生成敌方大型飞机 big_enemies = pygame.sprite.Group() add_big_enemies(big_enemies, enemies, 2) clock = pygame.time.Clock() #生成普通子弹 bullet1 = [] bullet1_index = 0 BULLET1_NUM = 4 for i in range(BULLET1_NUM): bullet1.append(bullet.Bullet1(me.rect.midtop)) #生成超级子弹 bullet2 = [] bullet2_index = 0 BULLET2_NUM = 8 for i in range(BULLET2_NUM // 2): bullet2.append(bullet.Bullet2((me.rect.centerx - 33, me.rect.centery))) bullet2.append(bullet.Bullet2((me.rect.centerx + 30, me.rect.centery))) #中弹图片索引 e1_destroy_index = 0 e2_destroy_index = 0 e3_destroy_index = 0 me_destroy_index = 0 #用于切换图片 switch_image = True #用于延时 delay = 100 running = True while running: for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() elif event.type == MOUSEBUTTONDOWN: if event.button == 1 and paused_rect.collidepoint(event.pos): paused = not paused button_sound.play() if paused: pygame.time.set_timer(SUPPLY_TIME, 0) pygame.mixer.music.pause() pygame.mixer.pause() paused_image = resume_nor_image else: pygame.time.set_timer(SUPPLY_TIME, 30 * 1000) pygame.mixer.music.unpause() pygame.mixer.unpause() paused_image = pause_nor_image if event.button == 1 and gameover_rect.collidepoint(event.pos): pygame.quit() sys.exit() if event.button == 1 and again_rect.collidepoint(event.pos): life_num = 3 elif event.type == MOUSEMOTION: if paused_rect.collidepoint(event.pos): if paused: paused_image = resume_pressed_image else: paused_image = pause_pressed_image else: if paused: paused_image = resume_nor_image else: paused_image = pause_nor_image elif event.type == KEYDOWN: if event.key == K_SPACE: if bomb_num: bomb_num -= 1 bomb_sound.play() for each in enemies: if each.rect.bottom > 0: each.active = 0 elif event.type == SUPPLY_TIME: supply_sound.play() if choice([True, False]): bomb_supply.reset() else: bullet_supply.reset() elif event.type == DOUBLE_BULLET_TIME: is_double_bullet = False pygame.time.set_timer(DOUBLE_BULLET_TIME, 0) elif event.type == INVINCIBLE_TIME: me.invincible = False pygame.time.set_timer(INVINCIBLE_TIME, 0) elif event.type == START_TIME: start_flag = False pygame.time.set_timer(START_TIME, 0) #根据用户的得分增加难度 if level == 1 and score > 5000: level = 2 #增加3架小型敌机,2架中型敌机和一架大型敌机 add_small_enemies(small_enemies, enemies, 3) add_mid_enemies(mid_enemies, enemies, 2) add_big_enemies(big_enemies, enemies, 1) #提升小型飞机速速度 inc_speed(small_enemies, 1) elif level == 2 and score > 30000: level = 3 #增加5架小型敌机,3架中型敌机和2架大型敌机 add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 3) add_big_enemies(big_enemies, enemies, 2) #提升小型飞机速速度 inc_speed(small_enemies, 1) inc_speed(mid_enemies, 1) elif level == 3 and score > 600000: level = 4 #增加5架小型敌机,3架中型敌机和2架大型敌机 add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 3) add_big_enemies(big_enemies, enemies, 2) #提升小型飞机速速度 inc_speed(small_enemies, 1) inc_speed(mid_enemies, 1) elif level == 4 and score > 1000000: level = 5 #增加5架小型敌机,3架中型敌机和2架大型敌机 add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 3) add_big_enemies(big_enemies, enemies, 2) #提升小型飞机速速度 inc_speed(small_enemies, 1) inc_speed(mid_enemies, 1) screen.blit(background, (0, 0)) if start_flag: screen.blit(game_start_text, game_start_rect) if life_num and not paused and not start_flag: #检测用户的键盘操作 key_pressed = pygame.key.get_pressed() if key_pressed[K_w] or key_pressed[K_UP]: me.moveUp() if key_pressed[K_s] or key_pressed[K_DOWN]: me.moveDown() if key_pressed[K_a] or key_pressed[K_LEFT]: me.moveLeft() if key_pressed[K_d] or key_pressed[K_RIGHT]: me.moveRight() #绘制全屏炸弹补给并检测是否获得 if bomb_supply.active: bomb_supply.move() screen.blit(bomb_supply.image, bomb_supply.rect) if pygame.sprite.collide_mask(bomb_supply, me): get_bomb_sound.play() if bomb_num < 3: bomb_num += 1 bomb_supply.active = False #绘制超级子弹补给并检测是否获得 if bullet_supply.active: bullet_supply.move() screen.blit(bullet_supply.image, bullet_supply.rect) if pygame.sprite.collide_mask(bullet_supply, me): get_bullet_sound.play() #发射超级子弹 is_double_bullet = True pygame.time.set_timer(DOUBLE_BULLET_TIME, 18 * 1000) bullet_supply.active = False #发射子弹 if not (delay % 10): bullet_sound.play() if is_double_bullet: bullets = bullet2 bullets[bullet2_index].reset( (me.rect.centerx - 33, me.rect.centery)) bullets[bullet2_index + 1].reset( (me.rect.centerx + 30, me.rect.centery)) bullet2_index = (bullet2_index + 2) % BULLET2_NUM else: bullets = bullet1 bullets[bullet1_index].reset(me.rect.midtop) bullet1_index = (bullet1_index + 1) % BULLET1_NUM #检测子弹是否击中敌机 for b in bullets: if b.active: b.move() screen.blit(b.image, b.rect) enemy_hit = pygame.sprite.spritecollide( b, enemies, False, pygame.sprite.collide_mask) if enemy_hit: b.active = False for e in enemy_hit: if e in mid_enemies or e in big_enemies: e.hit = True e.energy -= 1 if e.energy == 0: e.active = False else: e.active = False #绘制大型敌机 for each in big_enemies: if each.active: each.move() if each.hit: screen.blit(each.image_hit, each.rect) each.hit = False else: if switch_image: screen.blit(each.image1, each.rect) else: screen.blit(each.image2, each.rect) #绘制血槽 pygame.draw.line(screen,BLACK,(each.rect.left,each.rect.top-5),\ (each.rect.right,each.rect.top-5),2) #当生命大于20%显示绿色,否则显示红色 energy_remain = each.energy / enemy.BigEnemy.energy if energy_remain > 0.2: energy_color = GREEN else: energy_color = RED pygame.draw.line(screen,energy_color,\ (each.rect.left,each.rect.top-5),\ (each.rect.left+each.rect.width*energy_remain,each.rect.top-5),\ 2) #即将出现在画面中,播放音效 if each.rect.bottom == -50: enemy3_fly_sound.play(-1) else: #毁灭 if not (delay % 3): if e3_destroy_index == 0: enemy3_fly_sound.stop() enemy3_down_sound.play() screen.blit(each.destroy_images[e3_destroy_index], each.rect) e3_destroy_index = (e3_destroy_index + 1) % 6 if e3_destroy_index == 0: score += 10000 each.reset() #绘制中型敌机 for each in mid_enemies: if each.active: each.move() if each.hit: screen.blit(each.image_hit, each.rect) each.hit = False else: screen.blit(each.image, each.rect) #绘制血槽 pygame.draw.line(screen,BLACK,(each.rect.left,each.rect.top-5),\ (each.rect.right,each.rect.top-5),2) #当生命大于20%显示绿色,否则显示红色 energy_remain = each.energy / enemy.MidEnemy.energy if energy_remain > 0.2: energy_color = GREEN else: energy_color = RED pygame.draw.line(screen,energy_color,\ (each.rect.left,each.rect.top-5),\ (each.rect.left+each.rect.width*energy_remain,each.rect.top-5),\ 2) else: #毁灭 if not (delay % 3): if e2_destroy_index == 0: enemy2_down_sound.play() screen.blit(each.destroy_images[e2_destroy_index], each.rect) e2_destroy_index = (e2_destroy_index + 1) % 4 if e2_destroy_index == 0: score += 6000 each.reset() #绘制小型敌机 for each in small_enemies: if each.active: each.move() screen.blit(each.image, each.rect) else: #毁灭 if not (delay % 3): if e1_destroy_index == 0: enemy1_down_sound.play() screen.blit(each.destroy_images[e1_destroy_index], each.rect) e1_destroy_index = (e1_destroy_index + 1) % 4 if e1_destroy_index == 0: score += 1000 each.reset() #检测我方飞机是否被撞 enemies_down = pygame.sprite.spritecollide( me, enemies, False, pygame.sprite.collide_mask) if enemies_down and not me.invincible: me.active = False for each in enemies_down: each.active = False #绘制我方飞机 if me.active: if switch_image: screen.blit(me.image1, me.rect) else: screen.blit(me.image2, me.rect) else: #毁灭 #me_down_sound.play() if not (delay % 3): screen.blit(me.destroy_images[me_destroy_index], me.rect) me_destroy_index = (me_destroy_index + 1) % 4 if me_destroy_index == 0: life_num -= 1 me.reset() pygame.time.set_timer(INVINCIBLE_TIME, 3 * 1000) #绘制全屏炸弹数量 bomb_text = bomb_font.render("x %d" % bomb_num, True, WHITE) text_rect = bomb_text.get_rect() screen.blit(bomb_image, (10, height - 10 - bomb_rect.height)) screen.blit(bomb_text, (20 + bomb_rect.width, height - 5 - text_rect.height)) #绘制剩余生命数量 if life_num: for i in range(life_num): screen.blit(life_image,(width - (i+1)*life_rect.width,\ height-10-life_rect.height)) #绘制游戏结束画面 elif life_num == 0: #背景音乐停止 pygame.mixer.music.stop() #停止全部音效 pygame.mixer.stop() #停止发放补给 pygame.time.set_timer(SUPPLY_TIME, 0) if not recorded: recorded = True #读取历史最高得分 with open("record.txt", "r") as f: record_score = int(f.read()) #如果玩家得分高于历史最高得分,则存档 if score > record_score: with open("record.txt", "w") as f: f.write(str(score)) #绘制结束画面 record_score_text = score_font.render("Best: %d" % record_score, True, WHITE) screen.blit(record_score_text, (50, 50)) gameover_text1 = gameover_font.render("Your Score", True, WHITE) gameover_text1_rect = gameover_text1.get_rect() gameover_text1_rect.left,gameover_text1_rect.top =\ (width - gameover_text1_rect.width)//2,\ (height -gameover_text1_rect.height)//2 screen.blit(gameover_text1, gameover_text1_rect) gameover_text2 = gameover_font.render(str(score), True, RED) gameover_text2_rect = gameover_text2.get_rect() gameover_text2_rect.left,gameover_text2_rect.top =\ (width - gameover_text2_rect.width)//2,\ gameover_text1_rect.bottom + 10 screen.blit(gameover_text2, gameover_text2_rect) again_rect.left,again_rect.top = \ (width - again_rect.width)//2,\ gameover_text2_rect.bottom + 50 screen.blit(again_image, again_rect) gameover_rect.left,gameover_rect.top = \ (width - gameover_rect.width)//2,\ again_rect.bottom + 10 screen.blit(gameover_image, gameover_rect) #绘制得分 score_text = score_font.render("Score : %s" % str(score), True, WHITE) if life_num and not start_flag: screen.blit(score_text, (10, 5)) #绘制暂停按钮 screen.blit(paused_image, paused_rect) #切换图片 if not (delay % 5): switch_image = not switch_image delay -= 1 if not delay: delay = 100 pygame.display.flip() clock.tick(30)
def main(): # 设置播放通道的最大数 pygame.mixer.set_num_channels(20) pygame.mixer.music.play(-1) # 生成我方飞机 me = myplane.MyPlane(bg_size) # 生成普通子弹 bullet1 = [] bullet1_index = 0 BULLET1_NUM = 10 for i in range(BULLET1_NUM): bullet1.append(bullet.Bullet1(me.rect.midtop)) # 生命数量 life_image = pygame.image.load('images/life.png').convert_alpha() life_rect = life_image.get_rect() life_num = 3 # 生成敌方小、中、大飞机 enemies = pygame.sprite.Group() # 小型敌机 small_enemies = pygame.sprite.Group() add_small_enemies(small_enemies, enemies, 15) # 中型敌机 mid_enemies = pygame.sprite.Group() add_mid_enemies(mid_enemies, enemies, 7) # 大型敌机 big_enemies = pygame.sprite.Group() add_big_enemies(big_enemies, enemies, 1) # 超级子弹定时器 DOUBLE_BULLET_TIME = USEREVENT + 1 # 是否使用超级子弹 is_double_bullet = False # 生成超级子弹 bullet2 = [] bullet2_index = 0 BULLET2_NUM = 20 for i in range(BULLET2_NUM // 2): bullet2.append(bullet.Bullet2((me.rect.centerx - 33, me.rect.centery))) bullet2.append(bullet.Bullet2((me.rect.centerx + 30, me.rect.centery))) # 用于切换飞机图片 switch = True # 用于控制帧率 delay = 100 # 中弹图片索引 e1_destroy_index = 0 e2_destroy_index = 0 e3_destroy_index = 0 me_destroy_index = 0 # 统计得分 score = 0 # 导入字体样式 score_font = pygame.font.Font('font/font.ttf', 36) # 表示是否暂停游戏 paused = False pause_nor_image = pygame.image.load('images/pause_nor.png').convert_alpha() pause_pressed_image = pygame.image.load( 'images/pause_pressed.png').convert_alpha() resume_nor_image = pygame.image.load( 'images/resume_nor.png').convert_alpha() resume_pressed_image = pygame.image.load( 'images/resume_pressed.png').convert_alpha() paused_rect = pause_nor_image.get_rect() paused_rect.left, paused_rect.top = width - paused_rect.width - 10, 10 paused_image = pause_nor_image # 设置难度级别 level = 1 # 全屏炸弹 bomb_image = resume_pressed_image = pygame.image.load( 'images/bomb.png').convert_alpha() bobm_image_rect = bomb_image.get_rect() bomb_font = pygame.font.Font('font/font.ttf', 48) bomb_num = 3 # 每30秒发放一次补给 bullet_supply = supply.Bullet_Supply(bg_size) bomb_supply = supply.Bomb_Supply(bg_size) SUPPLY_TIME = USEREVENT pygame.time.set_timer(SUPPLY_TIME, 30 * 1000) # 用于阻止重复打开记录文件 recorded = False # 游戏结束画面 gameover_font = pygame.font.Font('font/font.ttf', 48) again_image = pygame.image.load("images/again.png").convert_alpha() again_rect = again_image.get_rect() gameover_image = pygame.image.load("images/gameover.png").convert_alpha() gameover_rect = gameover_image.get_rect() # 用于控制帧率 clock = pygame.time.Clock() running = True while running: for event in pygame.event.get(): # 检测用户是否关闭窗口 if event.type == QUIT: pygame.quit() sys.exit() elif event.type == MOUSEBUTTONUP: if event.button == 1 and paused_rect.collidepoint(event.pos): paused = not paused if paused: pygame.time.set_timer(SUPPLY_TIME, 0) pygame.mixer.music.pause() pygame.mixer.pause() else: pygame.time.set_timer(SUPPLY_TIME, 30 * 1000) pygame.mixer.music.unpause() pygame.mixer.unpause() elif event.type == MOUSEMOTION: if paused_rect.collidepoint(event.pos): if paused: paused_image = resume_pressed_image else: paused_image = pause_pressed_image else: if paused: paused_image = resume_nor_image else: paused_image = pause_nor_image elif event.type == KEYUP: if event.key == K_SPACE: if bomb_num: bomb_num -= 1 bomb_sound.play() for each in enemies: if each.rect.bottom > 0: each.active = False elif event.type == SUPPLY_TIME: supply_sound.play() if choice([True, False]): bullet_supply.reset() else: bomb_supply.reset() elif event.type == DOUBLE_BULLET_TIME: is_double_bullet = False pygame.time.set_timer(DOUBLE_BULLET_TIME, 0) # 根据用户的得分增加难度 if level == 1 and score > 500: level = 2 upgrade_sound.play() # 增加5架小型机,3架中型机,1架大型机 add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 3) add_big_enemies(big_enemies, enemies, 1) elif level == 2 and score > 1500: level = 3 upgrade_sound.play() # 增加5架小型机,3架中型机,1架大型机 add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 3) add_big_enemies(big_enemies, enemies, 1) # 提升飞机型机的速度 inc_speed(small_enemies, 1) elif level == 3 and score > 3000: level = 4 upgrade_sound.play() # 增加5架小型机,3架中型机,1架大型机 add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 3) add_big_enemies(big_enemies, enemies, 1) inc_speed(small_enemies, 1) inc_speed(mid_enemies, 1) elif level == 4 and score > 5000: level = 5 upgrade_sound.play() # 增加5架小型机,3架中型机,1架大型机 add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 3) add_big_enemies(big_enemies, enemies, 1) inc_speed(small_enemies, 1) inc_speed(mid_enemies, 1) inc_speed(big_enemies, 1) # 绘制背景 screen.blit(background, (0, 0)) if life_num and not paused: # 检测用户的键盘操作 key_pressed = pygame.key.get_pressed() if key_pressed[K_w] or key_pressed[K_UP]: me.moveUp() if key_pressed[K_s] or key_pressed[K_DOWN]: me.moveDown() if key_pressed[K_a] or key_pressed[K_LEFT]: me.moveLeft() if key_pressed[K_d] or key_pressed[K_RIGHT]: me.moveRight() # 绘制全屏炸弹补给并检测玩家是否获得 if bomb_supply.active: bomb_supply.move() screen.blit(bomb_supply.image, bomb_supply.rect) if pygame.sprite.collide_mask(bomb_supply, me): get_bomb_sound.play() if bomb_num < 3: bomb_num += 1 bomb_supply.active = False # 绘制超级子弹补给并检测玩家是否获得 if bullet_supply.active: bullet_supply.move() screen.blit(bullet_supply.image, bullet_supply.rect) if pygame.sprite.collide_mask(bullet_supply, me): get_bullet_sound.play() # 发射超级子弹 is_double_bullet = True pygame.time.set_timer(DOUBLE_BULLET_TIME, 20 * 1000) bullet_supply.active = False # 发射子弹 if not (delay % 5): bullet_sound.play() if is_double_bullet: bullets = bullet2 bullets[bullet2_index].reset( (me.rect.centerx - 33, me.rect.centery)) bullets[bullet2_index + 1].reset( (me.rect.centerx + 30, me.rect.centery)) bullet2_index = (bullet2_index + 2) % BULLET2_NUM else: bullets = bullet1 bullets[bullet1_index].reset(me.rect.midtop) bullet1_index = (bullet1_index + 1) % BULLET1_NUM # 检测子弹是否击中敌机 for b in bullets: if b.active: b.move() screen.blit(b.image, b.rect) enemy_hit = pygame.sprite.spritecollide( b, enemies, False, pygame.sprite.collide_mask) if enemy_hit: b.active = False for e in enemy_hit: if e in mid_enemies or e in big_enemies: e.hit = True e.hp -= 1 if e.hp == 0: e.active = False else: e.hp -= 1 if e.hp == 0: e.active = False # 绘制敌机(大) for each in big_enemies: if each.active: each.move() if each.hit == True: # 绘制被打到的特效 screen.blit(each.image_hit, each.rect) each.hit = False else: if switch: screen.blit(each.image1, each.rect) else: screen.blit(each.image2, each.rect) # 绘制血槽 hp(each, enemy.BigEnmy) # 敌机出现开始播放音效 if each.rect.bottom == -50: enemy3_fly_sound.play(-1) else: # 毁灭 if not (delay % 3): if e3_destroy_index == 0: enemy3_fly_sound.stop() enemy3_down_sound.play() screen.blit(each.destroy_images[e3_destroy_index], each.rect) e3_destroy_index = (e3_destroy_index + 1) % 6 if e3_destroy_index == 0: score += 100 each.reset() # 绘制敌机(中) for each in mid_enemies: if each.active: each.move() if each.hit == True: # 绘制被打到的特效 screen.blit(each.image_hit, each.rect) each.hit = False else: screen.blit(each.image, each.rect) # 绘制血槽 hp(each, enemy.MidEnmy) else: # 毁灭 if not (delay % 3): if e2_destroy_index == 0: enemy2_down_sound.play() screen.blit(each.destroy_images[e2_destroy_index], each.rect) e2_destroy_index = (e2_destroy_index + 1) % 4 if e2_destroy_index == 0: score += 60 each.reset() # 绘制敌机(小) for each in small_enemies: if each.active: each.move() screen.blit(each.image, each.rect) # 绘制血槽 hp(each, enemy.SmallEnmy) else: # 毁灭 if not (delay % 3): if e1_destroy_index == 0: enemy1_down_sound.play() screen.blit(each.destroy_images[e1_destroy_index], each.rect) e1_destroy_index = (e1_destroy_index + 1) % 4 if e1_destroy_index == 0: score += 10 each.reset() # 检测我方飞机是否被撞 enemies_down = pygame.sprite.spritecollide( me, enemies, False, pygame.sprite.collide_mask) if enemies_down: me.active = False for e in enemies_down: e.active = False # 绘制我方飞机 if me.active: if switch: screen.blit(me.image1, me.rect) else: screen.blit(me.image2, me.rect) else: # 我方飞机毁灭 if not (delay % 3): if me_destroy_index == 0: me_down_sound.play() screen.blit(me.destroy_images[me_destroy_index], me.rect) me_destroy_index = (me_destroy_index + 1) % 4 if me_destroy_index == 0: # 释放全屏炸弹并复活 for each in enemies: if each.rect.bottom > 0: each.active = False life_num -= 1 me.reset() # 绘制得分 score_text = score_font.render('Score : %s' % str(score), True, WHITE) screen.blit(score_text, (10, 5)) # 绘制游戏结束 elif life_num == 0: # 背景音乐停止 pygame.mixer.music.stop() # 停止所有音效 pygame.mixer.stop() # 停止发放补给 pygame.time.set_timer(SUPPLY_TIME, 0) if not recorded: # 读取历史最高得分 with open('record.txt', 'r') as f: record_score = int(f.read()) # 如果本次得分高于历史最高, 则存档 if score > record_score: with open('record.txt', 'w') as f: f.write(str(score)) recorded = True # 绘制结束界面 record_score_text = score_font.render("Best : %d" % record_score, True, (255, 255, 255)) screen.blit(record_score_text, (50, 50)) gameover_text1 = gameover_font.render("Your Score", True, (255, 255, 255)) gameover_text1_rect = gameover_text1.get_rect() gameover_text1_rect.left, gameover_text1_rect.top = \ (width - gameover_text1_rect.width) // 2, height // 3 screen.blit(gameover_text1, gameover_text1_rect) gameover_text2 = gameover_font.render(str(score), True, (255, 255, 255)) gameover_text2_rect = gameover_text2.get_rect() gameover_text2_rect.left, gameover_text2_rect.top = \ (width - gameover_text2_rect.width) // 2, \ gameover_text1_rect.bottom + 10 screen.blit(gameover_text2, gameover_text2_rect) again_rect.left, again_rect.top = \ (width - again_rect.width) // 2, \ gameover_text2_rect.bottom + 50 screen.blit(again_image, again_rect) gameover_rect.left, gameover_rect.top = \ (width - again_rect.width) // 2, \ again_rect.bottom + 10 screen.blit(gameover_image, gameover_rect) # 检测用户的鼠标操作 # 如果用户按下鼠标左键 if pygame.mouse.get_pressed()[0]: # 获取鼠标坐标 pos = pygame.mouse.get_pos() # 如果用户点击“重新开始” if again_rect.left < pos[0] < again_rect.right and \ again_rect.top < pos[1] < again_rect.bottom: # 调用main函数,重新开始游戏 main() # 如果用户点击“结束游戏” elif gameover_rect.left < pos[0] < gameover_rect.right and \ gameover_rect.top < pos[1] < gameover_rect.bottom: # 退出游戏 pygame.quit() sys.exit() # 绘制暂停按钮 screen.blit(paused_image, paused_rect) # 绘制剩余炸弹数量 bomb_text = score_font.render('× %d' % bomb_num, True, WHITE) bomb_text_rect = bomb_text.get_rect() screen.blit(bomb_image, (10, height - 10 - bomb_text_rect.height)) screen.blit( bomb_text, (20 + bobm_image_rect.width, height - 5 - bomb_text_rect.height)) # 绘制剩余生命数量 if life_num: for i in range(life_num): screen.blit(life_image, \ (width - 10 - (i + 1) * life_rect.width, \ height - 10 - life_rect.height)) # 控制飞机图片切换速度 if not (delay % 5): switch = not switch delay -= 1 if not delay: delay = 100 # 从缓冲区更新到屏幕 pygame.display.flip() # 设置不会超过每秒60帧 clock.tick(60)
def main(): # 播放音乐 pygame.mixer.music.play(-1) # 实例我方飞机 me = myplane.MyPlane(bg_size=bg_size) # 实例敌方飞机 enemies = pygame.sprite.Group() # 实例敌方小型飞机 small_enemies = pygame.sprite.Group() add_small_enemies(small_enemies, enemies, 15) # 实例敌方中型飞机 mid_enemies = pygame.sprite.Group() add_mid_enemies(mid_enemies, enemies, 4) # 实例敌方大型飞机 big_enemies = pygame.sprite.Group() add_big_enemies(big_enemies, enemies, 2) # 实例普通子弹 bullet1 = [] bullet1_index = 0 BULLET1_NUM = 4 for i in range(BULLET1_NUM): bullet1.append(bullet.Bullet1(me.rect.midtop)) # 实例超级子弹 bullet2 = [] bullet2_index = 0 BULLET2_NUM = 8 for i in range(BULLET2_NUM // 2): bullet2.append(bullet.Bullet2((me.rect.centerx - 33, me.rect.centery))) bullet2.append(bullet.Bullet2((me.rect.centerx + 30, me.rect.centery))) # 中弹图片索引 e1_destroy_index = 0 e2_destroy_index = 0 e3_destroy_index = 0 me_destroy_index = 0 # 统计得分 score = 0 score_font = pygame.font.Font("D:/Mycodes/python/PlaneWar/font/font.ttf", 36) # 标志是否暂停游戏 paused = False paused_nor_image = pygame.image.load( "D:/Mycodes/python/PlaneWar/images/pause_nor.png").convert_alpha() paused_pressed_image = pygame.image.load( "D:/Mycodes/python/PlaneWar/images/pause_pressed.png").convert_alpha() resume_nor_image = pygame.image.load( 'D:/Mycodes/python/PlaneWar/images/resume_nor.png').convert_alpha() resume_pressed_image = pygame.image.load( 'D:/Mycodes/python/PlaneWar/images/resume_pressed.png').convert_alpha( ) paused_rect = paused_nor_image.get_rect() paused_rect.left, paused_rect.top = width - paused_rect.width - 10, 10 paused_image = paused_nor_image # 设置难度 level = 1 # 全屏炸弹 bomb_image = pygame.image.load( 'D:/Mycodes/python/PlaneWar/images/bomb.png').convert_alpha() bomb_rect = bomb_image.get_rect() bomb_font = pygame.font.Font("D:/Mycodes/python/PlaneWar/font/font.ttf", 48) bomb_num = 3 # 每30秒发放一个补给包 bullet_supply = supply.Bullet_Supply(bg_size) bomb_supply = supply.Bomb_Supply(bg_size) SUPPLY_TIME = USEREVENT pygame.time.set_timer(SUPPLY_TIME, 30 * 1000) # 超级子弹定时器 DOUBLE_BULLTET_TIME = USEREVENT + 1 # 解除我方重生无敌定时器 INVINCIBLE_TIME = USEREVENT + 2 # 标志是否使用超级子弹 is_double_bullet = False # 生命数量 life_image = pygame.image.load( 'D:/Mycodes/python/PlaneWar/images/life.png').convert_alpha() life_rect = life_image.get_rect() life_num = 3 # 用于切换我方飞机图片 switch_plane = True # 游戏结束画面 gameover_font = pygame.font.Font( "D:/Mycodes/python/PlaneWar/font/font.ttf", 48) again_image = pygame.image.load( "D:/Mycodes/python/PlaneWar/images/again.png").convert_alpha() again_rect = again_image.get_rect() gameover_image = pygame.image.load( "D:/Mycodes/python/PlaneWar/images/gameover.png").convert_alpha() gameover_rect = gameover_image.get_rect() # 用于延迟切换 delay = 100 # 限制打开一次记录文件 recorded = False clock = pygame.time.Clock() running = True while running: for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() elif event.type == MOUSEBUTTONDOWN: if event.button == 1 and paused_rect.collidepoint(event.pos): paused = not paused if paused: pygame.time.set_timer(SUPPLY_TIME, 0) pygame.mixer.music.pause() pygame.mixer.pause() else: pygame.time.set_timer(SUPPLY_TIME, 30 * 1000) pygame.mixer.music.unpause() pygame.mixer.unpause() elif event.type == MOUSEMOTION: if paused_rect.collidepoint(event.pos): if paused: paused_image = resume_pressed_image else: paused_image = paused_pressed_image else: if paused: paused_image = resume_nor_image else: paused_image = paused_nor_image elif event.type == KEYDOWN: if event.key == K_SPACE: if bomb_num: bomb_num -= 1 bomb_sound.play() for each in enemies: if each.rect.bottom > 0: each.active = False elif event.type == SUPPLY_TIME: supply_sound.play() if choice([True, False]): bomb_supply.reset() else: bullet_supply.reset() elif event.type == DOUBLE_BULLTET_TIME: is_double_bullet = False pygame.time.set_timer(DOUBLE_BULLTET_TIME, 0) elif event.type == INVINCIBLE_TIME: me.invincible = False pygame.time.set_timer(INVINCIBLE_TIME, 0) # 根据用户得分增加难度 if level == 1 and score > 5000: level = 2 upgrade_sound.play() # 增加3架小型敌机, 2架中型敌机和1架大型敌机 add_small_enemies(small_enemies, enemies, 3) add_mid_enemies(mid_enemies, enemies, 2) add_big_enemies(big_enemies, enemies, 1) # 提升小型敌机的速度 inc_speed(target=small_enemies, inc=1) elif level == 2 and score > 30000: level = 3 upgrade_sound.play() # 增加5架小型敌机, 3架中型敌机和2架大型敌机 add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 3) add_big_enemies(big_enemies, enemies, 2) # 提升小型敌机的速度 inc_speed(target=small_enemies, inc=1) inc_speed(target=mid_enemies, inc=1) elif level == 3 and score > 60000: level = 4 upgrade_sound.play() # 增加5架小型敌机, 3架中型敌机和2架大型敌机 add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 3) add_big_enemies(big_enemies, enemies, 2) # 提升小型敌机的速度 inc_speed(target=small_enemies, inc=1) inc_speed(target=mid_enemies, inc=1) elif level == 4 and score > 100000: level = 5 upgrade_sound.play() # 增加5架小型敌机, 3架中型敌机和2架大型敌机 add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 3) add_big_enemies(big_enemies, enemies, 2) # 提升小型敌机的速度 inc_speed(target=small_enemies, inc=1) inc_speed(target=mid_enemies, inc=1) inc_speed(target=big_enemies, inc=1) screen.blit(background, (0, 0)) if life_num and not paused: # 检测键盘操作 key_pressed = pygame.key.get_pressed() if key_pressed[K_w] or key_pressed[K_UP]: me.moveUp() if key_pressed[K_s] or key_pressed[K_DOWN]: me.moveDown() if key_pressed[K_a] or key_pressed[K_LEFT]: me.moveLeft() if key_pressed[K_d] or key_pressed[K_RIGHT]: me.moveRight() # 绘制全屏炸弹补给 if bomb_supply.active: bomb_supply.move() screen.blit(bomb_supply.image, bomb_supply.rect) if pygame.sprite.collide_mask(me, bomb_supply): get_bomb_sound.play() if bomb_num < 3: bomb_num += 1 bomb_supply.active = False # 绘制超级子弹补给 if bullet_supply.active: bullet_supply.move() screen.blit(bullet_supply.image, bullet_supply.rect) if pygame.sprite.collide_mask(me, bullet_supply): get_bullet_sound.play() # 发射超级子弹 is_double_bullet = True pygame.time.set_timer(DOUBLE_BULLTET_TIME, 18 * 1000) bullet_supply.active = False # 发射子弹 if not (delay % 10): bullet_sound.play() if is_double_bullet: bullets = bullet2 bullets[bullet2_index].reset( (me.rect.centerx - 33, me.rect.centery)) bullets[bullet2_index + 1].reset( (me.rect.centerx + 30, me.rect.centery)) bullet2_index = (bullet2_index + 2) % BULLET2_NUM else: bullets = bullet1 bullets[bullet1_index].reset(me.rect.midtop) bullet1_index = (bullet1_index + 1) % BULLET1_NUM # 检测子弹是否击中敌机 for b in bullets: if b.active: b.move() screen.blit(b.image, b.rect) enemy_hit = pygame.sprite.spritecollide( b, enemies, False, pygame.sprite.collide_mask) if enemy_hit: b.active = False for each in enemy_hit: each.hit = True each.energy -= 1 if each.energy == 0: each.active = False # 绘制敌方大型机 for each in big_enemies: if each.active: each.move() if each.hit: screen.blit(each.image_hit, each.rect) each.hit = False else: if switch_plane: screen.blit(each.image1, each.rect) else: screen.blit(each.image2, each.rect) # 绘制血槽 pygame.draw.line(screen, BLACK, (each.rect.left, each.rect.top - 5), (each.rect.right, each.rect.top - 5), 2) # 当生命大于20%显示绿色, 否则显示红色 energy_remain = each.energy / enemy.BigEnemy.energy if energy_remain > 0.2: energy_color = GREEN else: energy_color = RED pygame.draw.line( screen, energy_color, (each.rect.left, each.rect.top - 5), (each.rect.left + each.rect.width * energy_remain, each.rect.top - 5), 2) # 即将出现在画面, 播放音效 if each.rect.bottom == -10: enemy3_fly_sound.play(-1) each.appear = True # 离开画面, 关闭音效 if each.rect.bottom < -10 and each.appear: #enemy3_fly_sound.stop() each.appear = False else: # 毁灭 if e3_destroy_index == 0: enemy3_down_sound.play() if not (delay % 2): screen.blit(each.destroy_images[e3_destroy_index], each.rect) e3_destroy_index = (e3_destroy_index + 1) % 6 if e3_destroy_index == 0: enemy3_fly_sound.stop() score += 1000 each.reset() # 绘制敌方中型机 for each in mid_enemies: if each.active: each.move() if each.hit: screen.blit(each.image_hit, each.rect) each.hit = False else: screen.blit(each.image, each.rect) # 绘制血槽 pygame.draw.line(screen, BLACK, (each.rect.left, each.rect.top - 5), (each.rect.right, each.rect.top - 5), 2) # 当生命大于20%显示绿色, 否则显示红色 energy_remain = each.energy / enemy.MidEnemy.energy if energy_remain > 0.2: energy_color = GREEN else: energy_color = RED pygame.draw.line( screen, energy_color, (each.rect.left, each.rect.top - 5), (each.rect.left + each.rect.width * energy_remain, each.rect.top - 5), 2) else: # 毁灭 if e2_destroy_index == 0: enemy2_down_sound.play() if not (delay % 2): screen.blit(each.destroy_images[e2_destroy_index], each.rect) e2_destroy_index = (e2_destroy_index + 1) % 4 if e2_destroy_index == 0: score += 600 each.reset() # 绘制敌方小型机 for each in small_enemies: if each.active: each.move() screen.blit(each.image, each.rect) else: # 毁灭 if e1_destroy_index == 0: enemy1_down_sound.play() if not (delay % 2): screen.blit(each.destroy_images[e1_destroy_index], each.rect) e1_destroy_index = (e1_destroy_index + 1) % 4 if e1_destroy_index == 0: score += 100 each.reset() # 检测我方飞机碰撞 enemies_down = pygame.sprite.spritecollide( me, enemies, False, pygame.sprite.collide_mask) if enemies_down and not me.invincible: me.active = False for each in enemies_down: each.active = False # 绘制我方飞机 if me.active: if switch_plane: screen.blit(me.image1, me.rect) else: screen.blit(me.image2, me.rect) else: # 毁灭 if me_destroy_index == 0: me_down_sound.play() if not (delay % 2): screen.blit(me.destroy_images[me_destroy_index], me.rect) me_destroy_index = (me_destroy_index + 1) % 4 if me_destroy_index == 0: life_num -= 1 me.reset() pygame.time.set_timer(INVINCIBLE_TIME, 3 * 1000) # 绘制全屏炸弹数量 bomb_text = bomb_font.render("× %d" % bomb_num, True, WHITE) text_rect = bomb_text.get_rect() screen.blit(bomb_image, (10, height - 10 - bomb_rect.height)) screen.blit(bomb_text, (20 + bomb_rect.width, height - 5 - text_rect.height)) # 绘制剩余生命数量 if life_num: for i in range(life_num): screen.blit(life_image, ((width - 10 - (i + 1) * life_rect.width), height - 10 - life_rect.height)) # 绘制得分 score_text = score_font.render('Score : %d' % score, True, WHITE) screen.blit(score_text, (10, 5)) # 绘制游戏结束画面 elif life_num == 0: # 背景音乐停止 pygame.mixer.music.stop() # 停止全部音效 pygame.mixer.stop() # 停止发放补给 pygame.time.set_timer(SUPPLY_TIME, 0) if not recorded: recorded = True # 读取历史最高分 with open(r"D:\Mycodes\python\PlaneWar\record\record.txt", 'r') as f: record_score = int(f.read()) # 判断是否高于历史最高分 if score > record_score: with open('record.txt', 'w') as f: f.write(str(score)) # 绘制结束界面 record_score_text = score_font.render("Best : %d" % record_score, True, (255, 255, 255)) screen.blit(record_score_text, (50, 50)) gameover_text1 = gameover_font.render("Your Score", True, (255, 255, 255)) gameover_text1_rect = gameover_text1.get_rect() gameover_text1_rect.left, gameover_text1_rect.top = \ (width - gameover_text1_rect.width) // 2, height // 3 screen.blit(gameover_text1, gameover_text1_rect) gameover_text2 = gameover_font.render(str(score), True, (255, 255, 255)) gameover_text2_rect = gameover_text2.get_rect() gameover_text2_rect.left, gameover_text2_rect.top = \ (width - gameover_text2_rect.width) // 2, \ gameover_text1_rect.bottom + 10 screen.blit(gameover_text2, gameover_text2_rect) again_rect.left, again_rect.top = \ (width - again_rect.width) // 2, \ gameover_text2_rect.bottom + 50 screen.blit(again_image, again_rect) gameover_rect.left, gameover_rect.top = \ (width - again_rect.width) // 2, \ again_rect.bottom + 10 screen.blit(gameover_image, gameover_rect) # 检测用户的鼠标操作 # 如果用户按下鼠标左键 if pygame.mouse.get_pressed()[0]: # 获取鼠标坐标 pos = pygame.mouse.get_pos() # 如果用户点击“重新开始” if again_rect.left < pos[0] < again_rect.right and \ again_rect.top < pos[1] < again_rect.bottom: # 调用main函数,重新开始游戏 main() # 如果用户点击“结束游戏” elif gameover_rect.left < pos[0] < gameover_rect.right and \ gameover_rect.top < pos[1] < gameover_rect.bottom: # 退出游戏 pygame.quit() sys.exit() # 绘制暂停按钮 screen.blit(paused_image, paused_rect) # 用于切换图片 if not (delay % 11): switch_plane = not switch_plane delay -= 1 if not delay: delay = 100 pygame.display.flip() clock.tick(60)
def main(): pygame.mixer.music.play(-1) #播放音乐 #生成我方飞机 me = myplane.MyPlane(bg_size) enemies = pygame.sprite.Group() #生成敌方小型飞机 small_enemies = pygame.sprite.Group() add_small_enemies(small_enemies, enemies, 15) #生成敌方中型飞机 mid_enemies = pygame.sprite.Group() add_mid_enemies(mid_enemies, enemies, 5) #生成敌方大型飞机 big_enemies = pygame.sprite.Group() add_big_enemies(big_enemies, enemies, 2) #中弹图片索引 e1_destroy_index = 0 e2_destroy_index = 0 e3_destroy_index = 0 me_destroy_index = 0 #统计得分 score = 0 score_font = pygame.font.Font("font/font.ttf", 36) #标志是否暂停游戏 paused = False pause_nor_image = pygame.image.load("images/pause_nor.png").convert_alpha() pause_pressed_image = pygame.image.load( "images/pause_pressed.png").convert_alpha() resume_nor_image = pygame.image.load( "images/resume_nor.png").convert_alpha() resume_pressed_image = pygame.image.load( "images/resume_pressed.png").convert_alpha() paused_rect = pause_nor_image.get_rect() paused_rect.left, paused_rect.top = width - paused_rect.width - 10, 10 paused_image = pause_nor_image #设置难度级别 level = 1 #全屏炸弹 bomb_image = pygame.image.load("images/bomb.png").convert_alpha() bomb_rect = bomb_image.get_rect() bomb_font = pygame.font.Font("font/font.ttf", 48) bomb_num = 3 #每30s发放一个补给包 bullet_supply = supply.Bullet_Supply(bg_size) bomb_supply = supply.Bomb_Supply(bg_size) SUPPLY_TIME = USEREVENT pygame.time.set_timer(SUPPLY_TIME, 30 * 1000) #超级子弹定时器 DOUBLE_BULLET_TIME = USEREVENT + 1 # 游戏结束画面 gameover_font = pygame.font.Font("font/font.ttf", 48) again_image = pygame.image.load("images/again.png").convert_alpha() again_rect = again_image.get_rect() gameover_image = pygame.image.load("images/gameover.png").convert_alpha() gameover_rect = gameover_image.get_rect() #解除我方状态定时器 INVINCIBLE_TIME = USEREVENT + 2 #标志是否使用超级子弹 is_double_bullet = False #用于限制重复打开记录文件 recorded = False #生命数量 life_image = pygame.image.load("images/life.png").convert_alpha() life_rect = life_image.get_rect() life_num = 3 #生成普通子弹 bullet1 = [] bullet1_index = 0 BULLET1_NUM = 5 for i in range(BULLET1_NUM): bullet1.append(bullet.Bullet1(me.rect.midtop)) #生成超级子弹 bullet2 = [] bullet2_index = 0 BULLET2_NUM = 10 for i in range(BULLET2_NUM // 2): bullet2.append(bullet.Bullet2((me.rect.centerx - 33, me.rect.centery))) bullet2.append(bullet.Bullet2((me.rect.centerx + 30, me.rect.centery))) clock = pygame.time.Clock() #用于切换图片 switch_image = True #用于延时 delay = 100 running = True while running: for event in pygame.event.get(): #检测发生的事件 if event.type == QUIT: pygame.quit() sys.exit() elif event.type == MOUSEBUTTONDOWN: if event.button == 1 and paused_rect.collidepoint(event.pos): paused = not paused if paused: pygame.time.set_timer(SUPPLY_TIME, 0) pygame.mixer.music.pause() pygame.mixer.pause() else: pygame.time.set_timer(SUPPLY_TIME, 30 * 1000) pygame.mixer.music.unpause() pygame.mixer.unpause() elif event.type == MOUSEMOTION: if paused_rect.collidepoint(event.pos): if paused: paused_image = resume_pressed_image else: paused_image = pause_pressed_image else: if paused: paused_image = resume_nor_image else: paused_image = pause_nor_image elif event.type == KEYDOWN: if event.key == K_SPACE: if bomb_num: bomb_num -= 1 bomb_sound.play() for each in enemies: if each.rect.bottom > 0: each.active = False elif event.type == SUPPLY_TIME: supply_sound.play() if choice([True, False]): bomb_supply.reset() else: bullet_supply.reset() elif event.type == DOUBLE_BULLET_TIME: is_double_bullet = False pygame.time.set_timer(DOUBLE_BULLET_TIME, 0) elif event.type == INVINCIBLE_TIME: me.invincible = False pygame.time.set_timer(INVINCIBLE_TIME, 0) #根据用户的得分增加难度 if level == 1 and score > 500: level = 2 upgrade_sound.play() #增加3架小型低机,2架中型低级和1架大型敌机 add_small_enemies(small_enemies, enemies, 3) add_mid_enemies(mid_enemies, enemies, 2) add_big_enemies(big_enemies, enemies, 1) #提升小型敌机的速度 inc_speed(small_enemies, 1) elif level == 2 and score > 1000: level = 3 upgrade_sound.play() #增加5架小型低机,3架中型低级和1架大型敌机 add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 3) add_big_enemies(big_enemies, enemies, 1) #提升小型敌机的速度 inc_speed(small_enemies, 2) inc_speed(mid_enemies, 1) elif level == 3 and score > 2000: level = 4 upgrade_sound.play() #增加6架小型低机,3架中型低级和2架大型敌机 add_small_enemies(small_enemies, enemies, 6) add_mid_enemies(mid_enemies, enemies, 3) add_big_enemies(big_enemies, enemies, 2) #提升小型敌机的速度 inc_speed(small_enemies, 1) inc_speed(mid_enemies, 1) inc_speed(big_enemies, 1) elif level == 4 and score > 5000: level = 5 upgrade_sound.play() #增加8架小型低机,4架中型低级和3架大型敌机 add_small_enemies(small_enemies, enemies, 8) add_mid_enemies(mid_enemies, enemies, 4) add_big_enemies(big_enemies, enemies, 3) #提升小型敌机的速度 inc_speed(small_enemies, 2) inc_speed(mid_enemies, 1) inc_speed(big_enemies, 1) elif level == 5 and score > 10000: upgrade_sound.play() #增加10架小型低机,6架中型低级和4架大型敌机 add_small_enemies(small_enemies, enemies, 10) add_mid_enemies(mid_enemies, enemies, 6) add_big_enemies(big_enemies, enemies, 4) #提升小型敌机的速度 inc_speed(small_enemies, 2) inc_speed(small_enemies, 2) inc_speed(big_enemies, 1) screen.blit( background, (0, 0) ) #将(blit,位块传输)图片Surface画到窗口Surface上Surface对象的blit方法,可以将一个Surface对象画到令一个Surface对象上 if life_num and not paused: #检测用户的键盘操作 key_pressed = pygame.key.get_pressed() if key_pressed[K_w] or key_pressed[K_UP]: me.moveUp() if key_pressed[K_s] or key_pressed[K_DOWN]: me.moveDown() if key_pressed[K_a] or key_pressed[K_LEFT]: me.moveLeft() if key_pressed[K_d] or key_pressed[K_RIGHT]: me.moveRight() #绘制全屏炸弹补给并检测是否获得 if bomb_supply.active: bomb_supply.move() screen.blit(bomb_supply.image, bomb_supply.rect) if pygame.sprite.collide_mask(bomb_supply, me): get_bomb_sound.play() if bomb_num < 3: bomb_num += 1 bomb_supply.active = False #绘制超级子弹补给并检测是否获得 if bullet_supply.active: bullet_supply.move() screen.blit(bullet_supply.image, bullet_supply.rect) if pygame.sprite.collide_mask(bullet_supply, me): get_bullet_sound.play() is_double_bullet = True pygame.time.set_timer(DOUBLE_BULLET_TIME, 25 * 1000) bullet_supply.active = False #发射子弹 if not (delay % 10): bullet_sound.play() if is_double_bullet: bullets = bullet2 a = me.rect.centerx - 33 bullets[bullet2_index].reset( ((me.rect.centerx - 33), me.rect.centery)) bullets[bullet2_index + 1].reset( ((me.rect.centerx + 30), me.rect.centery)) bullet2_index = (bullet2_index + 2) % BULLET2_NUM else: bullets = bullet1 bullets[bullet1_index].reset(me.rect.midtop) bullet1_index = (bullet1_index + 1) % BULLET1_NUM #检测子弹是否击中敌机 for b in bullets: if b.active: b.move() screen.blit(b.image, b.rect) enemy_hit = pygame.sprite.spritecollide( b, enemies, False, pygame.sprite.collide_mask) if enemy_hit: b.active = False for e in enemy_hit: if e in mid_enemies or e in big_enemies: e.hit = True e.energy -= 1 if e.energy == 0: e.active = False else: e.active = False #绘制大型敌机 for each in big_enemies: if each.active: each.move() if each.hit: #绘制被达到的特效 screen.blit(each.image_hit, each.rect) each.hit = False else: if switch_image: screen.blit(each.image1, each.rect) else: screen.blit(each.image2, each.rect) #绘制血槽 pygame.draw.line(screen,BLACK,\ (each.rect.left,each.rect.top - 5),\ (each.rect.right,each.rect.top - 5),\ 2) #当生命大于20%显示绿色,否则显示红色 energy_remain = each.energy / enemy.BigEnemy.energy if energy_remain > 0.2: energy_color = GREEN else: energy_color = RED pygame.draw.line(screen,energy_color,\ (each.rect.left,each.rect.top - 5),\ (each.rect.left + each.rect.width * energy_remain,\ each.rect.top - 5),\ 2) #即将出现在画面中,播放音效 if each.rect.bottom > -50: enemy3_fly_sound.play() else: #毁灭 if not (delay % 3): if e3_destroy_index == 0: enemy3_down_sound.play() screen.blit(each.destroy_images[e3_destroy_index], each.rect) e3_destroy_index = (e3_destroy_index + 1) % 6 if e3_destroy_index == 0: enemy3_down_sound.stop() score += 25 each.reset() #绘制中型飞机 for each in mid_enemies: if each.active: each.move() if each.hit: #绘制被达到的特效 screen.blit(each.image_hit, each.rect) each.hit = False else: screen.blit(each.image, each.rect) #绘制血槽 pygame.draw.line(screen,BLACK,\ (each.rect.left,each.rect.top - 5),\ (each.rect.right,each.rect.top - 5),\ 2) #当生命大于20%显示绿色,否则显示红色 energy_remain = each.energy / enemy.MidEnemy.energy if energy_remain > 0.2: energy_color = GREEN else: energy_color = RED pygame.draw.line(screen,energy_color,\ (each.rect.left,each.rect.top - 5),\ (each.rect.left + each.rect.width * energy_remain,\ each.rect.top - 5),\ 2) else: #毁灭 if not (delay % 3): if e2_destroy_index == 0: enemy2_down_sound.play() screen.blit(each.destroy_images[e2_destroy_index], each.rect) e2_destroy_index = (e2_destroy_index + 1) % 4 if e2_destroy_index == 0: enemy2_down_sound.stop() score += 10 each.reset() #绘制小型飞机 for each in small_enemies: if each.active: each.move() screen.blit(each.image, each.rect) else: #毁灭 if not (delay % 3): if e1_destroy_index == 0: enemy1_down_sound.play() screen.blit(each.destroy_images[e1_destroy_index], each.rect) e1_destroy_index = (e1_destroy_index + 1) % 4 if e1_destroy_index == 0: enemy1_down_sound.stop() score += 1 each.reset() #检测我方飞机是否被撞 enemies_down = pygame.sprite.spritecollide( me, enemies, False, pygame.sprite.collide_mask) if enemies_down: me.active = False for e in enemies_down: e.active = False #绘制我方飞机 if me.active: if switch_image: screen.blit(me.image1, me.rect) else: screen.blit(me.image2, me.rect) else: #毁灭 if not (delay % 3): if me_destroy_index == 0: me_down_sound.play() screen.blit(each.destroy_images[me_destroy_index], each.rect) me_destroy_index = (me_destroy_index + 1) % 4 if me_destroy_index == 0: me_down_sound.stop() life_num -= 1 me.reset() pygame.time.set_timer(INVINCIBLE_TIME, 3 * 1000) #绘制剩余全屏炸弹数量 bomb_text = bomb_font.render("x %d" % bomb_num, True, WHITE) text_rect = bomb_text.get_rect() screen.blit(bomb_image, (10, height - 10 - bomb_rect.height)) screen.blit(bomb_text, (20 + bomb_rect.width, height - 5 - text_rect.height)) #绘制剩余生命数量 if life_num: for i in range(life_num): screen.blit(life_image,\ (width - 10-(i+1)*life_rect.width,\ height - 10 - life_rect.height)) #绘制得分 score_text = score_font.render("Score: %s" % str(score), True, WHITE) screen.blit(score_text, (10, 5)) #绘制游戏结束画面 elif life_num == 0: #背景音乐停止 pygame.mixer.music.stop() #停止全部音效 pygame.mixer.stop() #停止发放补给 pygame.time.set_timer(SUPPLY_TIME, 0) if not recorded: recorded = True # 读取历史最高分 with open("record.txt", "r") as f: record_score = int(f.read()) if score > record_score: with open("record.txt", "w") as f: f.write(str(score)) # 绘制结束画面 record_score_text = score_font.render("Best: %d" % record_score, True, WHITE) screen.blit(record_score_text, (50, 50)) gameover_text1 = gameover_font.render("Your Score: ", True, WHITE) gameover_text1_rect = gameover_text1.get_rect() gameover_text1_rect.left, gameover_text1_rect.top = \ (width - gameover_text1_rect.width) // 2, height // 2 screen.blit(gameover_text1, gameover_text1_rect) gameover_text2 = gameover_font.render(str(score), True, WHITE) gameover_text2_rect = gameover_text2.get_rect() gameover_text2_rect.left, gameover_text2_rect.top = \ (width - gameover_text2_rect.width) // 2, \ gameover_text1_rect.bottom + 10 screen.blit(gameover_text2, gameover_text2_rect) again_rect.left, again_rect.top = \ (width - again_rect.width) // 2,\ gameover_text2_rect.bottom + 50 screen.blit(again_image, again_rect) gameover_rect.left, gameover_rect.top = \ (width - again_rect.width) // 2, \ again_rect.bottom + 10 screen.blit(gameover_image, gameover_rect) # 检测用户的鼠标操作 # 如果用户按下鼠标左键 if pygame.mouse.get_pressed()[0]: pos = pygame.mouse.get_pos() if again_rect.left < pos[0] < again_rect.right and \ again_rect.top < pos[1] < again_rect.bottom: main() elif gameover_rect.left < pos[0] < gameover_rect.right and \ gameover_rect.top < pos[1] < gameover_rect.bottom: pygame.quit() sys.exit() #绘制暂停按钮 screen.blit(paused_image, paused_rect) #切换图片(每五帧切换一次图片,从而产生特效) if not (delay % 5): switch_image = not switch_image delay -= 1 #类似于单片机中所用到的延时函数 if not delay: #当delay为0是,重置delay为100 delay = 100 pygame.display.flip() #更新整个屏幕 clock.tick(60) #设置游戏的帧率为60帧
def main(): pygame.mixer.music.play(-1) #Add my plane me = myplane.MyPlane(bg_size) enemies = pygame.sprite.Group() #Create enemies small_enemies = pygame.sprite.Group() add_small_enemies(small_enemies, enemies, 15) mid_enemies = pygame.sprite.Group() add_mid_enemies(mid_enemies, enemies, 4) big_enemies = pygame.sprite.Group() add_big_enemies(big_enemies, enemies, 2) #Create bullet bullet1 = [] bullet1_index = 0 BULLET1_NUM = 4 for i in range(BULLET1_NUM): bullet1.append(bullet.Bullet1(me.rect.midtop)) #Create super bullet bullet2 = [] bullet2_index = 0 BULLET2_NUM = 8 for i in range(BULLET2_NUM // 2): bullet2.append(bullet.Bullet2((me.rect.centerx - 33, me.rect.centery))) bullet2.append(bullet.Bullet2((me.rect.centerx + 30, me.rect.centery))) clock = pygame.time.Clock() #Get shoot by enemy e1_destroy_index = 0 e2_destroy_index = 0 e3_destroy_index = 0 me_destroy_index = 0 #My score score = 0 score_font = pygame.font.Font("font/font.ttf", 36) #Pause game paused = False pause_nor_image = pygame.image.load("images/pause_nor.png").convert_alpha() pause_pressed_image = pygame.image.load( "images/pause_pressed.png").convert_alpha() resume_nor_image = pygame.image.load( "images/resume_nor.png").convert_alpha() resume_pressed_image = pygame.image.load( "images/resume_pressed.png").convert_alpha() paused_rect = pause_nor_image.get_rect() paused_rect.left, paused_rect.top = width - paused_rect.width - 10, 10 paused_image = pause_nor_image #Level of difficulty level = 1 #Super powerful bomb bomb_image = pygame.image.load("images/bomb.png").convert_alpha() bomb_rect = bomb_image.get_rect() bomb_font = pygame.font.Font("font/font.ttf", 48) bomb_num = 3 #Supply bullet_supply = supply.Bullet_Supply(bg_size) bomb_supply = supply.Bomb_Supply(bg_size) SUPPLY_TIME = USEREVENT pygame.time.set_timer(SUPPLY_TIME, 30 * 1000) #Clock for super bullet DOUBLE_BULLET_TIME = USEREVENT + 1 #Status of super bullet is_double_bullet = False #Clock for invincible condition of my plane INVINCIBLE_TIME = USEREVENT + 2 #Number of lives life_image = pygame.image.load("images/life.png").convert_alpha() life_rect = life_image.get_rect() life_num = 3 #Prevent open record file again and again recorded = False #End of game gameover_font = pygame.font.Font("font/font.TTF", 48) again_image = pygame.image.load("images/again.png").convert_alpha() again_rect = again_image.get_rect() gameover_image = pygame.image.load("images/gameover.png").convert_alpha() gameover_rect = gameover_image.get_rect() #Switch image switch_image = True #Time delay delay = 100
def main(): pygame.mixer.music.play(-1) # 生成我方飞机 me = myplane.MyPlane(bg_size) # 生成敌机 enemies = pygame.sprite.Group() small_enemies = pygame.sprite.Group() add_small_enemies(small_enemies, enemies, 15) mid_enemies = pygame.sprite.Group() add_mid_enemies(mid_enemies, enemies, 4) big_enemies = pygame.sprite.Group() add_big_enemies(big_enemies, enemies, 2) # 生成普通子弹 bullet1 = [] bullet1_index = 0 BULLET1_NUM = 4 for i in range(BULLET1_NUM): bullet1.append(bullet.Bullet1(me.rect.midtop)) # 生成超级子弹 bullet2 = [] bullet2_index = 0 BULLET2_NUM = 8 for i in range(BULLET2_NUM // 2): bullet2.append(bullet.Bullet2((me.rect.centerx - 33, me.rect.centery))) bullet2.append(bullet.Bullet2((me.rect.centerx + 30, me.rect.centery))) clock = pygame.time.Clock() # 中弹图片索引 e1_destroy_index = 0 e2_destroy_index = 0 e3_destroy_index = 0 me_destroy_index = 0 # 统计得分 score = 0 score_font = pygame.font.Font('font/font.ttf', 36) # 标志是否暂停游戏 paused = False pause_nor_image = pygame.image.load('images/pause_nor.png').convert_alpha() pause_pressed_image = pygame.image.load('images/pause_pressed.png').convert_alpha() resume_nor_image = pygame.image.load('images/resume_nor.png').convert_alpha() resume_pressed_image = pygame.image.load('images/resume_pressed.png').convert_alpha() paused_rect = pause_nor_image.get_rect() paused_rect.left, paused_rect.top = width - paused_rect.width - 10, 10 paused_image = pause_nor_image # 设置难度级别 level = 1 # 全屏炸弹 bomb_image = pygame.image.load('images/bomb.png').convert_alpha() bomb_rect = bomb_image.get_rect() bomb_font = pygame.font.Font('font/font.ttf', 48) bomb_num = 3 # 每三十秒发放一个补给包 bullet_supply = supply.Bullet_Supply(bg_size) bomb_supply = supply.Bomb_Supply(bg_size) SUPPLY_TIME = USEREVENT pygame.time.set_timer(SUPPLY_TIME, 30 * 1000) # 超级子弹定时器 DOUBLE_BULLET_TIME = USEREVENT + 1 # 解除我方无敌状态定时器 INVINCIBLE_TIME = USEREVENT + 2 # 标志是否使用超级子弹 is_double_bullet = False # 生命数量 life_image = pygame.image.load('images/life.png').convert_alpha() life_rect = life_image.get_rect() life_num = 3 # 用于阻止重复打开记录文件 recorded = False # 游戏结束画面 gameover_font = pygame.font.Font('font/font.ttf', 48) again_image = pygame.image.load('images/again.png').convert_alpha() again_rect = again_image.get_rect() gameover_image = pygame.image.load('images/gameover.png').convert_alpha() gameover_rect = gameover_image.get_rect() # 用于切换图片 switch_image = True # 用于延迟 delay = 100 running = True while running: for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() elif event.type == MOUSEBUTTONDOWN: if event.button == 1 and paused_rect.collidepoint(event.pos): paused = not paused if paused: pygame.time.set_timer(SUPPLY_TIME, 0) pygame.mixer.music.pause() pygame.mixer.pause() else: pygame.time.set_timer(SUPPLY_TIME, 30 * 1000) pygame.mixer.music.unpause() pygame.mixer.unpause() elif event.type == MOUSEMOTION: if paused_rect.collidepoint(event.pos): if paused: paused_image = resume_pressed_image else: paused_image = pause_pressed_image else: if paused: paused_image = resume_nor_image else: paused_image = pause_nor_image elif event.type == KEYDOWN: if event.key == K_SPACE: if bomb_num: bomb_num -= 1 bomb_sound.play() for each in enemies: if each.rect.bottom > 0: each.active = False elif event.type == SUPPLY_TIME: supply_sound.play() if choice([True, False]): bomb_supply.reset() else: bullet_supply.reset() elif event.type == DOUBLE_BULLET_TIME: is_double_bullet = False pygame.time.set_timer(DOUBLE_BULLET_TIME, 0) elif event.type == INVINCIBLE_TIME: me.invincible = False pygame.time.set_timer(INVINCIBLE_TIME, 0) # 根据用户的得分增加难度 if level == 1 and score > 50000: level = 2 upgrade_sound.play() # 增加三架小型敌机,两架中型敌机和一架大型敌机 add_small_enemies(small_enemies, enemies, 3) add_mid_enemies(mid_enemies, enemies, 2) add_big_enemies(big_enemies, enemies, 1) # 提升小型敌机的速度 inc_speed(small_enemies, 1) elif level == 2 and score > 300000: level = 3 upgrade_sound.play() # 增加5架小型敌机,3架中型敌机和2架大型敌机 add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 3) add_big_enemies(big_enemies, enemies, 2) # 提升小型敌机的速度 inc_speed(small_enemies, 1) # 提升中型敌机的速度 inc_speed(mid_enemies, 1) elif level == 3 and score > 600000: level = 4 upgrade_sound.play() # 增加5架小型敌机,3架中型敌机和2架大型敌机 add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 3) add_big_enemies(big_enemies, enemies, 2) # 提升小型敌机的速度 inc_speed(small_enemies, 1) # 提升中型敌机的速度 inc_speed(mid_enemies, 1) elif level == 4 and score > 1000000: level = 5 upgrade_sound.play() # 增加5架小型敌机,3架中型敌机和2架大型敌机 add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 3) add_big_enemies(big_enemies, enemies, 2) # 提升小型敌机的速度 inc_speed(small_enemies, 1) # 提升中型敌机的速度 inc_speed(mid_enemies, 1) screen.blit(background, (0, 0)) if life_num and not paused: # 检测用户的键盘操作 key_pressed = pygame.key.get_pressed() if key_pressed[K_w] or key_pressed[K_UP]: me.moveUp() if key_pressed[K_s] or key_pressed[K_DOWN]: me.moveDown() if key_pressed[K_a] or key_pressed[K_LEFT]: me.moveLeft() if key_pressed[K_d] or key_pressed[K_RIGHT]: me.moveRight() # 绘制全屏炸弹补给并检测是否获得 if bomb_supply.active: bomb_supply.move() screen.blit(bomb_supply.image, bomb_supply.rect) if pygame.sprite.collide_mask(bomb_supply, me): get_bomb_sound.play() if bomb_num < 3: bomb_num += 1 bomb_supply.active = False # 绘制超级子弹补给并检测是否获得 if bullet_supply.active: bullet_supply.move() screen.blit(bullet_supply.image, bullet_supply.rect) if pygame.sprite.collide_mask(bullet_supply, me): get_bullet_sound.play() is_double_bullet = True pygame.time.set_timer(DOUBLE_BULLET_TIME, 18 * 1000) bullet_supply.active = False # 发射子弹 if not (delay % 10): bullet_sound.play() if is_double_bullet: bullets = bullet2 bullets[bullet2_index].reset((me.rect.centerx - 33, me.rect.centery)) bullets[bullet2_index + 1].reset((me.rect.centerx + 30, me.rect.centery)) bullet2_index = (bullet2_index + 2) % BULLET2_NUM else: bullets = bullet1 bullets[bullet1_index].reset(me.rect.midtop) bullet1_index = (bullet1_index + 1) % BULLET1_NUM # 检测子弹是否击中敌机 for b in bullets: if b.active: b.move() screen.blit(b.image, b.rect) enemy_hit = pygame.sprite.spritecollide(b, enemies, False, pygame.sprite.collide_mask) if enemy_hit: b.active = False for e in enemy_hit: if e in mid_enemies or e in big_enemies: e.hit = True e.energy -= 1 if e.energy == 0: e.active = False else: e.active = False # 绘制大型敌机 for each in big_enemies: if each.active: each.move() if each.hit: # 绘制被打到的特效 screen.blit(each.image_hit, each.rect) each.hit = False else: if switch_image: screen.blit(each.image1, each.rect) else: screen.blit(each.image2, each.rect) # 绘制血槽 pygame.draw.line(screen, BLACK, \ (each.rect.left, each.rect.top - 5), \ (each.rect.right, each.rect.top - 5), \ 2) # 当生命大于20%绿色,否则红色 energy_remain = each.energy / enemy.BigEnemy.energy if energy_remain > 0.2: energy_color = GREEN else: energy_color = RED pygame.draw.line(screen, energy_color, \ (each.rect.left, each.rect.top - 5), \ (each.rect.left + each.rect.width * energy_remain, each.rect.top - 5), \ 2) # 即将出现在画面中播放音效 if each.rect.bottom == -50: enemy3_fly_sound.play(-1) else: # 毁灭 if not (delay % 3): if e3_destroy_index == 0: enemy3_down_sound.play() screen.blit(each.destroy_images[e3_destroy_index], each.rect) e3_destroy_index = (e3_destroy_index + 1) % 6 if e3_destroy_index == 0: enemy3_fly_sound.stop() score += 10000 each.reset() # 绘制中型敌机 for each in mid_enemies: if each.active: each.move() if each.hit: # 绘制被打到的特效 screen.blit(each.image_hit, each.rect) each.hit = False else: screen.blit(each.image, each.rect) # 绘制血槽 pygame.draw.line(screen, BLACK, \ (each.rect.left, each.rect.top - 5), \ (each.rect.right, each.rect.top - 5), \ 2) # 当生命大于20%绿色,否则红色 energy_remain = each.energy / enemy.MidEnemy.energy if energy_remain > 0.2: energy_color = GREEN else: energy_color = RED pygame.draw.line(screen, energy_color, \ (each.rect.left, each.rect.top - 5), \ (each.rect.left + each.rect.width * energy_remain, each.rect.top - 5), \ 2) else: # 毁灭 if not (delay % 3): if e2_destroy_index == 0: enemy2_down_sound.play() screen.blit(each.destroy_images[e2_destroy_index], each.rect) e2_destroy_index = (e2_destroy_index + 1) % 4 if e2_destroy_index == 0: score += 6000 each.reset() # 绘制小型敌机 for each in small_enemies: if each.active: each.move() screen.blit(each.image, each.rect) else: # 毁灭 if not (delay % 3): if e1_destroy_index == 0: enemy1_down_sound.play() screen.blit(each.destroy_images[e1_destroy_index], each.rect) e1_destroy_index = (e1_destroy_index + 1) % 4 if e1_destroy_index == 0: score += 1000 each.reset() # 检测我方飞机是否被撞 enemies_down = pygame.sprite.spritecollide(me, enemies, False, pygame.sprite.collide_mask) if enemies_down and not me.invincible: me.active = False for e in enemies_down: e.active = False # 绘制我方飞机 if me.active: if switch_image: screen.blit(me.image1, me.rect) else: screen.blit(me.image2, me.rect) else: # 毁灭 if not (delay % 3): if me_destroy_index == 0: me_down_sound.play() screen.blit(me.destroy_images[me_destroy_index], each.rect) me_destroy_index = (me_destroy_index + 1) % 4 if me_destroy_index == 0: life_num -= 1 me.reset() pygame.time.set_timer(INVINCIBLE_TIME, 3 * 1000) # 绘制全屏炸弹数量 bomb_text = bomb_font.render('× %d' % bomb_num, True, WHITE) text_rect = bomb_text.get_rect() screen.blit(bomb_image, (10, height - 10 - bomb_rect.height)) screen.blit(bomb_text, (20 + bomb_rect.width, height - 5 - text_rect.height)) # 绘制剩余生命数量 if life_num: for i in range(life_num): screen.blit(life_image, \ (width - 10 - (i + 1) * life_rect.width, \ height - 10 - life_rect.height)) # 绘制得分 score_text = score_font.render('Score : %s' % str(score), True, WHITE) screen.blit(score_text, (10, 5)) elif life_num == 0: # print('Game Over!') # 背景音乐停止 pygame.mixer.music.stop() # 停止全部音效 pygame.mixer.stop() # 停止发放补给 pygame.time.set_timer(SUPPLY_TIME, 0) if not recorded: recorded = True # 读取历史记录-最高得分 with open('record.txt', 'r') as f: record_score = int(f.read()) # 如果玩家破纪录,则存档 if score > record_score: with open('record.txt', 'w') as f: f.write(str(score)) # 绘制游戏结束画面 record_score_text = score_font.render('Best : %d' % record_score, True, WHITE) screen.blit(record_score_text, (50, 50)) gameover_text1 = gameover_font.render('Your Score', True, WHITE) gameover_text1_rect = gameover_text1.get_rect() gameover_text1_rect.left, gameover_text1_rect.top = \ (width - gameover_text1_rect.width) // 2, height // 2 screen.blit(gameover_text1, gameover_text1_rect) gameover_text2 = gameover_font.render(str(score), True, WHITE) gameover_text2_rect = gameover_text2.get_rect() gameover_text2_rect.left, gameover_text2_rect.top = \ (width - gameover_text2_rect.width) // 2, \ gameover_text1_rect.bottom + 10 screen.blit(gameover_text2, gameover_text2_rect) again_rect.left, again_rect.top = \ (width - again_rect.width) // 2, \ gameover_text2_rect.bottom + 50 screen.blit(again_image, again_rect) gameover_rect.left, gameover_rect.top = \ (width - again_rect.width) // 2, \ again_rect.bottom + 10 screen.blit(gameover_image, gameover_rect) # 检测用户的鼠标操作 # 如果用户按下鼠标左键 if pygame.mouse.get_pressed()[0]: # 获取鼠标坐标 pos = pygame.mouse.get_pos() # 如果用户点击“重新开始” if again_rect.left < pos[0] < again_rect.right and \ again_rect.top < pos[1] < again_rect.bottom: # 退出游戏 pygame.quit() sys.quit() # 绘制暂停按钮 screen.blit(paused_image, paused_rect) # 切换图片 if not (delay % 5): switch_image = not switch_image delay -= 1 if not delay: delay = 100 pygame.display.flip() clock.tick(60)
def main(): pygame.mixer.music.play(-1) running = True # 用于切换图片 switch_image = True # 用于延时 delay = 0 # 中弹图片索引 e1_destroy_index = 0 e2_destroy_index = 0 e3_destroy_index = 0 me_destroy_index = 0 # 统计分数 score = 0 score_font = pygame.font.SysFont("arial", 36) # 用户级别 level = 1 # 标志是否暂停游戏 paused = False paused_nor_image = pygame.image.load( "material/image/game_pause_nor.png").convert_alpha() paused_pressed_image = pygame.image.load( "material/image/game_pause_pressed.png").convert_alpha() resume_nor_image = pygame.image.load( "material/image/game_resume_nor.png").convert_alpha() resume_pressed_image = pygame.image.load( "material/image/game_resume_pressed.png").convert_alpha() paused_rect = paused_nor_image.get_rect() paused_rect.left, paused_rect.top = width - paused_rect.width - 10, 0 paused_image = paused_nor_image # 生成我方飞机 me = myplane.MyPlane(bg_size) # 全屏炸弹 bomb_image = pygame.image.load("material/image/bomb.png").convert_alpha() bomb_rect = bomb_image.get_rect() bomb_font = pygame.font.SysFont("arial", 36) bomb_num = 3 # 每30稍发放一个补给包 bullet_supply = supply.Bullet_Supply(bg_size) bomb_supply = supply.Bomb_Supply(bg_size) SUPPLY_TIME = USEREVENT pygame.time.set_timer(SUPPLY_TIME, 30000) # 超级子弹定时器 DUOUBLE_BULLET_TIME = USEREVENT + 1 # 标志是否使用超级子弹 is_double_bullet = False # 解除我方无敌状态定时器 INVINCIBL = USEREVENT + 2 # 生成敌方飞机 enemies = pygame.sprite.Group() small_enemies = pygame.sprite.Group() add_small_enemies(small_enemies, enemies, 15) mid_enemies = pygame.sprite.Group() add_mid_enemies(mid_enemies, enemies, 10) big_enemies = pygame.sprite.Group() add_big_enemies(big_enemies, enemies, 5) # 生成普通子弹 bullet1 = [] bullet1_index = 0 bullet1_num = 4 for i in range(bullet1_num): bullet1.append(bullet.Bullet1(me.rect.midtop)) recorded = False # 生命数量 life_image = pygame.image.load("material/image/life.png").convert_alpha() life_rect = life_image.get_rect() life_num = 3 # 生成超级子弹 bullet2 = [] bullet2_index = 0 bullet2_num = 8 for i in range(bullet2_num // 2): bullet2.append(bullet.Bullet2((me.rect.centerx - 33, me.rect.centery))) bullet2.append(bullet.Bullet2((me.rect.centerx + 30, me.rect.centery))) bullets = bullet1 while running: for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() elif event.type == MOUSEBUTTONDOWN: if event.button == 1 and paused_rect.collidepoint(event.pos): paused = not paused if paused: pygame.time.set_timer(SUPPLY_TIME, 0) pygame.mixer.music.pause() pygame.mixer.pause() else: pygame.time.set_timer(SUPPLY_TIME, 30000) pygame.mixer.music.unpause() pygame.mixer.unpause() elif event.type == MOUSEMOTION: if paused_rect.collidepoint(event.pos): if paused: paused_image = resume_pressed_image else: paused_image = paused_pressed_image else: if paused: paused_image = resume_nor_image else: paused_image = paused_nor_image elif event.type == KEYDOWN: if event.key == K_SPACE: bomb_sound.play() if bomb_num > 0: bomb_num -= 1 for each in enemies: if each.rect.bottom > 0 and each.rect.top < height: each.active = False elif event.type == SUPPLY_TIME: supply_sound.play() if choice([True, False]): bomb_supply.reset() else: bullet_supply.reset() pygame.time.set_timer(DUOUBLE_BULLET_TIME, 18000) elif event.type == DUOUBLE_BULLET_TIME: print("DUOUBLE_BULLET_TIME") is_double_bullet = False pygame.time.set_timer(DUOUBLE_BULLET_TIME, 0) elif event.type == INVINCIBL: me.invincible = False if paused: screen.blit(background, (0, 0)) screen.blit(paused_image, paused_rect) else: if life_num == 0: # 暂停音效跟发放补给定时器 pygame.time.set_timer(SUPPLY_TIME, 0) pygame.mixer.music.pause() pygame.mixer.pause() # 最高分存档 if not recorded: recorded = True with open("record.txt", "r") as f: record_score = int(f.read()) if score > record_score: with open("record.txt", "w") as f: f.write(str(score)) # 绘制结束画面 screen.blit(background, (0, 0)) game_over_text1 = score_font.render("Your Score:", True, WHITE) game_over_rect1 = game_over_text1.get_rect() game_over_rect1.left, game_over_rect1.top = \ (width - game_over_rect1.width) // 2 - 30, (height-game_over_rect1.height)//2 - 10 screen.blit(game_over_text1, game_over_rect1) game_over_text2 = score_font.render(str(score), True, WHITE) game_over_rect2 = game_over_text2.get_rect() game_over_rect2.left, game_over_rect2.top = \ game_over_rect1.left + game_over_rect1.width, (height-game_over_rect2.height)//2 - 10 screen.blit(game_over_text2, game_over_rect2) record_score_text = score_font.render( "Best: %d" % record_score, True, WHITE) record_score_rect = record_score_text.get_rect() record_score_rect.left, record_score_rect.top = \ (width - record_score_rect.width) // 2, (height-record_score_rect.height)//2 + record_score_rect.height screen.blit(record_score_text, record_score_rect) again_image = pygame.image.load( "material/image/btn_finish.png").convert_alpha() again_rect = again_image.get_rect() again_rect.left, again_rect.top = \ (width - again_rect.width) // 2, height-again_rect.height-30 screen.blit(again_image, again_rect) pygame.display.flip() # 检测用户的那鼠标操作 if pygame.mouse.get_pressed()[0]: # 获取鼠标坐标 pos = pygame.mouse.get_pos() if again_rect.left < pos[0] < again_rect.right and \ again_rect.top < pos[1] < again_rect.bottom: main() break else: continue # 根据用户的得分增加难度 if level == 1 and score > 50000: level = 2 upgrade_sound.play() # 增加敌机 print("add_small_enemies1") add_small_enemies(small_enemies, enemies, 3) add_mid_enemies(mid_enemies, enemies, 2) add_big_enemies(big_enemies, enemies, 1) inc_speed(small_enemies, 1) elif level == 2 and score > 300000: level = 3 upgrade_sound.play() # 增加敌机 print("add_small_enemies2") add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 3) add_big_enemies(big_enemies, enemies, 2) inc_speed(small_enemies, 1) inc_speed(mid_enemies, 1) elif level == 3 and score > 600000: level = 4 upgrade_sound.play() # 增加敌机 print("add_small_enemies3") add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 3) add_big_enemies(big_enemies, enemies, 2) inc_speed(small_enemies, 1) inc_speed(mid_enemies, 1) elif level == 4 and score > 1000000: level = 5 upgrade_sound.play() # 增加敌机 print("add_small_enemies4") add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 3) add_big_enemies(big_enemies, enemies, 2) inc_speed(small_enemies, 1) inc_speed(mid_enemies, 1) # 检测用户的键盘操作 key_press = pygame.key.get_pressed() if key_press[K_w] or key_press[K_UP]: me.moveUp() if key_press[K_s] or key_press[K_DOWN]: me.moveDown() if key_press[K_a] or key_press[K_LEFT]: me.moveLeft() if key_press[K_d] or key_press[K_RIGHT]: me.moveRight() screen.blit(background, (0, 0)) if not (delay % 5): switch_image = not switch_image # 发射子弹 if not (delay % 10): if is_double_bullet: bullets = bullet2 bullets[bullet2_index].reset( (me.rect.centerx - 33, me.rect.centery)) bullets[bullet2_index + 1].reset( (me.rect.centerx + 30, me.rect.centery)) bullet2_index = (bullet2_index + 2) % bullet2_num else: bullets = bullet1 bullet1[bullet1_index].reset(me.rect.midtop) bullet1_index = (bullet1_index + 1) % bullet1_num # 绘制全屏炸弹补给并检测是否获得 if bomb_supply.active: bomb_supply.move() screen.blit(bomb_supply.image, bomb_supply.rect) if pygame.sprite.collide_mask(bomb_supply, me): get_bomb_sound.play() if bomb_num < 3: bomb_num += 1 bomb_supply.active = False if bullet_supply.active: bullet_supply.move() screen.blit(bullet_supply.image, bullet_supply.rect) if pygame.sprite.collide_mask(bullet_supply, me): get_bullet_sound.play() is_double_bullet = True bullet_supply.active = False # 检测子弹是否击中敌机 for b in bullets: if b.active: b.move() screen.blit(b.image, b.rect) enemy_hit = pygame.sprite.spritecollide( b, enemies, False, pygame.sprite.collide_mask) if enemy_hit: b.active = False for e in enemy_hit: if e in mid_enemies or e in big_enemies: e.hit = True e.energy -= 1 if e.energy == 0: e.active = False else: e.active = False # 绘制敌机 for each in big_enemies: if each.active: each.move() if each.hit: screen.blit(each.image_hit, each.rect) each.hit = False if switch_image: screen.blit(each.image1, each.rect) else: screen.blit(each.image2, each.rect) # 绘制血条 pygame.draw.line(screen, BLACK,\ (each.rect.left, each.rect.top - 5),\ (each.rect.right, each.rect.top - 5), 2) # 当生命大于20%显示绿色, 否则显示红色 energy_remain = each.energy / enemy.BigEnemy.energy if energy_remain > 0.2: energy_color = GREEN else: energy_color = RED pygame.draw.line(screen, energy_color,\ (each.rect.left, each.rect.top - 5),\ (each.rect.left + each.rect.width * energy_remain, \ each.rect.top - 5), 2) if each.rect.bottom > -50: enemy3_fly_sound.play() else: if not (delay % 3): if e3_destroy_index == 0: enemy3_down_sound.play() screen.blit(each.destroy_images[e3_destroy_index], each.rect) e3_destroy_index = (e3_destroy_index + 1) % 6 if e3_destroy_index == 0: enemy3_fly_sound.stop() each.reset() score += 10000 for each in mid_enemies: if each.active: each.move() if each.hit: screen.blit(each.image_hit, each.rect) each.hit = False screen.blit(each.image, each.rect) # 绘制血条 pygame.draw.line(screen, BLACK,\ (each.rect.left, each.rect.top - 5),\ (each.rect.right, each.rect.top - 5), 2) # 当生命大于20%显示绿色, 否则显示红色 energy_remain = each.energy / enemy.MidEnemy.energy if energy_remain > 0.2: energy_color = GREEN else: energy_color = RED pygame.draw.line(screen, energy_color,\ (each.rect.left, each.rect.top - 5),\ (each.rect.left + each.rect.width * energy_remain, \ each.rect.top - 5), 2) else: if not (delay % 3): if e2_destroy_index == 0: enemy2_down_sound.play() screen.blit(each.destroy_images[e2_destroy_index], each.rect) e2_destroy_index = (e2_destroy_index + 1) % 4 if e2_destroy_index == 0: each.reset() score += 6000 for each in small_enemies: if each.active: each.move() screen.blit(each.image, each.rect) else: if not (delay % 3): if e1_destroy_index == 0: enemy1_down_sound.play() screen.blit(each.destroy_images[e1_destroy_index], each.rect) e1_destroy_index = (e1_destroy_index + 1) % 4 if e1_destroy_index == 0: each.reset() score += 1000 # 检测我方飞机是否被撞 enemies_down = pygame.sprite.spritecollide( me, enemies, False, pygame.sprite.collide_mask) if enemies_down and not me.invincible: me.active = False for e in enemies_down: e.active = False # 绘制我方飞机 if me.active: if switch_image: screen.blit(me.image1, me.rect) else: screen.blit(me.image2, me.rect) else: if not (delay % 3): if me_destroy_index == 0: me_down_sound.play() screen.blit(me.destroy_images[me_destroy_index], me.rect) me_destroy_index = (me_destroy_index + 1) % 4 if me_destroy_index == 0: life_num -= 1 me.invincible = True pygame.time.set_timer(INVINCIBL, 3000) me.reset() # 绘制分数 score_text = score_font.render("Score:%s" % str(score), True, WHITE) screen.blit(score_text, (10, 10)) # 绘制全屏炸弹数量 bomb_text = bomb_font.render("x %d" % bomb_num, True, WHITE) text_rect = bomb_text.get_rect() screen.blit(bomb_image, (10, height - 10 - bomb_rect.height)) screen.blit(bomb_text, (20 + bomb_rect.width, height - 5 - text_rect.height)) # 绘制生命数量 if life_num > 0: for i in range(life_num): screen.blit(life_image, \ (width - 10 - (i+1) * life_rect.width, \ height-10-life_rect.height)) delay -= 1 if not delay: delay = 100 # 绘制按钮 screen.blit(paused_image, paused_rect) pygame.display.flip() clock.tick(60)
def main(): pygame.mixer.music.play(-1) # 这里参数-1是指无限循环播放bgm # 生成我方飞机,调用myplane模块的MyPlace实例化 me = myplane.MyPlane(bg_size) # 用于切换飞机尾气图片 switch_image = True # 用于延迟 delay = 100 # 生成敌方飞机(将所有敌机放入碰撞组) enemies = pygame.sprite.Group() # 除了所有飞机一个组,不同种类的飞机也各自有组 # 生成敌方小飞机 small_enemies = pygame.sprite.Group() add_small_enemies(small_enemies, enemies, 15) # 生成敌方中飞机 mid_enemies = pygame.sprite.Group() add_mid_enemies(mid_enemies, enemies, 4) # 生成敌方大飞机 big_enemies = pygame.sprite.Group() add_big_enemies(big_enemies, enemies, 2) # 生成普通子弹 bullet1 = [] bullet1_index = 0 BULLET1_NUM = 6 # 设置为四颗子弹(每屏幕) for i in range(BULLET1_NUM): bullet1.append(bullet.Bullet1(me.rect.midtop)) # rect的midtop即位于顶部中央 # 生成超级子弹 bullet2 = [] bullet2_index = 0 BULLET2_NUM = 12 # 设置为四颗子弹(每屏幕) for i in range(BULLET2_NUM // 2): bullet2.append(bullet.Bullet2((me.rect.centerx - 33, me.rect.centery))) bullet2.append(bullet.Bullet2((me.rect.centerx + 30, me.rect.centery))) # 用于统计得分 score = 0 score_font = pygame.font.Font('font/Herculanum.ttf', 36) # pyinstaller打包时字体要写绝对路径 # 暂停游戏标志 paused = False paused_nor_image = pygame.image.load( r'./images/pause_nor.png').convert_alpha() paused_pressed_image = pygame.image.load( r'./images/pause_pressed.png').convert_alpha() resume_nor_image = pygame.image.load( r'./images/resume_nor.png').convert_alpha() resume_pressed_image = pygame.image.load( r'./images/resume_pressed.png').convert_alpha() paused_rect = paused_nor_image.get_rect() paused_rect.left, paused_rect.top = width - paused_rect.width - 10, 10 paused_image = paused_nor_image # 设置暂停默认图片款式 # 设置难度级别 level = 1 # 设置全屏炸弹 bomb_image = pygame.image.load(r'./images/bomb.png').convert_alpha() bomb_rect = bomb_image.get_rect() bomb_font = pygame.font.Font('font/Herculanum.ttf', 48) bomb_num = 3 # 每30秒发放补给包 bullet_supply = supply.Bullet_Supply(bg_size) bomb_supply = supply.Bomb_Supply(bg_size) # 补给包定时器(自定义事件) 30s SUPPLY_TIMER = USEREVENT pygame.time.set_timer(SUPPLY_TIMER, 20 * 1000) # 超级子弹定时器 DOUBLE_BULLET_TIMER = USEREVENT + 1 # 标志是否使用 is_double_bullet = False #解除我方无敌计时器 INVINCIBLE_TIMER = USEREVENT + 2 # 生命剩余 life_image = pygame.image.load('images/life.png').convert_alpha() life_rect = life_image.get_rect() life_num = 3 # 用于阻止重复打开记录文件 recorded = False # 游戏结束画面 gameover_font = pygame.font.Font("font/Herculanum.ttf", 48) again_image = pygame.image.load("images/again.png").convert_alpha() again_rect = again_image.get_rect() gameover_image = pygame.image.load("images/gameover.png").convert_alpha() gameover_rect = gameover_image.get_rect() # 中弹图片索引(中弹图片切换特效) e1_destroy_index = 0 e2_destroy_index = 0 e3_destroy_index = 0 me_destroy_index = 0 clock = pygame.time.Clock() running = True while running: # 偶尔发生的用event事件来描述即可 for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() elif event.type == pygame.MOUSEBUTTONDOWN: if event.button == 1 and paused_rect.collidepoint(event.pos): # rect的collidepoint方法检测事件是否发生的矩形区域内 paused = not paused if paused: # 暂停时音乐和音效暂停 pygame.mixer.music.pause() pygame.mixer.pause() else: # 音乐和音效继续播放 pygame.mixer.music.unpause() pygame.mixer.unpause() elif event.type == MOUSEMOTION: if paused_rect.collidepoint(event.pos): if paused: paused_image = resume_pressed_image else: paused_image = paused_pressed_image else: if paused: paused_image = resume_nor_image else: paused_image = paused_nor_image elif event.type == KEYDOWN and not paused: if event.key == K_SPACE: if bomb_num: bomb_num -= 1 thunder_sound.play() screen.blit(thunder_image, (0, 0)) pygame.display.flip() pygame.time.delay(500) for each in enemies: if each.rect.bottom > 0: each.active = False elif event.type == SUPPLY_TIMER and not paused: supply_sound.play() if choice([True, False]): bomb_supply.reset() else: bullet_supply.reset() elif event.type == DOUBLE_BULLET_TIMER: # 触发超级子弹18秒后启动DOUBLE_BULLET_TIMER事件,定时器就关闭 is_double_bullet = False pygame.time.set_timer(DOUBLE_BULLET_TIMER, 0) elif event.type == INVINCIBLE_TIMER: me.invincible = False pygame.time.set_timer(INVINCIBLE_TIMER, 0) # 触发解除无敌事件后,取消计时器 # 根据用户得分增加难度 if level == 1 and score > 500: level = 2 upgrade_sound.play() # 增加三架小飞机,两架中飞机,一架大飞机 add_small_enemies(small_enemies, enemies, 3) add_mid_enemies(mid_enemies, enemies, 2) add_big_enemies(big_enemies, enemies, 1) # 提升小飞机速度(1点) increase_speed(small_enemies, 1) elif level == 2 and score > 2000: level = 3 upgrade_sound.play() # 增加三架小飞机,两架中飞机,一架大飞机 add_small_enemies(small_enemies, enemies, 3) add_mid_enemies(mid_enemies, enemies, 2) add_big_enemies(big_enemies, enemies, 1) increase_speed(small_enemies, 1) increase_speed(mid_enemies, 1) elif level == 3 and score > 8000: level = 4 upgrade_sound.play() # 增加三架小飞机,两架中飞机,一架大飞机 add_small_enemies(small_enemies, enemies, 3) add_mid_enemies(mid_enemies, enemies, 2) add_big_enemies(big_enemies, enemies, 1) increase_speed(small_enemies, 1) increase_speed(mid_enemies, 1) elif level == 4 and score > 15000: level = 5 upgrade_sound.play() # 增加三架小飞机,两架中飞机,一架大飞机 add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 3) add_big_enemies(big_enemies, enemies, 2) increase_speed(small_enemies, 1) increase_speed(mid_enemies, 1) # 背景绘制 screen.blit(background, (0, 0)) if life_num and not paused: # 频繁发生的用key模块 检测用户的整个键盘操作,返回布尔类型值 key_pressed = pygame.key.get_pressed() if key_pressed[K_w] or key_pressed[K_UP]: me.moveup() if key_pressed[K_s] or key_pressed[K_DOWN]: me.movedown() if key_pressed[K_a] or key_pressed[K_LEFT]: me.moveleft() if key_pressed[K_d] or key_pressed[K_RIGHT]: me.moveright() # 绘制炸弹补给包并检测获得 if bomb_supply.active: bomb_supply.move() screen.blit(bomb_supply.image, bomb_supply.rect) if pygame.sprite.collide_mask(me, bomb_supply): # 这里检测完美碰撞(两个单体),返回True和False get_bomb_sound.play() if bomb_num < 3: bomb_num += 1 bomb_supply.active = False # 绘制子弹补给包并检测获得 if bullet_supply.active: bullet_supply.move() screen.blit(bullet_supply.image, bullet_supply.rect) if pygame.sprite.collide_mask(me, bullet_supply): # 这里检测完美碰撞(两个单体),返回True和False get_bullet_sound.play() # 发射超级子弹,持续18秒 is_double_bullet = True pygame.time.set_timer(DOUBLE_BULLET_TIMER, 12 * 1000) bullet_supply.active = False # 子弹发射(每10帧绘制一次) if not (delay % 10): # 播放子弹声音 bullet_sound.play() if is_double_bullet: bullets = bullet2 bullets[bullet2_index].reset( (me.rect.centerx - 33, me.rect.centery)) bullets[bullet2_index + 1].reset( (me.rect.centerx + 30, me.rect.centery)) # 传入二元组(位置) bullet2_index = (bullet2_index + 2) % BULLET2_NUM else: bullets = bullet1 bullets[bullet1_index].reset(me.rect.midtop) # 这里其实是预算了子弹差不多4颗能到屏幕80%地方(飞机下面状态栏占了20%) bullet1_index = (bullet1_index + 1) % BULLET1_NUM # 检测子弹是否击中敌机 for b in bullets: if b.active: b.move() screen.blit(b.image, b.rect) enemy_hit = pygame.sprite.spritecollide( b, enemies, False, pygame.sprite.collide_mask) # 检测和敌机碰撞(返回碰撞敌机列表) if enemy_hit: b.active = False for e in enemy_hit: # 中飞机和大飞机血量为0才阵亡 if e in mid_enemies or e in big_enemies: e.hit = True e.energy -= 1 if e.energy == 0: e.active = False else: e.active = False # 绘制大飞机 for each in big_enemies: if each.active: each.move() if each.hit: # 绘制被击中的特效 screen.blit(each.image_hit, each.rect) each.hit = False else: if switch_image: screen.blit(each.image1, each.rect) else: screen.blit(each.image2, each.rect) # 绘制血槽 pygame.draw.line(screen, BLACK, (each.rect.left, each.rect.top - 5), (each.rect.right, each.rect.top - 5), 2) # 在飞机上方五个像素位置画一条线(宽2像素) # 当生命大于20%显示绿色,否则显示红色 energy_remanin = each.energy / enemy.BigEnemy.energy if energy_remanin > 0.2: energy_color = GREEN else: energy_color = RED pygame.draw.line( screen, energy_color, (int(each.rect.left), int(each.rect.top - 5)), (int(each.rect.left) + int(each.rect.width * energy_remanin), int(each.rect.top - 5)), 2) # 绘制生命剩余 # 大飞机即将出现时带音效 if each.rect.bottom == -50: # 大飞机speed=1,肯定会到达-50,这时候开始播放(知道挂掉) enemy3_fly_sound.play(-1) # -1表示循环播放 else: if not (delay % 3): # 降速否则毁灭图片看不清 if e3_destroy_index == 0: # 毁灭之歌 enemy3_down_sound.play() # 毁灭时放图片(索引) screen.blit(each.destroy_images[e3_destroy_index], each.rect) # 下面是个小技巧,余数从0~5,对应毁灭图片列表里6歌元素 e3_destroy_index = (e3_destroy_index + 1) % 6 # 一开始(0+1)%6==1 ,下面判断确保进行一轮 if e3_destroy_index == 0: enemy3_fly_sound.stop() score += 1000 each.reset() # 绘制中飞机 for each in mid_enemies: if each.active: each.move() if each.hit: screen.blit(each.image_hit, each.rect) each.hit = False else: screen.blit(each.image, each.rect) # 绘制血槽 pygame.draw.line(screen, BLACK, (each.rect.left, each.rect.top - 5), (each.rect.right, each.rect.top - 5), 2) # 在飞机上方五个像素位置画一条线(宽2像素) # 当生命大于20%显示绿色,否则显示红色 energy_remanin = each.energy / enemy.MidEnemy.energy if energy_remanin > 0.2: energy_color = GREEN else: energy_color = RED pygame.draw.line( screen, energy_color, (int(each.rect.left), int(each.rect.top - 5)), (int(each.rect.left + each.rect.width * energy_remanin), int(each.rect.top - 5)), 2) # 绘制生命剩余 else: if not (delay % 3): # 降速否则毁灭图片看不清 if e2_destroy_index == 0: # 毁灭之歌 enemy2_down_sound.play() # 防止pygame音效通道被占满(防止重复帧播放音效) # 毁灭时放图片(索引) screen.blit(each.destroy_images[e2_destroy_index], each.rect) # 下面是个小技巧,余数从0~5,对应毁灭图片列表里6歌元素 e2_destroy_index = (e2_destroy_index + 1) % 4 # 一开始(0+1)%6==1 ,下面判断确保进行一轮 if e2_destroy_index == 0: score += 500 each.reset() # 绘制小飞机 for each in small_enemies: if each.active: each.move() screen.blit(each.image, each.rect) else: if not (delay % 3): # 降速否则毁灭图片看不清 if e1_destroy_index == 0: # 毁灭之歌 enemy1_down_sound.play() # 毁灭时放图片(索引) screen.blit(each.destroy_images[e1_destroy_index], each.rect) # 下面是个小技巧,余数从0~5,对应毁灭图片列表里6歌元素 e1_destroy_index = (e1_destroy_index + 1) % 4 # 一开始(0+1)%6==1 ,下面判断确保进行一轮 if e1_destroy_index == 0: score += 100 each.reset() #检测我方飞机是否被撞(第三个参数是碰撞毁灭False,第四个参数默认是矩形区域检测)) enemies_down = pygame.sprite.spritecollide( me, enemies, False, pygame.sprite.collide_mask) # pygame.sprite.collide_mask图片非透明部分接触碰撞 if enemies_down and not me.invincible: me.active = False # 返回一个列表,里面包含所有与sprite碰撞的元素,敌机的active也为False for e in enemies_down: e.active = False # 我方飞机绘制(尾气切换) if me.active: if switch_image: screen.blit(me.image1, me.rect) else: screen.blit(me.image2, me.rect) else: if not (delay % 3): # 降速否则毁灭图片看不清 if me_destroy_index == 0: # 毁灭之歌 me_down_sound.play() # 毁灭时放图片(索引) screen.blit(me.destroy_images[me_destroy_index], me.rect) # 下面是个小技巧,余数从0~5,对应毁灭图片列表里6歌元素 me_destroy_index = (me_destroy_index + 1) % 4 # 一开始(0+1)%6==1 ,下面判断确保进行一轮 if me_destroy_index == 0: # me.reset() life_num -= 1 me.reset() pygame.time.set_timer(INVINCIBLE_TIMER, 3 * 1000) # 设置reset后3秒,然后启动解除无敌状态 # 得分显示(render函数将成字符串渲染成surface对象) score_text = score_font.render("Score : %s" % str(score), True, WHITE) # 第二个参数为True表示拒绝锯齿 screen.blit(score_text, (10, 5)) # 生命为0结束 elif life_num == 0: # bgm停止 pygame.mixer.music.stop() # 停止音效 pygame.mixer.stop() # 停止补给包 pygame.time.set_timer(SUPPLY_TIMER, 0) if not recorded: # 读取历史最高分 with open("record.txt", 'a+') as f: f.seek(0, 0) record_score = int(f.read()) # 如果玩家得分高于最高分则存档 if score > record_score: f.seek(0, 0) f.truncate() f.write(str(score)) recorded = True print("Game Over!") # 绘制游戏结束画面 record_score_text = score_font.render("Best : %d" % record_score, True, WHITE) screen.blit(record_score_text, (50, 50)) gameover_text1 = gameover_font.render("Your Score", True, WHITE) gameover_text1_rect = gameover_text1.get_rect() gameover_text1_rect.left, gameover_text1_rect.top = ( width - gameover_text1_rect.width) // 2, height // 3 screen.blit(gameover_text1, gameover_text1_rect) # 分数显示 gameover_text2 = gameover_font.render(str(score), True, WHITE) gameover_text2_rect = gameover_text2.get_rect() gameover_text2_rect.left, gameover_text2_rect.top = ( width - gameover_text2_rect.width ) // 2, gameover_text1_rect.bottom + 10 screen.blit(gameover_text2, gameover_text2_rect) # 重新开始按钮 again_rect.left, again_rect.top = ( width - again_rect.width) // 2, gameover_text2_rect.bottom + 50 screen.blit(again_image, again_rect) # 游戏结束按钮 gameover_rect.left, gameover_rect.top = ( width - again_rect.width) // 2, again_rect.bottom + 10 screen.blit(gameover_image, gameover_rect) # 检测用户的鼠标操作 # 如果用户按下鼠标左键(0表示第一个元素————鼠标左键) if pygame.mouse.get_pressed()[0]: # 获取鼠标坐标 pos = pygame.mouse.get_pos() # 如果用户点击“重新开始” if again_rect.left < pos[0] < again_rect.right and \ again_rect.top < pos[1] < again_rect.bottom: # 调用main函数,重新开始游戏 main() # 如果用户点击“结束游戏” elif gameover_rect.left < pos[0] < gameover_rect.right and \ gameover_rect.top < pos[1] < gameover_rect.bottom: # 退出游戏 pygame.quit() sys.exit() # 绘制暂停按钮 screen.blit(paused_image, paused_rect) # 绘制清屏炸弹显示 # 炸弹图片 screen.blit(bomb_image, (10, height - 10 - bomb_rect.height)) # 炸弹文本 bomb_text = bomb_font.render("x %d" % bomb_num, True, WHITE) text_rect = bomb_text.get_rect() screen.blit(bomb_text, (20 + bomb_rect.width, height - 5 - text_rect.height)) # 绘制生命剩余显示 if life_num: for i in range(life_num): screen.blit(life_image, (width - 10 - (i + 1) * life_rect.width, height - 10 - life_rect.height)) # 延迟切换(delay只有被5整除的时候才会切换) if not (delay % 5): switch_image = not switch_image delay -= 1 if not delay: delay = 100 # 相当于60帧的游戏尾气切换只有12帧 pygame.display.flip() clock.tick(60)
def main(): pygame.mixer.music.play(-1) clock = pygame.time.Clock() running = True frames = 60 delay = 100 # define lives life_image = pygame.image.load("images\life.png").convert_alpha() life_rect = life_image.get_rect() life_num = 1 life_display_width = life_rect.width + 5 """define the score""" # load font score = 0 score_font = pygame.font.Font("eng_font.ttf", 20) final_score_font = pygame.font.Font("eng_font.ttf", 40) break_record_font = pygame.font.Font("eng_font.ttf", 40) function_font = pygame.font.Font("eng_font.ttf", 30) function_pressed_font = pygame.font.Font("eng_font.ttf", 20) # create font surfaces final_score_text1 = final_score_font.render("Score", True, WHITE) #final score text2 is related to the game, defined in the end restart_text = function_font.render("RESTART", True, WHITE) restart_pressed_text = function_pressed_font.render("RESTART", True, WHITE) exit_text = function_font.render("EXIT", True, WHITE) exit_pressed_text = function_pressed_font.render("EXIT", True, WHITE) # acquire font rect restart_text_rect = restart_text.get_rect() restart_text_rect.center = (width // 2, 380) restart_pressed_text_rect = restart_pressed_text.get_rect() restart_pressed_text_rect.center = (width // 2, 380) exit_text_rect = exit_text.get_rect() exit_text_rect.center = (width // 2, 460) exit_pressed_text_rect = exit_pressed_text.get_rect() exit_pressed_text_rect.center = (width // 2, 460) # define levels upon scores level = 1 level_font = pygame.font.Font("eng_font.ttf", 10) # define supply bomb_supply = supply.Bomb_Supply(bg_size) bullet_supply = supply.Bullet_Supply(bg_size) SUPPLY_TIME = USEREVENT supply_interval = 3 * 1000 pygame.time.set_timer(SUPPLY_TIME, supply_interval) bomb_num = 0 # define bomb stock bomb_stock1 = pygame.image.load(r"images\bomb.png").convert_alpha() bomb_stock2 = pygame.image.load(r"images\bomb.png").convert_alpha() bomb_stock3 = pygame.image.load(r"images\bomb.png").convert_alpha() bomb_stocks = [bomb_stock1, bomb_stock2, bomb_stock3] bomb_stock_rect = bomb_stock1.get_rect() bomb_stock_display_width = bomb_stock_rect.width + 5 # newborn timer NEWBORN_TIMER = USEREVENT + 2 # super bullet timer DOUBLE_BULLET_TIME = USEREVENT + 1 # super bullet signal is_double_bullet = False # bomb confirm switch bomb_confirm = False # switch of record when game over end_recorded = False # define pause and continue button paused = False pause_nor_image = pygame.image.load("images\pause1.png").convert_alpha() pause_pressed_image = pygame.image.load( "images\pause2.png").convert_alpha() continue_nor_image = pygame.image.load( "images\continue1.png").convert_alpha() continue_pressed_image = pygame.image.load( "images\continue2.png").convert_alpha() paused_rect = pause_nor_image.get_rect() paused_rect.right, paused_rect.top = width - 10, 10 pause_image = pause_nor_image # define game over buttons restart_pressed = False exit_pressed = False # creating my plane me = myplane.MyPlane(bg_size) me_down_index = 0 # creating the enemy planes enemies = pygame.sprite.Group() small_enemies = pygame.sprite.Group() add_small_enemies(small_enemies, enemies, 15) e1_destroy_index = 0 normal_enemies = pygame.sprite.Group() add_normal_enemies(normal_enemies, enemies, 5) e2_destroy_index = 0 e2_hit = False strong_enemies = pygame.sprite.Group() add_strong_enemies(strong_enemies, enemies, 1) e3_destroy_index = 0 e3_hit = False # creating bullets bullet1 = [] bullet1_index = 0 BULLET1_NUM = 4 # customized, to ensure the number of bullets is adequate for i in range(BULLET1_NUM): bullet1.append(bullet.Bullet1(me.rect.midtop)) bullet2 = [] bullet2_index = 0 BULLET2_NUM = 8 # customized, to ensure the number of bullets is adequate for i in range(BULLET1_NUM): bullet2.append(bullet.Bullet2((me.rect.centerx + 30, me.rect.centery))) bullet2.append(bullet.Bullet2((me.rect.centerx - 33, me.rect.centery))) while running: for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() if life_num: """detection of regular game page and pause page """ # operation of pause and continue if event.type == MOUSEBUTTONDOWN and paused_rect.collidepoint( event.pos): paused = not paused if paused: pygame.time.set_timer(SUPPLY_TIME, 0) pygame.mixer.music.pause() pygame.mixer.pause() else: pygame.time.set_timer(SUPPLY_TIME, supply_interval) pygame.mixer.music.unpause() pygame.mixer.unpause() elif event.type == MOUSEMOTION: if paused_rect.collidepoint(event.pos): if paused: pause_image = continue_pressed_image else: pause_image = pause_pressed_image else: if paused: pause_image = continue_nor_image else: pause_image = pause_nor_image elif event.type == MOUSEBUTTONUP: if paused_rect.collidepoint(event.pos): if paused: pause_image = continue_nor_image else: pause_image = pause_nor_image # trigger of supply elif event.type == SUPPLY_TIME: show_supply_sound.play() if choice((True, False)): bomb_supply.reset() else: bullet_supply.reset() # detect the end of bullet supply elif event.type == DOUBLE_BULLET_TIME: is_double_bullet = False pygame.time.set_timer(DOUBLE_BULLET_TIME, 0) # bomb bomb elif event.type == KEYDOWN: if event.key == K_SPACE: if bomb_num > 0: bomb_sound.play() bomb_num -= 1 bomb_confirm = True # out of newborn elif event.type == NEWBORN_TIMER: me.newborn = False pygame.time.set_timer(NEWBORN_TIMER, 0) """detection of game over page""" if life_num == 0: if event.type == MOUSEMOTION: if restart_text_rect.collidepoint(event.pos): restart_pressed = True elif exit_text_rect.collidepoint(event.pos): exit_pressed = True else: restart_pressed = False exit_pressed = False elif event.type == MOUSEBUTTONDOWN: if restart_text_rect.collidepoint(event.pos): life_num = 3 bomb_num = 0 score = 0 delay = 100 is_double_bullet = False paused = False restart_pressed = False end_recorded = False pygame.mixer.music.play(-1) pygame.time.set_timer(SUPPLY_TIME, supply_interval) level = 1 #need to reset enemies #reset enemies enemies.empty() small_enemies.empty() add_small_enemies(small_enemies, enemies, 15) e1_destroy_index = 0 normal_enemies.empty() add_normal_enemies(normal_enemies, enemies, 5) e2_destroy_index = 0 e2_hit = False strong_enemies.empty() add_strong_enemies(strong_enemies, enemies, 1) e3_destroy_index = 0 e3_hit = False elif exit_text_rect.collidepoint(event.pos): pygame.quit() sys.exit() screen.blit(background, (0, 0)) # level adjustment if level == 1 and score >= 50000: level = 2 upgrade_sound.play() # add 3 small enemies, 2 normal enemy and 1 strong enemy add_small_enemies(small_enemies, enemies, 3) add_normal_enemies(normal_enemies, enemies, 2) add_strong_enemies(strong_enemies, enemies, 1) # increase the speed of small enemy add_speed(small_enemies, 1) if level == 2 and score >= 120000: level = 3 upgrade_sound.play() # add 5 small enemies, 3 normal enemy and 2 strong enemy add_small_enemies(small_enemies, enemies, 5) add_normal_enemies(normal_enemies, enemies, 3) add_strong_enemies(strong_enemies, enemies, 2) # increase the speed of small enemy add_speed(small_enemies, 1) add_speed(normal_enemies, 1) if level == 3 and score >= 200000: level = 4 upgrade_sound.play() # add 5 small enemies, 3 normal enemy and 2 strong enemy add_small_enemies(small_enemies, enemies, 5) add_normal_enemies(normal_enemies, enemies, 3) add_strong_enemies(strong_enemies, enemies, 2) # increase the speed of small enemy add_speed(small_enemies, 1) add_speed(normal_enemies, 1) elif level == 4 and score >= 300000: level = 5 upgrade_sound.play() # add 5 small enemies, 3 normal enemy and 2 strong enemy add_small_enemies(small_enemies, enemies, 5) add_normal_enemies(normal_enemies, enemies, 3) add_strong_enemies(strong_enemies, enemies, 2) # increase the speed of small enemy add_speed(small_enemies, 1) add_speed(normal_enemies, 1) if life_num and not paused: # detecting user's keyboard key_pressed = pygame.key.get_pressed() if key_pressed[K_w] or key_pressed[K_UP]: me.moveUp() if key_pressed[K_s] or key_pressed[K_DOWN]: me.moveDown() if key_pressed[K_a] or key_pressed[K_LEFT]: me.moveLeft() if key_pressed[K_d] or key_pressed[K_RIGHT]: me.moveRight() # depicting bullets if not (delay % 10): if is_double_bullet: bullets = bullet2 bullets[bullet2_index].reset( (me.rect.centerx + 30, me.rect.centery)) bullets[bullet2_index + 1].reset( (me.rect.centerx - 33, me.rect.centery)) bullet2_index = (bullet2_index + 2) % BULLET2_NUM else: bullets = bullet1 bullets[bullet1_index].reset(me.rect.midtop) bullet1_index = (bullet1_index + 1) % BULLET1_NUM # depicting bullets for b in bullets: if b.active: b.move() screen.blit(b.image, b.rect) enemies_down = pygame.sprite.spritecollide( b, enemies, False, pygame.sprite.collide_mask) for e in enemies_down: if e in normal_enemies or e in strong_enemies: e.hp -= 1 e.hit = True if e.hp == 0: e.active = False else: e.active = False b.active = False # depicting enemy planes for each in strong_enemies: if each.active: if bomb_confirm: if each.rect.bottom > -10: each.active = False else: each.move() # play sound before showing if 0 > each.rect.bottom > -50: enemy3_show_sound.play() # draw hp bar pygame.draw.line(screen, BLACK, \ (each.rect.left, each.rect.top - 5), \ (each.rect.right, each.rect.top - 5), \ 2) hp_remain = each.hp / enemy.StrongEnemy.hp hp_color = GREEN if hp_remain > 0.2 else RED pygame.draw.line(screen, hp_color, \ (each.rect.left, each.rect.top - 5), \ (each.rect.width * hp_remain + each.rect.left, \ each.rect.top - 5), \ 2) if each.hit: screen.blit(each.hit_image, each.rect) each.hit = False else: screen.blit(each.image, each.rect) else: # conduct destroy if not (delay % 3): if e3_destroy_index == 0: enemy3_down_sound.play() screen.blit(each.destroy_images[e3_destroy_index], each.rect) e3_destroy_index = (e3_destroy_index + 1) % each.destroy_steps if e3_destroy_index == 0: score += 15000 each.reset() for each in normal_enemies: if each.active: if bomb_confirm: if each.rect.bottom > -10: each.active = False else: each.move() # draw hp bar pygame.draw.line(screen, BLACK, \ (each.rect.left, each.rect.top - 5), \ (each.rect.right, each.rect.top - 5), \ 2) hp_remain = each.hp / enemy.NormalEnemy.hp hp_color = GREEN if hp_remain > 0.2 else RED pygame.draw.line(screen, hp_color, \ (each.rect.left, each.rect.top - 5), \ (each.rect.width * hp_remain + each.rect.left, \ each.rect.top - 5), \ 2) if each.hit: screen.blit(each.hit_image, each.rect) each.hit = False else: screen.blit(each.image, each.rect) else: # conduct destroy if not (delay % 3): if e2_destroy_index == 0: enemy2_down_sound.play() screen.blit(each.destroy_images[e2_destroy_index], each.rect) e2_destroy_index = (e2_destroy_index + 1) % each.destroy_steps if e2_destroy_index == 0: score += 5000 each.reset() for each in small_enemies: if each.active: if bomb_confirm: if each.rect.bottom > -10: each.active = False else: each.move() screen.blit(each.image, each.rect) else: # conduct destroy if not (delay % 3): if e1_destroy_index == 0: enemy1_down_sound.play() screen.blit(each.destroy_images[e1_destroy_index], each.rect) e1_destroy_index = (e1_destroy_index + 1) % each.destroy_steps if e1_destroy_index == 0: score += 500 each.reset() # detect collision of our plane enemies_down = pygame.sprite.spritecollide( me, enemies, False, pygame.sprite.collide_mask) if enemies_down and not me.newborn: me.active = False for e in enemies_down: e.active = False # depicting my plane if me.active: if not me.newborn: me.switchShape() screen.blit(me.images[me.order], me.rect) else: # blink when new born newborn_countdown -= 1 if not (newborn_countdown % (frames // 7)): screen.blit(me.images[me.order], me.rect) else: # conduct destroy me_down_sound.play() if not (delay % 3): screen.blit(me.destroy_images[me_down_index], me.rect) me_down_index = (me_down_index + 1) % me.destroy_steps if me_down_index == 0: if life_num: life_num -= 1 me.reset() newborn_countdown = frames * 2 pygame.time.set_timer(NEWBORN_TIMER, 2 * 1000) # depicting supply if bomb_supply.active: bomb_supply.move() screen.blit(bomb_supply.image, bomb_supply.rect) if pygame.sprite.collide_mask(bomb_supply, me): get_supply_sound.play() if bomb_num < 3: bomb_num += 1 bomb_supply.active = False if bullet_supply.active: bullet_supply.move() screen.blit(bullet_supply.image, bullet_supply.rect) if pygame.sprite.collide_mask(bullet_supply, me): get_supply_sound.play() is_double_bullet = True pygame.time.set_timer(DOUBLE_BULLET_TIME, 18 * 1000) bullet_supply.active = False # depict bomb stock for i in range(bomb_num): screen.blit(bomb_stocks[i], \ (20 + bomb_stock_display_width * i, \ height - bomb_stock_rect.height - 20)) # depict life stock for i in range(life_num): screen.blit(life_image, \ (width - 20 - life_display_width * (1 + i), \ height - life_rect.height - 20)) if delay: delay -= 1 else: delay = 100 elif life_num == 0: if not end_recorded: # game over end_recorded = True # stop music and sound pygame.mixer.music.stop() pygame.mixer.stop() # stop supply system pygame.time.set_timer(SUPPLY_TIME, 0) # load record with open("record.txt", "r") as f: record_score = int(f.read()) # store score if the best if score > record_score: break_record = True record_score = score with open("record.txt", "w") as f: f.write(str(score)) else: break_record = False """depict the screen of end of the game""" #record score display record_score_text = score_font.render( "Best score:{}".format(record_score), True, WHITE) screen.blit(record_score_text, (10, 5)) #break record display if break_record: break_record_text = break_record_font.render( "BREAK RECORD", True, WHITE) screen.blit(break_record_text, (width // 2 - break_record_text.get_width() // 2, 100 - 30)) # score display #final score text1 is solid, defined in the beginning screen.blit( final_score_text1, (width // 2 - final_score_text1.get_width() // 2, 190 - 30)) final_score_text2 = final_score_font.render( "{}".format(score), True, WHITE) screen.blit( final_score_text2, (width // 2 - final_score_text2.get_width() // 2, 270 - 30)) #display of restart and exit if restart_pressed: screen.blit( restart_pressed_text, (width // 2 - restart_pressed_text_rect.width // 2, 380)) else: screen.blit(restart_text, (width // 2 - restart_text_rect.width // 2, 380)) if exit_pressed: screen.blit( exit_pressed_text, (width // 2 - exit_pressed_text_rect.width // 2, 460)) else: screen.blit(exit_text, (width // 2 - exit_text_rect.width // 2, 460)) if life_num: """only print if pause or in game""" # print the score score_text = score_font.render("Score : {}".format(score), True, WHITE) screen.blit(score_text, (10, 5)) # print the level level_text = level_font.render("Level : {}".format(level), True, WHITE) screen.blit(level_text, (50, 30)) screen.blit(pause_image, paused_rect) pygame.display.flip() clock.tick(frames) if bomb_confirm: # bomb used bomb_confirm = False