def main(): pygame.mixer.music.play(-1) #生成我方飞机 me = myplane.Myplane(bg_size) enemies = pygame.sprite.Group() #生成敌方小型飞机 S_enemies = pygame.sprite.Group() add_S_enemies(S_enemies, enemies, 15) #生成敌方中型飞机 M_enemies = pygame.sprite.Group() add_M_enemies(M_enemies, enemies, 5) #生成敌方大型飞机 X_enemies = pygame.sprite.Group() add_X_enemies(X_enemies, enemies, 2) #生成普通子弹 bullet1 = [] bullet1_index = 0 BULLET_NUM = 5 for i in range(BULLET_NUM): bullet1.append(bullet.Bullet1(me.rect.midtop)) #生成超级子弹 bullet2 = [] double_bullet = False 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() #毁灭图片索引 e1_destory_index = 0 e2_destory_index = 0 e3_destory_index = 0 me_destory_index = 0 #统计得分 score = 0 #设置游戏难度 level = 1 #设置全屏炸弹 bomb_image = pygame.image.load("images/bomb.png").convert_alpha() bomb_rect = bomb_image.get_rect() bomb_num = 3 bomb_rect.left, bomb_rect.bottom = 0, height #每10秒发放一个补给包 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) #用于解除超级子弹状态定时器 DOUBLE_BULLET_TIME = USEREVENT + 1 #用于切换我方飞机图片 switch_image = True #用于绘制暂停按钮 paused = False pause_image1 = pygame.image.load("images/pause1.png").convert_alpha() pause_image = pygame.image.load("images/pause2.png").convert_alpha() pause_rect = pause_image.get_rect() pause_rect.right, pause_rect.top = width, 0 #生命数量 life_num = 3 life_image = pygame.image.load("images/life_image.png").convert_alpha() life_rect = life_image.get_rect() life_rect.right, life_rect.bottom = width, height #用于绘制结束画面 game_over_image1 = pygame.image.load( "images/game_over2.png").convert_alpha() game_over_image2 = pygame.image.load( "images/game_over1.png").convert_alpha() game_over_image_rect = game_over_image1.get_rect() game_over_image_rect.centerx, game_over_image_rect.centery = width / 2, height / 2 #用于阻止重复打开recored recoreded = False #用于延迟 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 pause_rect.collidepoint(event.pos): paused = not paused pause_image, pause_image1 = pause_image1, pause_image elif event.button == 1 and game_over_image_rect.collidepoint( event.pos) and life_num == 0: main() elif event.type == SUPPLY_TIME: if not paused: supply_sound.play() if choice([True, False]): bomb_supply.reset() else: bullet_supply.reset() elif event.type == DOUBLE_BULLET_TIME: double_bullet = False pygame.time.set_timer(DOUBLE_BULLET_TIME, 0) elif event.type == KEYDOWN: if event.key == K_SPACE: if bomb_num: bomb_num -= 1 use_bomb_sound.play() for each in enemies: if each.rect.bottom > 0: each.active = False screen.blit(background1.image, background1.rect) screen.blit(background2.image, background2.rect) screen.blit(cloud1.image_s, cloud1.image_rect) screen.blit(cloud2.image_s, cloud2.image_rect) #绘制界面UI if life_num: #绘制暂停按钮 screen.blit(pause_image, pause_rect) #绘制全屏炸弹示意图 for i in range(bomb_num): bomb_rect.left = bomb_rect.left + i * bomb_rect.width screen.blit(bomb_image, bomb_rect) bomb_rect.left = 0 #绘制剩余生命示意图 for i in range(life_num): life_rect.right = life_rect.right - i * life_rect.width screen.blit(life_image, life_rect) life_rect.right = width #绘制结束画面 else: #停止播放背景音乐 pygame.mixer.music.stop() #停止播放全部营销 pygame.mixer.stop() #停止发放补给 pygame.time.set_timer(SUPPLY_TIME, 0) screen.blit(game_over_image1, game_over_image_rect) screen.blit( game_over_image2, (game_over_image_rect.left, game_over_image_rect.top + 64)) #读取历史最高得分 if not recoreded: recoreded = 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)) #根据用户的得分增加难度 if level == 1 and score == 5000: level = 2 upgrade_sound.play() #增加 3架小型敌机、两两架中型敌机和一架大型敌机 add_S_enemies(S_enemies, enemies, 5) add_M_enemies(M_enemies, enemies, 3) add_X_enemies(X_enemies, enemies, 1) #提升小型敌机的速度 inc_speed(S_enemies, 1) elif level == 2 and score > 30000: level = 3 upgrade_sound.play() #增加3架小型敌机、两两架中型敌机和一架大型敌机 add_S_enemies(S_enemies, enemies, 5) add_M_enemies(M_enemies, enemies, 3) add_X_enemies(X_enemies, enemies, 1) #提升小型敌机的速度 inc_speed(S_enemies, 2) inc_speed(M_enemies, 3) elif level == 3 and score > 100000: level = 4 upgrade_sound.play() #增加3架小型敌机、两两架中型敌机和一架大型敌机 add_S_enemies(S_enemies, enemies, 10) add_M_enemies(M_enemies, enemies, 5) add_X_enemies(X_enemies, enemies, 3) #提升小型敌机的速度 inc_speed(S_enemies, 1) inc_speed(M_enemies, 1) if not paused and life_num: #背景移动 background1.move() background2.move() cloud1.move() cloud2.move() #检测键盘输入 key_pressed = pygame.key.get_pressed() if key_pressed[K_w] or key_pressed[K_UP]: me.move("Up") if key_pressed[K_s] or key_pressed[K_DOWN]: me.move("Down") if key_pressed[K_a] or key_pressed[K_LEFT]: me.move("Left") if key_pressed[K_d] or key_pressed[K_RIGHT]: me.move("Right") #用于设置护盾 if key_pressed[K_LCTRL] or key_pressed[K_RCTRL]: me.invincible = True else: me.invincible = False #绘制全屏炸弹补给并检测是否获得 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() double_bullet = True bullet_supply.active = False pygame.time.set_timer(DOUBLE_BULLET_TIME, 5 * 1000) #发射子弹 if not (delay % 10): if double_bullet: bullets = bullet2 bullets[bullet2_index].reset( (me.rect.centerx - 20, me.rect.centery)) bullets[bullet2_index + 1].reset( (me.rect.centerx + 20, 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) % BULLET_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 M_enemies or e in X_enemies: e.HP -= 1 e.hit = True if e.HP == 0: e.active = False else: e.active = False #绘制大型敌机 for each in X_enemies: if each.active: each.move() screen.blit(each.image, each.rect) each.fly_image_rect.center = each.rect.center screen.blit(each.fly_images[4], each.fly_image_rect) if not (delay % 2): screen.blit(each.fly_images[e3_destory_index], each.fly_image_rect) e3_destory_index = (e3_destory_index + 1) % 4 #绘制大型敌机HP pygame.draw.line(screen,black,\ (each.rect.left,each.rect.top-5),\ (each.rect.right,each.rect.top-5),2) #当生命大于百分之20显示绿色,否则显示红色 HP_remain = each.HP / enemy.X_enemy.HP if HP_remain > 0.2: HP_color = green else: HP_color = red pygame.draw.line(screen,HP_color,\ (each.rect.left,each.rect.top-5),\ (each.rect.left+each.rect.width*HP_remain,\ each.rect.top-5),2) if each.rect.bottom == -50: X_enemy_out.play(-1) else: #毁灭 if not (delay % 3): screen.blit(each.destroy_images[e3_destory_index], each.rect) e3_destory_index = (e3_destory_index + 1) % 4 if e3_destory_index == 0: X_enemy_out.stop() X_enemy_down.play() score += 10000 each.reset() #绘制中型敌机 for each in M_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) #绘制大型敌机HP pygame.draw.line(screen,black,\ (each.rect.left,each.rect.top-5),\ (each.rect.right,each.rect.top-5),2) #当生命大于百分之20显示绿色,否则显示红色 HP_remain = each.HP / enemy.M_enemy.HP if HP_remain > 0.2: HP_color = green else: HP_color = red pygame.draw.line(screen,HP_color,\ (each.rect.left,each.rect.top-5),\ (each.rect.left+each.rect.width*HP_remain,\ each.rect.top-5),2) else: #毁灭 if not (delay % 3): screen.blit(each.destroy_images[e3_destory_index], each.rect) e2_destory_index = (e2_destory_index + 1) % 4 if e2_destory_index == 0: S_enemy_down.play() score += 3000 each.reset() #绘制小型敌机 for each in S_enemies: if each.active: each.move() screen.blit(each.image, each.rect) else: #毁灭 if not (delay % 6): screen.blit(each.destroy_images[e3_destory_index], each.rect) e1_destory_index = (e1_destory_index + 1) % 4 S_enemy_down.play() if e1_destory_index == 0: score += 1000 each.reset() #j检测我方飞机是否被撞 if me.invincible: me.mask = me.masks[1] else: me.mask = me.masks[0] enemies_down = pygame.sprite.spritecollide( me, enemies, False, pygame.sprite.collide_mask) if enemies_down: if not me.invincible: me.active = False for e in enemies_down: e.active = False #绘制我方飞机动画 if me.active: if me.invincible: me.invincible_image_rect.center = me.rect.center screen.blit(me.invincible_image, me.invincible_image_rect) if switch_image: screen.blit(me.image1, me.rect) else: screen.blit(me.image2, me.rect) else: #我方毁灭 if not (delay % 3): screen.blit(each.destroy_images[me_destory_index], each.rect) me_destory_index = (me_destory_index + 1) % 4 if me_destory_index == 0: me_down.play() if life_num: life_num -= 1 me.reset() screen.blit(cloud1.image_s, cloud1.image_rect) screen.blit(cloud2.image_s, cloud2.image_rect) #切换图片 if not (delay % 5): switch_image = not switch_image delay -= 1 if not delay: delay = 100 print("战争文本 Score:%d 炸弹数量:%d 剩余数量%d" % (score, bomb_num, life_num)) pygame.display.flip() clock.tick(60)
def main(): clock = pygame.time.Clock() runing = True switch_image = True #用于切换飞机状态 delay = 100 # 用于延迟的变量 #中弹图像索引 e1_destory_index = 0 e2_destory_index = 0 e3_destory_index = 0 me_destory_index = 0 # 一直循环播放背景音乐 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) #生成普通子弹 bullet1 = [] bullet1_index = 0 BULLET1_NUM = 4 for i in range(BULLET1_NUM): bullet1.append(bullet.Bullet1(me.rect.midtop)) while (runing): for event in pygame.event.get(): #当点击右上角关闭时退出游戏 if event.type == QUIT: pygame.quit() sys.exit() #检测用户的键盘操作 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() screen.blit(background, (0, 0)) #发射子弹 if not (delay % 10): bullet1[bullet1_index].reset(me.rect.midtop) bullet1_index = (bullet1_index + 1) % BULLET1_NUM #检测子弹是否击中敌机 for b in bullet1: 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: e.energy -= 1 if e.energy == 0: 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_collor = GREEN else: energy_collor = RED pygame.draw.line(screen, energy_collor, \ (each.rect.left, each.rect.top - 5), \ (each.rect.left + each.rect.width*energy_remain,\ each.rect.top -5), \ 2) #boss即将进入画面中时播放音效 if each.rect.bottom == -50: enemy3_fly_sound.play(-1) else: #毁灭 if (e3_destory_index == 0): enemy3_down_sound.play() if not (delay % 3): screen.blit(each.destory_images[e3_destory_index], each.rect) e3_destory_index += 1 if e3_destory_index == 6: e3_destory_index = 0 enemy3_fly_sound.stop() 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_collor = GREEN else: energy_collor = RED pygame.draw.line(screen, energy_collor, \ (each.rect.left, each.rect.top - 5), \ (each.rect.left + each.rect.width * energy_remain, \ each.rect.top - 5), \ 2) else: if e2_destory_index == 0: enemy2_down_sound.play() if not (delay % 3): screen.blit(each.destory_images[e2_destory_index], each.rect) e2_destory_index += 1 if e2_destory_index == 4: e2_destory_index = 0 each.reset() #绘制小型敌机 for each in small_enemies: if each.active: each.move() screen.blit(each.image, each.rect) else: if e1_destory_index == 0: enemy1_down_sound.play() if not (delay % 3): screen.blit(each.destory_images[e1_destory_index], each.rect) e1_destory_index += 1 if e1_destory_index == 4: e1_destory_index = 0 each.reset() #检测我方飞机是否被撞 enemies_down = pygame.sprite.spritecollide(me, enemies, False, pygame.sprite.collide_mask) if enemies_down: # me.life -= 1 # if me.life == 0: # me.active = False for e in enemies_down: e.active = False #绘制我方飞机 if me.active: if (delay % 5 == 0): switch_image = not switch_image 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.destory_images[me_destory_index], me.rect) me_destory_index += 1 if me_destory_index == 4: me_destory_index = 0 delay -= 1 if (not delay): delay = 100 pygame.display.flip() clock.tick(60)
def main(): # If the loops is -1 then the music will repeat indefinitely. pygame.mixer.music.play(-1) # create an object to help track time. # The clock also provides several functions to help control a game's framerate. clock = pygame.time.Clock() # 生成我方飞机 me = myplane.Myplane(bg_size) # 生成敌机 enemies = pygame.sprite.Group() # 生成敌方小飞机 small_enemies = pygame.sprite.Group() add_small_enemies(small_enemies, enemies, 5) # 生成敌方中飞机 mid_enemies = pygame.sprite.Group() add_mid_enemies(mid_enemies, enemies, 25) # 生成敌方大飞机 big_enemies = pygame.sprite.Group() add_big_enemies(big_enemies, enemies, 3) # 生成普通子弹 bullet1 = [] bullet1_index = 0 BULLET_NUM1 = 5 for i in range(BULLET_NUM1): bullet1.append(bullet.Bullet1(me.rect.midtop)) # 生成超级子弹 bullet2 = [] bullet2_index = 0 BULLET_NUM2 = 16 for i in range(BULLET_NUM2//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/font.ttf",36) # 难度等级 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.BulletSupply(bg_size) bomb_supply = supply.BombSupply(bg_size) SUPPLY_TIME = USEREVENT pygame.time.set_timer(SUPPLY_TIME, 30 * 1000) # 游戏结束画面 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() # 超级子弹定时器 DOUBBLE_BULLET_TIME = USEREVENT + 1 # 无敌时间计时器 INVINCIBLE_TIME = USEREVENT + 2 # 标志是否使用超级子弹 is_doubble_bullet = False # 生命数量 life_image = pygame.image.load("./images/life.png").convert_alpha() life_rect = life_image.get_rect() life_num = 3 # 暂停设置 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() pause_rect = pause_nor_image.get_rect() pause_rect.left, pause_rect.top = width - pause_rect.width - 10, 10 pause_image = pause_nor_image # 飞机爆炸索引 e1_destroy_index = 0 e2_destroy_index = 0 e3_destroy_index = 0 me_destroy_index = 0 # 用于切换图片 switch_image = True # 用于延迟 delay = 100 running = True # 用于限制重复打开存取记录 recorded = False while running: # get events from the queue 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): 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 pause_rect.collidepoint(event.pos): if paused: pause_image = resume_pressed_image else: pause_image = pause_pressed_image else: if paused: pause_image = resume_nor_image else: pause_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]): bullet_supply.reset() else: bomb_supply.reset() elif event.type == DOUBBLE_BULLET_TIME: is_doubble_bullet = False pygame.time.set_timer(DOUBBLE_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() # 增加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) # 绘制背景图片 # blit: draw one image onto another # surface.blit(source, dest, area=None, special_flags=0) -> Rect screen.blit(background, (0, 0)) if life_num > 0 and not paused: # 检测用户的键盘操作 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() # 检测全屏炸弹补给并检测是否获得 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_doubble_bullet = True pygame.time.set_timer(DOUBBLE_BULLET_TIME, 18 * 1000) bullet_supply.active = False # 每十帧发射一颗子弹 if not(delay % 10): bullet_sound.play() if is_doubble_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) % BULLET_NUM2 else: bullets = bullet1 bullets[bullet1_index].reset(me.rect.midtop) bullet1_index = (bullet1_index + 1) % BULLET_NUM1 # 检测子弹是否击中敌机 for b in bullets: if b.active: # 绘制子弹 b.move() screen.blit(b.image, b.rect) # enemy_hit中存放由pygame.sprite.spritecollide返回的敌机对象 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 big_enemies or e in mid_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.hit_image, 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 + energy_remain * each.rect.width, 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_image[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.hit_image, 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 + energy_remain * each.rect.width, each.rect.top - 5), \ 2) else: # 毁灭 if not(delay % 3): if e2_destroy_index == 0: enemy2_down_sound.play() screen.blit(each.destroy_image[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_image[e1_destroy_index], each.rect) e1_destroy_index = (e1_destroy_index + 1) % 4 if e1_destroy_index == 0: score += 1000 each.reset() # 检测我方飞机是否碰撞 enemy_down = pygame.sprite.spritecollide(me, enemies, False, pygame.sprite.collide_mask) if enemy_down and not me.invincible: me.active = False for e in enemy_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_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_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 - bomb_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)) # 绘制分数 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("D:\\Desktop\\python\\python_basics\\100day\\train_project\\pygame\\record.txt", "r") as f: record_score = int(f.read()) # 如果玩家分数高于历史最高峰,则存档 if score > record_score: with open("D:\\Desktop\\python\\python_basics\\100day\\train_project\\pygame\\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) # 绘制暂停按钮 screen.blit(pause_image,pause_rect) # 在循环内不断切换,5帧切换一次 if not(delay % 5): switch_image = not switch_image delay -= 1 if not delay: delay = 100 # 更新整个待显示的 Surface 对象到屏幕上 pygame.display.flip() clock.tick(60)
def main(): clock = pygame.time.Clock() plane = myplane.Myplane(480, 700) bullet_list = [bullet.Bullet(plane.rect) for x in range(4)] bullet_index = 0 delay = 0 doubullet_list = [bullet.DouBullet(plane.rect) for x in range(4)] doubullet_index = 0 doubullet1_list = [bullet.DouBullet1(plane.rect) for x in range(4)] doubullet1_index = 0 enemys_group = pygame.sprite.Group( [enemy.Enemy(480, 700) for x in range(10)] + [enemy.Enemyz(480, 700) for x in range(5)] + [enemy.Enemyd(480, 700) for x in range(2)]) global score score = 0 bomb = supplly.Bomb_subbly(480, 700) BOMBSUPPLYEVN = USEREVENT + 1 pygame.time.set_timer(BOMBSUPPLYEVN, 2 * 1000) buet = supplly.Buet_subbly(480, 700) BUETSUPPLYEVN = USEREVENT + 2 pygame.time.set_timer(BUETSUPPLYEVN, 5 * 1000) while True: screen.blit(bg, (0, 0)) screen.blit(pa, pa_rect) for event in pygame.event.get(): if event.type == QUIT: exit() elif event.type == BOMBSUPPLYEVN: bomb.active = True elif event.type == KEYDOWN: if event.key == K_SPACE: bomb.use(enemys_group) elif event.type == BUETSUPPLYEVN: buet.active = True elif pygame.mouse.get_pressed()[0]: nx, ny = pygame.mouse.get_pos() if pa_rect.collidepoint(nx, ny): pygame.display.flip() screen.blit(bg, (0, 0)) while True: for event in pygame.event.get(): if event.type == QUIT: exit() screen.blit(ru, ru_rect) pygame.display.flip() if pygame.mouse.get_pressed()[0]: n1x, n2y = pygame.mouse.get_pos() if ru_rect.collidepoint(n1x, n2y): break plane.move() plane.collide(enemys_group) plane.draw(screen) screen.blit(ff, (0, 480)) screen.blit(font.render("x" + str(plane.life_num), True, (0, 0, 0)), (50, 500)) if buet.flag == 0: if not delay % 12: bullet_list[bullet_index % 4].reset(plane.rect) bullet_index += 1 for b in bullet_list: b.move() b.collide(enemys_group) b.draw(screen) else: buet.flag -= 1 if not delay % 12: doubullet_list[doubullet_index % 4].reset(plane.rect) doubullet_index += 1 for k in doubullet_list: k.move() k.collide(enemys_group) k.draw(screen) if not delay % 12: doubullet1_list[doubullet1_index % 4].reset(plane.rect) doubullet1_index += 1 for j in doubullet1_list: j.move() j.collide(enemys_group) j.draw(screen) for e in enemys_group: e.move() e.draw(screen) if e.score: score += e.score e.score = 0 bomb.move() bomb.collide(plane) bomb.draw(screen) buet.move() buet.collide(plane) buet.draw(screen) screen.blit(bom, (350, 480)) screen.blit(font.render("x" + str(bomb.num), True, (0, 0, 0)), (420, 500)) screen.blit(font.render("Score:" + str(score), True, (0, 0, 0)), (0, 0)) if plane.life_num == 0: break delay += 1 clock.tick(50) pygame.display.flip()
def main(): # here we creat background background1 = background.Background(size) background2 = background.background(size) # here we creat myplane my_plane = pygame.sprite.Group() myplane1 = myplane.Myplane(size) my_plane.add(myplane1) # here we creat the enemy planes enemies = pygame.sprite.Group() enemy3 = pygame.sprite.Group() enemy2 = pygame.sprite.Group() boss = pygame.sprite.Group() e21 = enemy.Enemy2(size) e22 = enemy.Enemy2(size) e23 = enemy.Enemy2(size) e24 = enemy.Enemy2(size) e25 = enemy.Enemy2(size) boss1 = enemy.Enemy8(size) enemy2.add(e21) enemy2.add(e22) enemy2.add(e23) enemy2.add(e24) enemy2.add(e25) enemies.add(e21) enemies.add(e22) enemies.add(e23) enemies.add(e24) enemies.add(e25) boss.add(boss1) e3 = enemy.Enemy3(size) enemy3.add(e3) enemy1 = pygame.sprite.Group() add_enemy1(enemy1, enemies, 3) enemy4 = pygame.sprite.Group() add_enemy4(enemy4, enemies, 2) enemy5 = pygame.sprite.Group() enemy6 = pygame.sprite.Group() enemy7 = pygame.sprite.Group() add_enemy7(enemy7, enemies, 1) # here we creat the bullets bullet1 = [] bullet1_index = 0 bullet1_number = 80 for i in range(bullet1_number // 2): bullet1.append( bullet.Bullet1( (myplane1.rect.centerx - 13, myplane1.rect.centery))) bullet1.append( bullet.Bullet1( (myplane1.rect.centerx + 13, myplane1.rect.centery))) # here we creat the super bullet bullet2 = [] bullet2_index = 0 bullet2_number = 80 for i in range(bullet2_number // 2): bullet2.append( bullet.Bullet2( (myplane1.rect.centerx - 13, myplane1.rect.centery))) bullet2.append( bullet.Bullet2( (myplane1.rect.centerx + 13, myplane1.rect.centery))) # here we creat the super bullet bullet3 = [] bullet3_index = 0 bullet3_number = 40 for i in range(bullet3_number): bullet3.append( bullet.Bullet3( (myplane1.rect.centerx - 23, myplane1.rect.centery))) # here we creat the super bullet bullet4 = [] bullet4_index = 0 bullet4_number = 40 for i in range(bullet4_number): bullet4.append( bullet.Bullet4( (myplane1.rect.centerx + 23, myplane1.rect.centery))) bullet6 = [] bullet6_index = 0 bullet6_number = 5000 for i in range(bullet6_number // 5): bullet6.append( bullet.Bullet6((boss1.rect.centerx - 300, boss1.rect.centery))) bullet6.append( bullet.Bullet6((boss1.rect.centerx - 100, boss1.rect.centery))) bullet6.append( bullet.Bullet6((boss1.rect.centerx + 100, boss1.rect.centery))) bullet6.append( bullet.Bullet6((boss1.rect.centerx + 300, boss1.rect.centery))) # here we creat the enemy bullet bullet5 = bullet.Bullet5(size) b5 = pygame.sprite.Group() b5.add(bullet5) bullet51 = bullet.Bullet6(size) b51 = pygame.sprite.Group() b51.add(bullet51) bullet52 = bullet.Bullet6(size) b52 = pygame.sprite.Group() b52.add(bullet52) bullet53 = bullet.Bullet6(size) b53 = pygame.sprite.Group() b53.add(bullet53) bullet54 = bullet.Bullet6(size) b54 = pygame.sprite.Group() b54.add(bullet54) bullet55 = bullet.Bullet6(size) b55 = pygame.sprite.Group() b55.add(bullet55) # the index of plane when it is destoried e1_destroy_index = 0 e2_destroy_index = 0 en3_destroy_index = 0 e4_destroy_index = 0 e5_destroy_index = 0 e6_destroy_index = 0 e7_destroy_index = 0 myplane1_destroy_index = 0 boss_destroy_index = 0 # here we add the score to the game score = 0 score_font = pygame.font.Font("font/font.ttf.ttf", 36) #here we set the stop condtion to the game paused = False pause_nor_image = pygame.image.load("images/22.png").convert_alpha() pause_pressed_image = pygame.image.load("images/23.png").convert_alpha() resume_nor_image = pygame.image.load("images/21.png").convert_alpha() resume_pressed_image = pygame.image.load("images/24.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 # here we set the difficulty of the game level = 1 # here we set the bomb skills bomb_image = pygame.image.load("images/25.png").convert_alpha() bomb_rect = bomb_image.get_rect() bomb_font = pygame.font.Font("font/font.ttf.ttf", 48) bomb_num = 3 # here we set record time recorded = False # here we set the ending picture gameover_font = pygame.font.Font("font/font.ttf.ttf", 48) again_image = pygame.image.load("images/29.png").convert_alpha() again_rect = again_image.get_rect() gameover_image = pygame.image.load("images/30.png").convert_alpha() gameover_rect = gameover_image.get_rect() # here we set the supply bullet_supply = supply.Bullet_supply(size) bomb_supply = supply.Bomb_supply(size) supply_time = USEREVENT pygame.time.set_timer(supply_time, 15 * 1000) # here we set the timing of super bullet super_bullet_time = USEREVENT + 1 # here we add the timing of myplane's invincibe invincible_time = USEREVENT + 2 # here we set condition of the super bullet is_super_bullet = False # here we set the lives of my planes life_image = pygame.image.load("images/28.png").convert_alpha() life_rect = life_image.get_rect() life_num = 3 # here we set the delay to make the picture change smoothly delay = 120 # here we set the state of running to check if we need to end the game running = True clock = pygame.time.Clock() # here we start the game while running: print(delay) for event in pygame.event.get(): # here we quit the game and exit the system 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) else: pygame.time.set_timer(supply_time, 15 * 1000) 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 # here we set the function of the bomb elif event.type == KEYDOWN: if event.key == K_SPACE: if bomb_num: bomb_num -= 1 for each in enemies: if each.rect.bottom > 0: each.active = False if level == 7: boss1.energy -= 100 if boss1.energy < 0: boss1.active = False # here we set the supply type elif event.type == supply_time: if choice([True, False]): bomb_supply.reset() else: bullet_supply.reset() elif event.type == super_bullet_time: is_super_bullet = False pygame.time.set_timer(super_bullet_time, 0) elif event.type == invincible_time: myplane1.invincible = False pygame.time.set_timer(invincible_time, 0) # here we change the levels if level == 1 and score > 100: level = 2 # add more enemy planes to increase the difficulty level add_enemy1(enemy1, enemies, 1) add_enemy4(enemy4, enemies, 1) # increase the speed of the small enemy plane inc_speed(enemy1, 1) elif level == 2 and score > 300: level = 3 # add more enemy planes to increase the difficulty level add_enemy1(enemy1, enemies, 1) add_enemy4(enemy4, enemies, 1) add_enemy5(enemy5, enemies, 1) add_enemy6(enemy6, enemies, 1) # increase the speed of the small enemy plane inc_speed(enemy1, 1) elif level == 3 and score > 800: level = 4 # add more enemy planes to increase the difficulty level add_enemy1(enemy1, enemies, 1) add_enemy5(enemy5, enemies, 1) add_enemy6(enemy6, enemies, 1) # increase the speed of the small enemy plane elif level == 4 and score > 1500: level = 5 # add more enemy planes to increase the difficulty level add_enemy1(enemy1, enemies, 1) add_enemy4(enemy4, enemies, 1) # increase the speed of the small enemy plane inc_speed(enemy4, 1) elif level == 5 and score > 2500: level = 6 # add more enemy planes to increase the difficulty level add_enemy1(enemy1, enemies, 2) add_enemy4(enemy4, enemies, 1) add_enemy5(enemy5, enemies, 1) add_enemy6(enemy6, enemies, 1) # increase the speed of the small enemy plane inc_speed(enemy1, 1) elif level == 6 and score > 4000: score = 4000 level = 7 # delete all the enemy planes e3.active = False e3.reset() for each in enemies: each.active = False each.reset() boss1.active = True if score == 4000: score += 100 delay = 120 # here we draw the background picture if background1.active: background1.move() screen.blit(background1.image, background1.rect) if background2.active: background2.move() screen.blit(background2.image, background2.rect) if life_num and not paused: # here we check the keyboard of user key_pressed = pygame.key.get_pressed() if key_pressed[K_w]: myplane1.moveUp() if key_pressed[K_s]: myplane1.moveDown() if key_pressed[K_a]: myplane1.moveLeft() if key_pressed[K_d]: myplane1.moveRight() # here we draw the bomb and indicate if the player get it if bomb_supply.active: bomb_supply.move() screen.blit(bomb_supply.image, bomb_supply.rect) if pygame.sprite.collide_mask(bomb_supply, myplane1): if bomb_num < 3: bomb_num += 1 bomb_supply.active = False # here we draw the bullet supply and indicate if the player get it if bullet_supply.active: bullet_supply.move() screen.blit(bullet_supply.image, bullet_supply.rect) if pygame.sprite.collide_mask(bullet_supply, myplane1): # creat and shoot the super bullet is_super_bullet = True pygame.time.set_timer(super_bullet_time, 8 * 1000) bullet_supply.active = False # here we check that if the user's plane is touched by the enemies and their bullets enemies_down = pygame.sprite.spritecollide( myplane1, enemies, False, pygame.sprite.collide_mask) enemy3_down = pygame.sprite.spritecollide( myplane1, enemy3, False, pygame.sprite.collide_mask) enemy2_down = pygame.sprite.spritecollide( myplane1, enemy2, False, pygame.sprite.collide_mask) b5_down = pygame.sprite.spritecollide(myplane1, b5, False, pygame.sprite.collide_mask) b51_down = pygame.sprite.spritecollide(myplane1, b51, False, pygame.sprite.collide_mask) b52_down = pygame.sprite.spritecollide(myplane1, b52, False, pygame.sprite.collide_mask) b53_down = pygame.sprite.spritecollide(myplane1, b53, False, pygame.sprite.collide_mask) b54_down = pygame.sprite.spritecollide(myplane1, b54, False, pygame.sprite.collide_mask) b55_down = pygame.sprite.spritecollide(myplane1, b55, False, pygame.sprite.collide_mask) if enemies_down and not myplane1.invincible: myplane1.invincible = True pygame.time.set_timer(invincible_time, 1 * 1000) myplane1.energy -= 1 if myplane1.energy == 0: myplane1.active = False for e in enemies_down: e.active = False if enemy3_down and not myplane1.invincible: myplane1.invincible = True pygame.time.set_timer(invincible_time, 1 * 1000) myplane1.energy -= 1 if myplane1.energy == 0: myplane1.active = False e3.active = False if enemy2_down and not myplane1.invincible: myplane1.invincible = True pygame.time.set_timer(invincible_time, 1 * 1000) myplane1.energy -= 1 if myplane1.energy == 0: myplane1.active = False for m in enemy2_down: m.active = False if b5_down and not myplane1.invincible: myplane1.energy -= 1 if myplane1.energy == 0: myplane1.active = False bullet5.active = False bullet5.reset((e3.rect.centerx, e3.rect.bottom)) if b51_down and not myplane1.invincible: myplane1.energy -= 1 if myplane1.energy == 0: myplane1.active = False bullet51.active = False bullet51.reset((e21.rect.centerx, e21.rect.bottom)) if b52_down and not myplane1.invincible: myplane1.energy -= 1 if myplane1.energy == 0: myplane1.active = False bullet52.active = False bullet52.reset((e22.rect.centerx, e22.rect.bottom)) if b53_down and not myplane1.invincible: myplane1.energy -= 1 if myplane1.energy == 0: myplane1.active = False bullet53.active = False bullet53.reset((e23.rect.centerx, e23.rect.bottom)) if b54_down and not myplane1.invincible: myplane1.energy -= 1 if myplane1.energy == 0: myplane1.active = False bullet54.active = False bullet54.reset((e24.rect.centerx, e24.rect.bottom)) if b55_down and not myplane1.invincible: myplane1.energy -= 1 if myplane1.energy == 0: myplane1.active = False bullet55.active = False bullet55.reset((e25.rect.centerx, e25.rect.bottom)) # here we draw the user's plane if myplane1.active: screen.blit(myplane1.image, myplane1.rect) # here we draw the total blood of my plane pygame.draw.line(screen, BLACK, \ (myplane1.rect.left, myplane1.rect.bottom + 5),\ (myplane1.rect.right, myplane1.rect.bottom + 5),\ 2) # when the energy is bigger than 20%, it will be green. else, it will be red energy_remain1 = myplane1.energy / myplane.Myplane.energy if energy_remain1 > 0.5: energy_color = GREEN else: energy_color = RED pygame.draw.line(screen, energy_color,\ (myplane1.rect.left, myplane1.rect.bottom + 5),\ (myplane1.rect.left + myplane1.rect.width * energy_remain1,\ myplane1.rect.bottom + 5), 2) else: if not (delay % 3): # here we draw the destory pictures of the plane screen.blit( myplane1.destroy_images[myplane1_destroy_index], myplane1.rect) myplane1_destroy_index = (myplane1_destroy_index + 1) % 4 if myplane1_destroy_index == 0: life_num -= 1 myplane1.reset() pygame.time.set_timer(invincible_time, 3 * 1000) # here we check the condition of the enemy3 if boss1.active: boss1.move() screen.blit(boss1.image, boss1.rect) # here we draw the total blood of the enemy plane pygame.draw.line(screen, BLACK, \ (boss1.rect.left, boss1.rect.bottom - 50),\ (boss1.rect.right, boss1.rect.bottom - 50),\ 2) # when the energy is bigger than 20%, it will be green. else, it will be red energy_remain2 = boss1.energy / enemy.Enemy8.energy if energy_remain2 > 0.30: energy_color = GREEN else: energy_color = RED pygame.draw.line(screen, energy_color,\ (boss1.rect.left, boss1.rect.bottom - 50),\ (boss1.rect.left + boss1.rect.width * energy_remain2,\ boss1.rect.bottom - 50), 2) else: if level == 7: if not (delay % 3): # here we draw the destory pictures of the plane screen.blit(boss1.destroy_images[boss_destroy_index], boss1.rect) boss_destroy_index = (boss_destroy_index + 1) % 4 if boss_destroy_index == 0: score += 10000 life_num -= life_num boss1.reset() # here we draw the enemy bullet if bullet5.active: screen.blit(bullet5.image, bullet5.rect) bullet5.move() if bullet5.rect.centerx > myplane1.rect.centerx and bullet5.rect.top < myplane1.rect.top: bullet5.rect.left -= 2 if bullet5.rect.centerx < myplane1.rect.centerx and bullet5.rect.top < myplane1.rect.top: bullet5.rect.left += 2 else: if not level == 7: if e3.rect.top > 0 and e3.rect.top < 800: bullet5.reset((e3.rect.centerx, e3.rect.bottom)) if bullet51.active: screen.blit(bullet51.image, bullet51.rect) bullet51.move() else: if not level == 7: if e21.rect.top > 0 and e21.rect.top < 800: bullet51.reset((e21.rect.centerx, e21.rect.bottom)) if bullet52.active: screen.blit(bullet52.image, bullet52.rect) bullet52.move() else: if not level == 7: if e22.rect.top > 0 and e22.rect.top < 800: bullet52.reset((e22.rect.centerx, e22.rect.bottom)) if bullet53.active: screen.blit(bullet53.image, bullet53.rect) bullet53.move() else: if not level == 7: if e23.rect.top > 0 and e23.rect.top < 800: bullet53.reset((e23.rect.centerx, e23.rect.bottom)) if bullet54.active: screen.blit(bullet54.image, bullet54.rect) bullet54.move() else: if not level == 7: if e24.rect.top > 0 and e24.rect.top < 800: bullet54.reset((e24.rect.centerx, e24.rect.bottom)) if bullet55.active: screen.blit(bullet55.image, bullet55.rect) bullet55.move() else: if not level == 7: if e25.rect.top > 0 and e25.rect.top < 800: bullet55.reset((e25.rect.centerx, e25.rect.bottom)) # here we shot the bullets if not (delay % 10): if is_super_bullet: bullets = bullet2 bullets[bullet2_index].reset( (myplane1.rect.centerx - 13, myplane1.rect.centery)) bullets[bullet2_index + 1].reset( (myplane1.rect.centerx + 13, myplane1.rect.centery)) bullet3[bullet3_index].reset( (myplane1.rect.centerx + 23, myplane1.rect.centery)) bullet4[bullet4_index].reset( (myplane1.rect.centerx - 23, myplane1.rect.centery)) bullet2_index = (bullet2_index + 2) % bullet2_number bullet3_index = (bullet3_index + 1) % bullet3_number bullet4_index = (bullet4_index + 1) % bullet4_number else: bullets = bullet1 bullets[bullet1_index].reset( (myplane1.rect.centerx - 13, myplane1.rect.centery)) bullets[bullet1_index + 1].reset( (myplane1.rect.centerx + 13, myplane1.rect.centery)) bullet1_index = (bullet1_index + 2) % bullet1_number # here we draw the boss bullet if boss1.active: if not (delay % 40): bossbullets = bullet6 bossbullets[bullet6_index].reset( (boss1.rect.centerx - 300, boss1.rect.centery)) bossbullets[bullet6_index + 1].reset( (boss1.rect.centerx - 100, boss1.rect.centery)) bossbullets[bullet6_index + 2].reset( (boss1.rect.centerx + 100, boss1.rect.centery)) bossbullets[bullet6_index + 3].reset( (boss1.rect.centerx + 300, boss1.rect.centery)) bullet6_index = (bullet6_index + 4) % bullet6_number # here we check if the bullet collides witg the plane if level == 7 and boss1.active: for v in bossbullets: if v.active: if energy_remain2 >= 0.9: v.move() if energy_remain2 >= 0.8 and energy_remain2 < 0.9: v.move() v.move1() if energy_remain2 >= 0.7 and energy_remain2 < 0.8: v.move() v.move3() if energy_remain2 >= 0.6 and energy_remain2 < 0.7: v.move() v.move2() if energy_remain2 >= 0.5 and energy_remain2 < 0.6: v.move() v.move3() if energy_remain2 >= 0.4 and energy_remain2 < 0.5: v.move() v.rect.top += 1 v.move1() if energy_remain2 >= 0.3 and energy_remain2 < 0.4: v.move() v.rect.top += 2 v.move2() if energy_remain2 >= 0.2 and energy_remain2 < 0.3: v.move() if energy_remain2 < 0.2: v.move() if v.rect.centerx > myplane1.rect.centerx and v.rect.top < myplane1.rect.top: v.rect.left -= 2 if v.rect.centerx < myplane1.rect.centerx and v.rect.top < myplane1.rect.top: v.rect.left += 2 screen.blit(v.image, v.rect) bossbullet_down = pygame.sprite.spritecollide( v, my_plane, False, pygame.sprite.collide_mask) if bossbullet_down and not myplane1.invincible: myplane1.energy -= 1 if myplane1.energy == 0: myplane1.active = False v.active = False # here we check if the bullet collides with the enemy plane 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) enemy3_hit = pygame.sprite.spritecollide( b, enemy3, False, pygame.sprite.collide_mask) enemy2_hit = pygame.sprite.spritecollide( b, enemy2, False, pygame.sprite.collide_mask) boss_hit = pygame.sprite.spritecollide( b, boss, False, pygame.sprite.collide_mask) if enemy_hit: b.active = False for e in enemy_hit: # here we check which type of planes is attacked if e in enemy2: e.energy -= 1 if e.energy == 0: e.active = False else: e.active = False if enemy3_hit: b.active = False # here we check which type of planes is attacked e3.energy -= 1 if e3.energy == 0: e3.active = False if enemy2_hit: b.active = False for z in enemy2_hit: z.energy -= 1 if z.energy == 0: z.active = False if boss_hit: b.active = False boss1.energy -= 1 if boss1.energy == 0: boss1.active = False level == 8 for x in bullet3: if x.active: x.move1() x.move() screen.blit(x.image, x.rect) enemy_hit = pygame.sprite.spritecollide( x, enemies, False, pygame.sprite.collide_mask) enemy3_hit = pygame.sprite.spritecollide( x, enemy3, False, pygame.sprite.collide_mask) enemy2_hit = pygame.sprite.spritecollide( x, enemy2, False, pygame.sprite.collide_mask) boss_hit = pygame.sprite.spritecollide( x, boss, False, pygame.sprite.collide_mask) if enemy_hit: x.active = False for e in enemy_hit: # here we check which type of planes is attacked if e in enemy2: e.energy -= 1 if e.energy == 0: e.active = False else: e.active = False if enemy3_hit: x.active = False # here we check which type of planes is attacked e3.energy -= 1 if e3.energy == 0: e3.active = False if enemy2_hit: x.active = False for z in enemy2_hit: z.energy -= 1 if z.energy == 0: z.active = False if boss_hit: x.active = False boss1.energy -= 1 if boss1.energy == 0: boss1.active = False level == 8 for y in bullet4: if y.active: y.move1() y.move() screen.blit(y.image, y.rect) enemy_hit = pygame.sprite.spritecollide( y, enemies, False, pygame.sprite.collide_mask) enemy3_hit = pygame.sprite.spritecollide( y, enemy3, False, pygame.sprite.collide_mask) enemy2_hit = pygame.sprite.spritecollide( y, enemy2, False, pygame.sprite.collide_mask) boss_hit = pygame.sprite.spritecollide( y, boss, False, pygame.sprite.collide_mask) if enemy_hit: y.active = False for e in enemy_hit: # here we check which type of planes is attacked if e in enemy2: e.energy -= 1 if e.energy == 0: e.active = False else: e.active = False if enemy3_hit: y.active = False # here we check which type of planes is attacked e3.energy -= 1 if e3.energy == 0: e3.active = False if enemy2_hit: y.active = False for z in enemy2_hit: z.energy -= 1 if z.energy == 0: z.active = False if boss_hit: y.active = False boss1.energy -= 1 if boss1.energy == 0: boss1.active = False level == 8 # here we check the condition of the enemy3 if e3.active and not level == 7: e3.move() screen.blit(e3.image, e3.rect) # here we draw the total blood of the enemy plane pygame.draw.line(screen, BLACK, \ (e3.rect.left, e3.rect.top - 5),\ (e3.rect.right, e3.rect.top - 5),\ 2) # when the energy is bigger than 20%, it will be green. else, it will be red energy_remain = e3.energy / enemy.Enemy3.energy if energy_remain > 0.35: energy_color = GREEN else: energy_color = RED pygame.draw.line(screen, energy_color,\ (e3.rect.left, e3.rect.top - 5),\ (e3.rect.left + e3.rect.width * energy_remain,\ e3.rect.top - 5), 2) else: if not level == 7: if not (delay % 3): # here we draw the destory pictures of the plane screen.blit(e3.destroy_images[en3_destroy_index], e3.rect) en3_destroy_index = (en3_destroy_index + 1) % 4 if en3_destroy_index == 0: score += 1000 e3.reset() if e3.rect.top > 960 and not level == 7: e3.reset() for each in enemy2: if each.active and not level == 7: each.move() screen.blit(each.image, each.rect) # here we draw the total blood of the enemy plane pygame.draw.line(screen, BLACK, \ (each.rect.left, each.rect.top - 5),\ (each.rect.right, each.rect.top - 5),\ 2) # when the energy is bigger than 20%, it will be green. else, it will be red energy_remain = each.energy / enemy.Enemy2.energy if energy_remain > 0.35: 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 level == 7: if not (delay % 3): # here we draw the destory pictures of the plane screen.blit(each.destroy_images[e2_destroy_index], each.rect) e2_destroy_index = (e2_destroy_index + 1) % 4 if e2_destroy_index == 0: score += 500 each.reset() if each.rect.top > 960 and not level == 7: each.reset() for each in enemy1: if each.active and not level == 7: each.move() screen.blit(each.image, each.rect) else: if not level == 7: if not (delay % 3): # here we draw the destory pictures of the plane 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() for each in enemy4: if each.active and not level == 7: each.move() screen.blit(each.image, each.rect) else: if not level == 7: if not (delay % 3): # here we draw the destory pictures of the plane screen.blit(each.destroy_images[e4_destroy_index], each.rect) e4_destroy_index = (e4_destroy_index + 1) % 4 if e4_destroy_index == 0: score += 100 each.reset() for each in enemy5: if each.active and not level == 7: each.move() screen.blit(each.image, each.rect) else: if not level == 7: if not (delay % 3): # here we draw the destory pictures of the plane screen.blit(each.destroy_images[e5_destroy_index], each.rect) e5_destroy_index = (e5_destroy_index + 1) % 4 if e5_destroy_index == 0: score += 100 each.reset() for each in enemy6: if each.active and not level == 7: each.move() screen.blit(each.image, each.rect) else: if not level == 7: if not (delay % 3): # here we draw the destory pictures of the plane screen.blit(each.destroy_images[e6_destroy_index], each.rect) e6_destroy_index = (e6_destroy_index + 1) % 4 if e6_destroy_index == 0: score += 100 each.reset() for each in enemy7: if each.active and not level == 7: each.move() screen.blit(each.image, each.rect) else: if not level == 7: if not (delay % 3): # here we draw the destory pictures of the plane screen.blit(each.destroy_images[e7_destroy_index], each.rect) e7_destroy_index = (e7_destroy_index + 1) % 4 if e7_destroy_index == 0: score += 100 each.reset() # here we draw the score score_text = score_font.render("Score : %s" % str(score), True, BLACK) screen.blit(score_text, (10, 5)) # here we creat the ending elif life_num == 0: # here we stop dropping the support pygame.time.set_timer(supply_time, 0) if not recorded: recorded = True # here we read the highest record with open("record.txt.txt", "r") as f: record_score = int(f.read()) # here we change the highest record if score > record_score: with open("record.txt.txt", "w") as f: f.write(str(score)) # here we draw the ending picture record_score_text = score_font.render( "Best was : %d" % record_score, True, BLACK) screen.blit(record_score_text, (50, 50)) gameover_text1 = gameover_font.render("Your Score", True, BLACK) 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, BLACK) 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) # here we set the mouse # if the player click left mouse if pygame.mouse.get_pressed()[0]: # here we get the coordination of the mouse pos = pygame.mouse.get_pos() # if the player click restart if again_rect.left < pos[0] < again_rect.right and \ again_rect.top < pos[1] < again_rect.bottom: main() # if the player click exit elif gameover_rect.left < pos[0] < gameover_rect.right and \ gameover_rect.top < pos[1] < gameover_rect.bottom: pygame.quit() sys.exit() # here we draw the bomb bomb_text = bomb_font.render("x %d" % bomb_num, True, BLACK) 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)) # here we draw the number of lives of myplane if life_num: for i in range(life_num): screen.blit(life_image, \ (width-(i+1)*life_rect.width+30, \ height-life_rect.height+35)) # here we draw the pause and continue picture screen.blit(paused_image, paused_rect) # here we change the value of delay delay -= 1 if not delay: delay = 120 pygame.display.flip() clock.tick(60)
def main(): pygame.mixer.music.play(-1) clock = pygame.time.Clock() e1_destory_index = 0 e2_destory_index = 0 e3_destory_index = 0 me_destory_index = 0 delay = 100 running = True me = myplane.Myplane(bg_size) #游戏暂停 paused = False paused_nor_image = pygame.image.load("image/paused_nor.png") paused_pressed_image = pygame.image.load("image/paused_pressed.png") resume_nor_image = pygame.image.load("image/resume_nor.png") resume_pressed_image = pygame.image.load("image/resume_pressed.png") paused_rect = paused_nor_image.get_rect() paused_rect.left, paused_rect.top = bg_size[0] - paused_rect.width - 10, 10 #默认显示这个 paused_image = paused_nor_image #分数字体 score = 0 score_font = pygame.font.Font("font/font.TTF", 36) enemies = pygame.sprite.Group() #生成敌方小型飞机 small_enemies = pygame.sprite.Group() add_small_enemies(small_enemies, enemies, 20) #生成敌方中型飞机 mid_enemies = pygame.sprite.Group() add_mid_enemies(mid_enemies, enemies, 8) #生成敌方大型飞机 big_enemies = pygame.sprite.Group() add_big_enemies(big_enemies, enemies, 4) #生成子弹 bullet1 = [] bullet1_index = 0 BULLET1_NUM = 4 for i in range(BULLET1_NUM): bullet1.append(bullet.Bullet1(me.rect.midtop)) #用于阻止重复打开记录文件 recorded = False game_over_font = pygame.font.Font("font/font.TTF", 48) again_image = pygame.image.load("image/again.png").convert_alpha() again_rect = again_image.get_rect() gameover_image = pygame.image.load("image/gameover.png").convert_alpha() gameover_rect = gameover_image.get_rect() 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 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 if not paused: screen.blit(background, (0, 0)) #绘制得分 #大,中,小 飞机毁灭时分别得到 10000,6000,1000 分 score_text = score_font.render("Score:%s" % str(score), True, WHITE) screen.blit(score_text, (10, 5)) if not (delay % 10): bullet1[bullet1_index].reset(me.rect.midtop) bullet1_index = (bullet1_index + 1) % BULLET1_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() #绘制我方飞机#screen.blit(me.image, me.rect) if me.active: screen.blit(me.image, me.rect) else: #毁灭 me_down_sound.play() if not (delay % 3): screen.blit(me.destory_images[me_destory_index], me.rect) me_destory_index = (me_destory_index + 1) % 4 if me_destory_index == 0: print("GAME OVER!") # # # # # # ### running = False ################################################################## #绘制子弹 # # # # # # ### for b in bullet1: if b.active: b.move() screen.blit(b.image, b.rect) enemy_hit = pygame.sprite.spritecollide( b, enemies, False, pygame.sprite.collide_mask) #if b.rect.top < 0: # b.reset(me.rect.midtop) 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 score += 1000 ################################################################################# #绘制小型敌机 for each in small_enemies: if each.active: each.move() screen.blit(each.image, each.rect) else: #毁灭 if not (delay % 3): if e1_destory_index == 1: enemy1_down_sound.play() # print("e1down",each.rect) screen.blit(each.destory_images[e1_destory_index], each.rect) e1_destory_index = (e1_destory_index + 1) % 4 if e1_destory_index == 1: enemy1_down_sound.stop() # print("e1stop",each.rect) each.reset() #绘制中型飞机 for each in mid_enemies: if each.active: each.move() screen.blit(each.image, each.rect) else: #毁灭 if not (delay % 3): if e2_destory_index == 0: enemy2_down_sound.play() screen.blit(each.destory_images[e1_destory_index], each.rect) e2_destory_index = (e1_destory_index + 1) % 4 if e2_destory_index == 0: enemy2_down_sound.stop() each.reset() score += 6000 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) #绘制大型飞机 for each in big_enemies: if each.active: each.move() screen.blit(each.image, each.rect) #即将出现在画面中,播放音效 if each.rect.bottom >= -50: enemy3_fly_sound.play(-1) else: #毁灭 if not (delay % 3): 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: enemy3_down_sound.stop() each.reset() score += 10000 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) #检测我方飞机是否被碰撞 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 #绘制暂停图标 screen.blit(paused_image, paused_rect) #screen.blit(background,(0,0)) if not running: #背景音乐停止 pygame.mixer.music.stop() #停止全部音效 pygame.mixer.stop() if not recorded: recorded = True #读取历史最高分 with open("record/recorded.txt", 'r') as f: record_score = int(f.read()) #如果分数超记录则覆盖录入最高分数 if score > record_score: with open("record/recorded.txt", 'w') as f: f.write(str(score)) #绘制结束画面 record_score_text = score_font.render("Best: %d" % record_score, True, (255, 255, 255)) screen.blit(background, (0, 0)) screen.blit(record_score_text, (50, 50)) gameover_text1 = game_over_font.render("Your Score", True, (255, 255, 255)) gameover_text1_rect = gameover_text1.get_rect() gameover_text1_rect.left, gameover_text1_rect.top = ( bg_size[0] - gameover_text1_rect.width) // 2, bg_size[1] // 3 screen.blit(gameover_text1, gameover_text1_rect) gameover_text2 = game_over_font.render(str(score), True, (255, 255, 255)) gameover_text2_rect = gameover_text2.get_rect() gameover_text2_rect.left, gameover_text2_rect.top = ( bg_size[0] - gameover_text2_rect.width ) // 2, gameover_text1_rect.bottom + 10 screen.blit(gameover_text2, gameover_text2_rect) again_rect.left, again_rect.top = ( bg_size[0] - again_rect.width) // 2, gameover_text2_rect.bottom + 50 screen.blit(again_image, again_rect) gameover_rect.left, gameover_rect.top = ( bg_size[0] - gameover_rect.width) // 2, again_rect.bottom + 10 screen.blit(gameover_image, gameover_rect) pygame.display.flip() while True: #检测用户鼠标操作 #如果按下鼠标左键 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() pygame.display.flip() delay += 1 clock.tick(60)
def main(): pygame.mixer.music.play(-1) #生成我方飞机 me = myplane.Myplane(bg_size) #切换我方飞机图片 switch_image = True #生成敌方飞机 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 BULLEFT1_NUM = 4 for i in range(BULLEFT1_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 - 30))) bullet2.append( bullet.Bullet2((me.rect.centerx + 33, me.rect.centery - 30))) #中弹图片索引 e1_destroy_index = 0 e2_destroy_index = 0 e3_destroy_index = 0 me_destroy_index = 0 #统计分数 score = 0 score_front = 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 #游戏结束画面 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', 40) 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 * 100) #超级子弹定时器 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 #用于延迟 delay = 100 clock = pygame.time.Clock() running = True 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 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 > 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 > 100000: 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_preesd = pygame.key.get_pressed() if key_preesd[K_w] or key_preesd[K_UP]: me.moveUp() if key_preesd[K_s] or key_preesd[K_DOWN]: me.moveDown() if key_preesd[K_a] or key_preesd[K_LEFT]: me.moveLeft() if key_preesd[K_d] or key_preesd[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 #h绘制超级子弹并检测是否获得 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 + 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) % BULLEFT1_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_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) e.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('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)) # 绘制得分 score_text = score_front.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_front.render( 'Best : %s ' % str(record_score), True, WHITE) screen.blit(record_score_text, (50, 50)) gameover_text = score_front.render('Your Score: %s ' % 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, height // 2 screen.blit(gameover_text, (gameover_text_rect.left, gameover_text_rect.top)) again_rect.left, again_rect.top = ( width - again_rect.width) // 2, gameover_text_rect.bottom + 50 screen.blit(again_image, (again_rect.left, again_rect.top)) gameover_rect.left, gameover_rect.top = ( width - gameover_rect.width) // 2, again_rect.bottom + 10 screen.blit(gameover_image, (gameover_rect.left, gameover_rect.top)) #检测用户点击操作 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 = 4 for i in range(BULLET1_NUM): bullet1.append(bullet.Bullet1()) #生成超级子弹 bullet2 = [] bullet2_index = 0 BULLET2_NUM = 8 for i in range(BULLET2_NUM): bullet2.append(bullet.Bullet2()) 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 #无敌时间定时器 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 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 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() #增加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 #发射子弹 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 + 31, 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.energy -= 1 e.hit = True 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) #当生命值大于30%显示绿色,否则显示红色 energy_remain = each.energy / enemy.BigEnemy.energy if energy_remain > 0.3: 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 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) #当生命值大于40%显示绿色,否则显示红色 energy_remain = each.energy / enemy.MidEnemy.energy if energy_remain > 0.4: 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() #被打死了回炉重造233 #绘制小型敌机 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() #被打死了回炉重造233 #检测我方飞机是否被撞 enemies_down = pygame.sprite.spritecollide( me, enemies, False, pygame.sprite.collide_mask) if enemies_down: if 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) #切换图片增加动效 if not (delay % 5): switch_image = not switch_image delay -= 1 if not delay: delay = 100 #绘制全屏炸弹数量 bomb_text = bomb_font.render('x %d' % bomb_num, True, WHITE) text_rect = bomb_text.get_rect() screen.blit(bomb_image, (10, height - bomb_rect.height - 10)) screen.blit(bomb_text, (20 + bomb_rect.width, height - 5 - text_rect.height)) #绘制剩余生命数量 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('recorder.txt', 'r') as f: record_score = int(f.read()) f.close() #如果玩家得分高于最高分,则存档 if score > record_score: f = open('recorder.txt', 'w') f.write(str(score)) f.close() #绘制结束界面 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.collidepoint(pos): # 调用main函数,重新开始游戏 main() # 如果用户点击“结束游戏” elif gameover_rect.collidepoint(pos): # 退出游戏 pygame.quit() sys.exit() #绘制暂停按钮 screen.blit(paused_image, paused_rect) pygame.display.flip() clock.tick(60)
def main(): #生成飞机 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 BULLET_NUM=4 for i in range(BULLET_NUM): bullet1.append(bullet.Bullet1(me.rect.midtop)) #中弹图片索引 e1_destroy_index=0 e2_destroy_index=0 e3_destroy_index=0 me_destroy_index=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 #全屏炸弹 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 clock=pygame.time.Clock() Delay=100 switch_image = True score=0 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 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 for each in enemies: if each.rect.bottom>0: each.active=False score_font=pygame.font.Font('font/font.ttf',36) 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 not(Delay%10): bullet1[bullet1_index].reset(me.rect.midtop) bullet1_index=(bullet1_index+1)%BULLET_NUM #检测是否击中敌机 for b in bullet1: 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() 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.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: #毁灭 while e3_destroy_index < 4: screen.blit(each.destroy_images[e3_destroy_index],each.rect) e3_destroy_index+=1 score+=10000 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) 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: #毁灭 while e2_destroy_index < 4: screen.blit(each.destroy_images[e2_destroy_index],each.rect) e2_destroy_index+=1 score+=6000 each.reset() for each in small_enemies: if each.active: each.move() screen.blit(each.image,each.rect) else: #毁灭 while e1_destroy_index < 4: screen.blit(each.destroy_images[e1_destroy_index],each.rect) e1_destroy_index+=1 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: screen.blit(me.image, me.rect) else: #毁灭 while me_destroy_index < 4: screen.blit(me.destroy_images[me_destroy_index],me.rect) me_destroy_index+=1 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) pygame.quit() sys.exit
def main(): pygame.mixer.music.play(-1) #生成mylpane me = myplane.Myplane(bg_size) enemies = pygame.sprite.Group() #smallenemy small_enemies = pygame.sprite.Group() add_small_enemies(small_enemies, enemies, 15) #游戏结束画面 gameover_font = pygame.font.Font('font/font_1.ttf', 48) gameover_fontx = pygame.font.Font('font/font_3.ttf', 28) #midenemy mid_enemies = pygame.sprite.Group() add_mid_enemies(mid_enemies, enemies, 5) #bigenemy big_enemies = pygame.sprite.Group() add_big_enemies(big_enemies, enemies, 2) #限制重复打开最高分记录文件 record_tag = 1 #定义子弹列表 bullet2 = [] bullet2_index = 0 BULLET2_NUM = 10 for i in range(BULLET2_NUM // 2): bullet2.append(bullet.Bullet2((me.rect.centerx - 28, me.rect.centery))) bullet2.append(bullet.Bullet2((me.rect.centerx + 25, me.rect.centery))) bullet1 = [] bullet1_index = 0 BULLET_NUM = 5 for i in range(BULLET_NUM): bullet1.append(bullet.Bullet1(me.rect.midtop)) #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) #玩家飞机刷新间隔 x = False #双发子弹定时器 DOUBLE_BULLET_TIME = USEREVENT + 1 INVINCIBLE = USEREVENT + 2 #标记是否使用双子弹 tag_double_bullet = False #生命数量 life_image = pygame.image.load('images/life.png').convert_alpha() life_rect = life_image.get_rect() life_num = 3 running = True board_image = pygame.image.load('images/board.png').convert_alpha() board_rect = board_image.get_rect() board_rect1 = board_rect board_rect2 = board_rect #暂停标志 pause = False button_pa_1 = pygame.image.load('images/button_pa-1.png').convert_alpha() button_pa_2 = pygame.image.load('images/button_pa-2.png').convert_alpha() button_co_1 = pygame.image.load('images/button_co-1.png').convert_alpha() button_co_2 = pygame.image.load('images/button_co-2.png').convert_alpha() pause_rect = button_pa_1.get_rect() pause_rect.left, pause_rect.top = width - pause_rect.width - 10, 10 pause_image = button_pa_1 #炸弹 bomb_image = pygame.image.load('images/bomb.png').convert_alpha() bomb_rect = bomb_image.get_rect() bomb_font = pygame.font.Font('font/font_1.ttf', 48) bomb_num = 3 clock = pygame.time.Clock() score = 0 score_font = pygame.font.Font('font/font_1.ttf', 36) #难度设置 level = 1 switch_image = True #中弹图片索引 e1_destroy_index = 0 e2_destroy_index = 0 e3_destroy_index = 0 me_destroy_index = 0 #延迟 delay = 100 while running: #screen.blit(background , (0 , 0)) bg1.map_update(screen) bg2.map_update(screen) bg1.map_rolling() bg2.map_rolling() if level == 1 and score > 2000: level = 2 up_level.play() add_small_enemies(small_enemies, enemies, 3) add_mid_enemies(mid_enemies, enemies, 2) add_big_enemies(big_enemies, enemies, 1) if level == 2 and score > 5000: level = 3 up_level.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) if level == 3 and score > 10000: level = 4 up_level.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) if level == 4 and score > 20000: level = 5 up_level.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) 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): if pause_image == button_co_2: pause_image = button_pa_2 else: pause_image = button_co_2 screen.blit(pause_image, pause_rect) pause = not pause if pause: 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 pause_rect.collidepoint(event.pos): if pause: pause_image = button_co_2 else: pause_image = button_pa_2 else: if pause: pause_image = button_co_1 else: pause_image = button_pa_1 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: tag_double_bullet = False pygame.time.set_timer(DOUBLE_BULLET_TIME, 0) elif event.type == INVINCIBLE: me.invincible = False pygame.time.set_timer(INVINCIBLE, 0) #画暂停符号 if life_num != 0: screen.blit(pause_image, pause_rect) if pause == False 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 < 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() tag_double_bullet = True pygame.time.set_timer(DOUBLE_BULLET_TIME, 20 * 1000) bullet_supply.active = False #bullet if not (delay % 10): bullet_sound.play() if tag_double_bullet: bullets = bullet2 bullets[bullet2_index].reset( (me.rect.centerx - 28, me.rect.centery)) bullets[bullet2_index + 1].reset( (me.rect.centerx + 25, 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) % BULLET_NUM #碰撞检测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.energy -= 1 e.hit = True 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 + 20 , each.rect.top - 5),\ (each.rect.right - 20 , 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 + 20 , each.rect.top - 5), \ (each.rect.left + 20 + (each.rect.width - 40) * energy_remain , \ each.rect.top - 5) , 2) #出场音效 if each.rect.bottom == -50: enemy3_fly_sound.play() 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 += 1500 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 + 20 , each.rect.top + 10),\ (each.rect.right - 20 , each.rect.top + 10),\ 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 + 20 , each.rect.top + 10), \ (each.rect.left + 20 + (each.rect.width - 40) * energy_remain , \ each.rect.top + 10) , 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 += 600 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 += 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 e in enemies_down: e.active = False #画我方飞机 if me.active: if me.invincible: if x: if switch_image: screen.blit(me.image1, me.rect) else: screen.blit(me.image2, me.rect) else: 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], 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, 3 * 1000) #画炸弹 bomb_str = bomb_font.render('× %d' % bomb_num, True, WHITE) str_rect = bomb_str.get_rect() screen.blit(bomb_image, (10, height - 10 - bomb_rect.height)) screen.blit(bomb_str, (20 + bomb_rect.width, height - 5 - str_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_str = score_font.render('Score : %s' % str(score), True, WHITE) screen.blit(score_str, (5, 5)) #没有生命的时候游戏结束 elif life_num == 0: #音乐停止 pygame.mixer.music.stop() pygame.mixer.stop() #停止发补给 pygame.time.set_timer(SUPPLY_TIME, 0) if record_tag == 1: #查看历史最高分 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 = score print(record_score) record_tag = 0 best_score_str = score_font.render( 'Best Score : %d' % record_score, True, WHITE) screen.blit(best_score_str, (5, 5)) best_score_text = gameover_font.render('Your Score', True, WHITE) best_score_text_rect = best_score_text.get_rect() best_score_text_rect.left = (width - best_score_text_rect.width) // 2 best_score_text_rect.top = (height - best_score_text_rect.height - 150) // 2 screen.blit(best_score_text, best_score_text_rect) best_score_vtext = gameover_font.render(str(score), True, WHITE) best_score_vtext_rect = best_score_vtext.get_rect() best_score_vtext_rect.left = (width - best_score_vtext_rect.width) // 2 best_score_vtext_rect.top = ( height - best_score_vtext_rect.height - 30) // 2 screen.blit(best_score_vtext, best_score_vtext_rect) board_rect1.left = (width - board_rect.width) // 2 board_rect1.top = (height - board_rect.height + 150) // 2 screen.blit(board_image, board_rect1) board_str1 = gameover_fontx.render('Start Again', True, BLACK) board_str1_rect = board_str1.get_rect() board_str1_rect.left = (width - board_rect.width) // 2 +\ board_rect.width // 2 - board_str1_rect.width // 2 board_str1_rect.top = (height - board_rect.height + 150) // 2 + 13 screen.blit(board_str1, board_str1_rect) board_rect2.left = (width - board_rect.width) // 2 board_rect2.top = (height - board_rect.height + 280) // 2 screen.blit(board_image, board_rect2) board_str2 = gameover_fontx.render('Quit Game', True, BLACK) board_str2_rect = board_str2.get_rect() board_str2_rect.left = (width - board_rect.width) // 2 +\ board_rect.width // 2 - board_str2_rect.width // 2 board_str2_rect.top = (height - board_rect.height + 280) // 2 + 13 screen.blit(board_str2, board_str2_rect) if pygame.mouse.get_pressed()[0]: pos = pygame.mouse.get_pos() #重新开始游戏 if board_rect1.right > pos[0] > board_rect1.left and \ 397 < pos[1] < 55 + 397: main() #结束游戏 elif board_rect2.right > pos[0] > board_rect2.left and \ 462 < pos[1] < 55 + 462: pygame.quit() sys.exit() pygame.display.flip() if not (delay % 5): switch_image = not switch_image if not (delay % 20): x = not x delay -= 1 if not delay: delay = 100 clock.tick(60)
def main(): # 播放背景音乐 无限循环 pygame.mixer.music.play(-1) # 暂停按钮 pause_rect = pause_nor_image.get_rect() pause_rect.right, pause_rect.top = (width - 10, 10) pause_image = pause_nor_image # 炸弹 bomb_rect = bomb_image.get_rect() bomb_rect.left, bomb_rect.bottom = (10, height - 10) bomb_num = 3 # 设置难度 level = 1 # 帧数设置 clock = pygame.time.Clock() # 血槽颜色 white = (255, 255, 255) green = (0, 255, 0) red = (255, 0, 0) black = (0, 0, 0) orange = (255, 165, 0) # 分数统计 score = 0 score_font = pygame.font.Font('font/font.ttf', 36) # 用于限制文件打开次数 recoded = False # 难度字体 level_font = pygame.font.Font('font/font.ttf', 18) # 炸弹字体 bomb_font = pygame.font.Font('font/font.ttf', 48) # 结束界面字体 record_font = pygame.font.Font('font/font.ttf', 36) end_score_font = pygame.font.Font('font/font.ttf', 56) running = True pause = False # 实例化我方飞机 me = myplane.Myplane(bg_size) # 命数 life_image = pygame.image.load('image/life.png') life_rect = life_image.get_rect() life_num = 3 # 载入补给 bullet_supply = supply.Bullet_Supply(bg_size) bomb_supply = supply.Bomb_Supply(bg_size) laser_supply = supply.Laser_Supply(bg_size) wave_supply = supply.Wave_Supply(bg_size) defend_supply = supply.Defend_Supply(bg_size) # 自定义补给时间 SUPPLY_TIME = USEREVENT # 剩余的下一个补给来的时间 during_time = random.randint(10, 30) * 1000 pygame.time.set_timer(SUPPLY_TIME, during_time) start_time = pygame.time.get_ticks() # 定义防护罩时间 DEFEND_TIME = USEREVENT + 3 # 防护罩闪烁计时 defend_num = 0 # 剩余的防护罩时间 defend_during_time = 10 * 1000 # 超级子弹定时器 # BULLET2_TIME = USEREVENT + 1 # 无敌时间计时器 INVINCIBLE_TIME = USEREVENT + 2 # 剩余的无敌的时间 invincible_during_time = 3 * 1000 # 标志是否使用子弹类型 bullet_type = 1 # 我方飞机毁灭动画索引 me_down_index = 0 # 实例化敌方飞机 enemies = pygame.sprite.Group() small_enemies = pygame.sprite.Group() add_small_enemys(small_enemies, enemies, 15) mid_enemies = pygame.sprite.Group() add_mid_enemys(mid_enemies, enemies, 8) big_enemies = pygame.sprite.Group() add_big_enemys(big_enemies, enemies, 5) boss = enemy.Boss(bg_size) # 载入背景 bg = background.Background1(bg_size) cloud = background.Cloud(bg_size) cloud_switch = False # 控制背景类型 bg_type = 0 # 实例化子弹 bullet1 = [] bullet1_index = 0 bullet1_num = 4 for i in range(bullet1_num): bullet1.append(bullet.Bullet1((0, 0))) # 实例化子弹2 bullet2 = [] bullet2_index = 0 bullet2_num = 8 for i in range(bullet2_num): bullet2.append(bullet.Bullet2((0, 0))) # 实例化子弹3 bullet3 = [] bullet3_index = 0 bullet3_num = 20 for i in range(bullet3_num): bullet3.append(bullet.Bullet3((0, 0))) # 实例化子弹4 bullet4 = [] bullet4_switch = 1 bullet4.append(bullet.Bullet4((0, 0))) # 实例化子弹5 bullet5 = [] bullet5.append(bullet.Bullet5((0, 0))) # 实例化冲击波 wave = bullet.Wave((0, 0)) wave_flage = False # 实例化防护罩 defend = bullet.Defend((0, 0)) # 实例化炸弹爆炸 bomb_fire = bullet.BombFire((0, 0)) # 实例化Boss子弹 boss_bullet = bullet.BossBullet((512, -500)) boss_bullettwo = [] boss_bullettwo_index = 0 boss_bullettwo_num = 4 boss_bullettwogroup = pygame.sprite.Group() for i in range(boss_bullettwo_num): boss_bullettwo.append(bullet.BossBulletTwo((0, 0))) for i in boss_bullettwo: boss_bullettwogroup.add(i) # Boss激光实例化 boss_laser = bullet.BossLaser((0, 0)) # 子弹放在一起 bullet_fire1 = [] bullet_fire1.extend(bullet1) bullet_fire1.extend(bullet2) bullet_fire1.extend(bullet3) bullet_fire2 = [] bullet_fire2.extend(bullet4) bullet_fire2.extend(bullet5) # 切换飞机的延迟 delay = 100 # 用于切换飞机 switch_image = True # 作弊开关 cheat = 0 # 程序启动 while running: # 暂停设置 mouse_left, mouse_top = pygame.mouse.get_pos() if pause_rect.collidepoint(mouse_left, mouse_top): if not pause: pause_image = pause_pressed_image else: pause_image = resume_pressed_image else: if not pause: pause_image = pause_nor_image else: pause_image = resume_nor_image for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() if event.type == MOUSEBUTTONDOWN: # 点击暂停 if event.button == 1 and pause_rect.collidepoint(event.pos): pause = not pause if pause: pause_time = pygame.time.get_ticks() # 刷新剩余时间 if defend.active: defend_during_time = defend_during_time - (pause_time - defend_start_time) if me.invincible and not defend.active: invincible_during_time = invincible_during_time - (pause_time - invincible_start_time) during_time = during_time - (pause_time-start_time) # 暂停补给计时器 pygame.time.set_timer(DEFEND_TIME, 0) pygame.time.set_timer(INVINCIBLE_TIME, 0) pygame.time.set_timer(SUPPLY_TIME, 0) pygame.mixer.music.pause() pygame.mixer.pause() else: pygame.time.set_timer(DEFEND_TIME, defend_during_time) pygame.time.set_timer(INVINCIBLE_TIME, invincible_during_time) pygame.time.set_timer(SUPPLY_TIME, during_time) defend_start_time = pygame.time.get_ticks() invincible_start_time = pygame.time.get_ticks() start_time = pygame.time.get_ticks() pygame.mixer.music.unpause() pygame.mixer.unpause() # 结束界面的选择 if life_num == 0: if event.button == 1 and again_rect.collidepoint(event.pos): main() elif event.button == 1 and gameover_rect.collidepoint(event.pos): pygame.quit() sys.exit() # 发射炸弹 if event.type == KEYDOWN and not pause: if event.key == K_SPACE and bomb_num: bomb_sound.play() bomb_num -= 1 bomb_fire.reset(me.rect.center) bomb_fire.active = True bomb_fire_pos = me.rect.center # 作弊 if cheat != 4: if event.key == K_r: cheat = 1 elif event.key == K_y and cheat == 1: cheat = 2 elif event.key == K_n and cheat == 2: cheat = 3 elif event.key == K_b and cheat == 3: cheat = 4 else: cheat = 0 # 补给 if event.type == SUPPLY_TIME: supply_sound.play() during_time = random.randint(10, 30) * 1000 pygame.time.set_timer(SUPPLY_TIME, during_time) start_time = pygame.time.get_ticks() if random.randint(0, 7-level) == 0: laser_supply.reset() else: supply_choice = random.choice([1, 2, 3, 4]) if supply_choice == 1: bullet_supply.reset() elif supply_choice == 2: bomb_supply.reset() elif supply_choice == 3: wave_supply.reset() elif supply_choice == 4: defend_supply.reset() # 无敌时间结束 if event.type == INVINCIBLE_TIME: pygame.time.set_timer(INVINCIBLE_TIME, 0) invincible_during_time = 3 * 1000 me.invincible = False # 防护罩时间结束 if event.type == DEFEND_TIME: pygame.time.set_timer(DEFEND_TIME, 0) defend_during_time = 10 * 1000 defend.active = False me.invincible = False defend_num = 0 # 绘制背景 if bg_type == 2: # 载入背景 bg = background.Background2(bg_size) bg_type = 0 if bg_type == 3: # 载入背景 bg = background.Background3(bg_size) bg_type = 0 if not pause and not delay % 2: bg.move() screen.blit(bg.background1, bg.background1_rect) screen.blit(bg.background2, bg.background2_rect) if (level == 3 or level == 5) and cloud_switch: if not pause: cloud.move() screen.blit(cloud.image, cloud.rect) if level == 3 and cloud.rect.centery == height // 2: bg_type = 2 if level == 5 and cloud.rect.centery == height // 2: bg_type = 3 if cloud.rect.bottom == 0: cloud_switch = False if life_num and not pause: # 检测键盘操作 key_pressed = pygame.key.get_pressed() if key_pressed[K_w] or key_pressed[KEYUP]: me.moveUp() if key_pressed[K_s] or key_pressed[KEYDOWN]: 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() # 绘制补给,并检测碰撞 # 弹2 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() if bullet_type == 2 or bullet_type == 3: bullet_type = 3 else: bullet_type = 2 bullet_supply.active = False # 激光 if laser_supply.active: laser_supply.move() screen.blit(laser_supply.image, laser_supply.rect) if pygame.sprite.collide_mask(me, laser_supply): get_bullet_sound.play() if bullet_type == 4 or bullet_type == 5: bullet_type = 5 else: bullet_type = 4 laser_supply.active = False # 炸弹 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 wave_supply.active: wave_supply.move() screen.blit(wave_supply.image, wave_supply.rect) if pygame.sprite.collide_mask(me, wave_supply): get_bomb_sound.play() wave_flage = True wave_supply.active = False # 防护罩 if defend_supply.active: defend_supply.move() screen.blit(defend_supply.image, defend_supply.rect) if pygame.sprite.collide_mask(me, defend_supply): get_bomb_sound.play() defend.active = True pygame.time.set_timer(DEFEND_TIME, defend_during_time) defend_start_time = pygame.time.get_ticks() defend_supply.active = False # 检测我方飞机是否被撞 if cheat != 4: enemies_down = pygame.sprite.spritecollide(me, enemies, False, pygame.sprite.collide_mask) # 返回碰撞的列表,以mask方法检测 if enemies_down and not me.invincible: me.active = False for each in enemies_down: each.active = False if pygame.sprite.collide_mask(me, boss): if not me.invincible: me.active = False if boss_bullet.active: if pygame.sprite.collide_mask(boss_bullet, me) and not me.invincible: me.active = False boss_bullet.active = False if pygame.sprite.spritecollide(me, boss_bullettwogroup, False, pygame.sprite.collide_mask) and not me.invincible: me.active = False if boss_laser.active: if pygame.sprite.collide_mask(boss_laser, me) and not me.invincible: me.active = False # 难度变化 if level == 1 and score >= 50000: level = 2 upgrade_sound.play() add_small_enemys(small_enemies, enemies, 5) add_mid_enemys(mid_enemies, enemies, 1) for each in small_enemies: each.speed += 1 elif level == 2 and score >= 100000: level = 3 cloud_switch = True upgrade_sound.play() add_small_enemys(small_enemies, enemies, 5) add_mid_enemys(mid_enemies, enemies, 3) add_big_enemys(big_enemies, enemies, 2) for each in small_enemies: each.speed += 1 for each in mid_enemies: each.speed += 1 elif level == 3 and score >= 150000: level = 4 upgrade_sound.play() add_small_enemys(small_enemies, enemies, 5) add_mid_enemys(mid_enemies, enemies, 3) add_big_enemys(big_enemies, enemies, 2) for each in small_enemies: each.speed += 1 for each in mid_enemies: each.speed += 1 for each in big_enemies: each.speed += 1 elif level == 4 and score >= 200000: level = 5 cloud_switch = True upgrade_sound.play() add_small_enemys(small_enemies, enemies, 5) add_mid_enemys(mid_enemies, enemies, 3) add_big_enemys(big_enemies, enemies, 2) for each in small_enemies: each.speed += 2 for each in mid_enemies: each.speed += 2 for each in big_enemies: each.speed += 1 elif level == 5 and score >= 270000: level = 6 score_time = pygame.time.get_ticks() boss.active = True for e in enemies: e.active = False # 绘制我方飞机 if me.active: if not me.invincible or defend.active: if not (delay % 5): switch_image = not switch_image if switch_image: screen.blit(me.image1, me.rect) else: screen.blit(me.image2, me.rect) elif me.invincible and defend.active == False: if not (delay % 3): if not (delay % 5): switch_image = not switch_image if switch_image: screen.blit(me.image1, me.rect) else: screen.blit(me.image2, me.rect) else: # 毁灭 if me_down_index == 0: me_down_sound.play() screen.blit(me.down_image[me_down_index], me.rect) if not delay % 5: me_down_index = (me_down_index + 1) % 4 if me_down_index == 0: if life_num > 0: life_num -= 1 me.reset() bullet_type = 1 bomb_num = 3 wave_flage = False # 无敌时间 me.invincible = True pygame.time.set_timer(INVINCIBLE_TIME, 3 * 1000) invincible_start_time = pygame.time.get_ticks() # 绘制子弹 if not (delay % 10): if bullet_type == 2: bullet2[bullet2_index].reset((me.rect.centerx - 38, me.rect.centery)) # 只有这里调用了子弹的reset bullet2[bullet2_index + 1].reset((me.rect.centerx + 26, me.rect.centery)) # 只有这里调用了子弹的reset bullet2_index = (bullet2_index + 2) % bullet2_num elif bullet_type == 3: bullet3[bullet3_index].reset((me.rect.centerx - 38, me.rect.centery)) # 只有这里调用了子弹的reset bullet3[bullet3_index + 1].reset((me.rect.centerx + 26, me.rect.centery)) # 只有这里调用了子弹的reset bullet3[bullet3_index + 2].reset(me.rect.midtop) # 只有这里调用了子弹的reset bullet3[bullet3_index + 3].reset((me.rect.centerx - 18, me.rect.centery)) # 只有这里调用了子弹的reset bullet3[bullet3_index + 4].reset((me.rect.centerx + 6, me.rect.centery)) # 只有这里调用了子弹的reset bullet3_index = (bullet3_index + 5) % bullet3_num elif bullet_type == 1: bullet1[bullet1_index].reset(me.rect.midtop) # 只有这里调用了子弹的reset bullet1_index = (bullet1_index + 1) % bullet1_num if bullet_type == 4: bullet4[0].reset(me.rect.midtop) # 只有这里调用了子弹的reset else: bullet4[0].active = False if bullet_type == 5: bullet5[0].reset(me.rect.midtop) # 只有这里调用了子弹的reset else: bullet5[0].active = False # 冲击波绘制 if not delay % 200: if wave_flage: wave.reset(me.rect.midtop) # 防护罩绘制 if defend.active: defend_num += 1 me.invincible = True defend.reset(me.rect.center) if defend_num < 420: screen.blit(defend.image, defend.rect) else: if not delay % 5: screen.blit(defend.image, defend.rect) # 检测防护罩是否被撞 enemies_down = pygame.sprite.spritecollide(defend, enemies, False, pygame.sprite.collide_mask) # 返回碰撞的列表,以mask方法检测 for each in enemies_down: each.active = False # 炸弹爆炸绘制 if bomb_fire.active: bomb_fire.move(bomb_fire_pos) screen.blit(bomb_fire.image, bomb_fire.rect) enemies_down = pygame.sprite.spritecollide(bomb_fire, enemies, False, pygame.sprite.collide_mask) for each in enemies_down: each.active = False # Boss与炸弹碰撞检测 if boss.active: if pygame.sprite.collide_mask(bomb_fire, boss) and boss.rect.top > 0: if not delay % 5: boss.hit = True boss.energy -= 30 if boss.energy <= 0: boss.active = False # Boss子弹绘制 if boss.active and not delay % 400: boss_bullet.reset(boss.rect.center) if boss.active and not delay % 50 and boss.energy <= 0.5 * enemy.Boss.energy: boss_bullettwo[boss_bullettwo_index].reset(boss.rect.midtop) boss_bullettwo_index = (boss_bullettwo_index + 1) % boss_bullettwo_num # 子弹移动 碰撞检测 # 子弹检测 for b in bullet_fire1: 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 # active = False并不会毁灭子弹,子弹只是不再显示,也不再检测碰撞, 不再移动 for e in enemy_hit: if e in small_enemies: e.active = False else: e.hit = True e.energy -= 1 if e.energy <= 0: e.active = False # Boss与子弹碰撞检测 if boss.active: if pygame.sprite.collide_mask(b, boss) and boss.rect.top > 0: b.active = False boss.hit = True boss.energy -= 1 if boss.energy <= 0: boss.active = False # 激光检测 for b in bullet_fire2: if b.active: if bullet4_switch == 0: screen.blit(b.image1, b.rect) elif bullet4_switch == 1: screen.blit(b.image2, b.rect) enemy_hit = pygame.sprite.spritecollide(b, enemies, False, pygame.sprite.collide_mask) if enemy_hit: for e in enemy_hit: if e.rect.bottom > 0: if e in small_enemies: e.active = False else: if bullet_type == 4: if not delay % 8: e.hit = True e.energy -= 1 if e.energy <= 0: e.active = False elif bullet_type == 5: if not delay % 8: e.hit = True e.energy -= 3 if e.energy <= 0: e.active = False # Boss与激光碰撞检测 if boss.active: if pygame.sprite.collide_mask(b, boss) and boss.rect.top > 0: if bullet_type == 4: if not delay % 10: boss.hit = True boss.energy -= 3 if boss.energy <= 0: boss.active = False elif bullet_type == 5: if not delay % 10: boss.hit = True boss.energy -= 6 if boss.energy <= 0: boss.active = False # 冲击波检测 if wave.active: wave.move() if bullet4_switch == 0: screen.blit(wave.image1, wave.rect) elif bullet4_switch == 1: screen.blit(wave.image2, wave.rect) enemy_hit = pygame.sprite.spritecollide(wave, enemies, False, pygame.sprite.collide_mask) if enemy_hit: for e in enemy_hit: if e in small_enemies: e.active = False else: if not delay % 12: e.hit = True e.energy = int(e.energy * 0.9 - 7) if e.energy <= 0: e.active = False # Boss与冲击波碰撞检测 if boss.active: if pygame.sprite.collide_mask(wave, boss) and boss.rect.top > 0: if not delay % 12: boss.hit = True boss.energy = int(boss.energy * 0.95 - 7) if boss.energy <= 0: boss.active = False # Boss子弹绘制 if boss.active: if boss_bullet.active: boss_bullet.move() screen.blit(boss_bullet.image[boss_bullet.index], boss_bullet.rect) if not delay % 10 and boss_bullet.index != 7: boss_bullet.index += 1 # 二号Boss子弹 if boss.energy <= 0.5 * enemy.Boss.energy: for b in boss_bullettwo: if b.active: b.move() screen.blit(b.image, b.rect) elif boss.energy <= 0.2 * enemy.Boss.energy: # 子弹消失时出现激光 boss_laser.reset(b.rect.midtop) if switch_image: screen.blit(boss_laser.image1, boss_laser.rect) else: screen.blit(boss_laser.image2, boss_laser.rect) if not delay % 5: bullet4_switch = (bullet4_switch + 1) % 2 # 绘制敌方飞机 # Boss if boss.active: boss.move() if boss.hit: if boss.energy > 0.5 * enemy.Boss.energy: screen.blit(boss.image_hit, boss.rect) elif 0.5 * enemy.Boss.energy >= boss.energy > 0.2 * enemy.Boss.energy: screen.blit(boss.down_image[1], boss.rect) else: screen.blit(boss.down_image[2], boss.rect) boss.hit = False else: screen.blit(boss.image, boss.rect) # 绘制血槽 pygame.draw.line(screen, white, (boss.rect.left, boss.rect.top - 5), (boss.rect.right, boss.rect.top - 5), 5) # 不同血量显示不同颜色 energy_remain = boss.energy / enemy.Boss.energy if energy_remain > 0.5: energy_color = green elif 0.5 >= energy_remain > 0.2: energy_color = orange else: energy_color = red pygame.draw.rect(screen, energy_color, (boss.rect.left, boss.rect.top - 10, int((boss.rect.right - boss.rect.left) * energy_remain), 10)) # 绘制血槽框 pygame.draw.rect(screen, black, (boss.rect.left, boss.rect.top - 10, boss.rect.width, 10), 2) # 即将出现时播放音效 if boss.rect.bottom == -18: boss_sound.play() else: # 毁灭 if boss.boss_down_index == 0 and boss.rect.top > 0: boss_down_sound.play() score_time_end = pygame.time.get_ticks() score += 200000 - (score_time_end - score_time) screen.blit(boss.down_image[boss.boss_down_index], boss.rect) if not (delay % 10) and boss.rect.top > 0: boss.boss_down_index = (boss.boss_down_index + 1) % 12 if boss.boss_down_index == 0: life_num = 0 # 大型飞机 for each in big_enemies: if each.active: each.move(boss.active) 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, white, (each.rect.left, each.rect.top - 5), (each.rect.right, each.rect.top - 5), 5) # 不同血量显示不同颜色 energy_remain = each.energy / enemy.BigEnemy.energy if energy_remain > 0.5: energy_color = green elif 0.5 >= energy_remain > 0.2: energy_color = orange else: energy_color =red pygame.draw.rect(screen, energy_color, (each.rect.left, each.rect.top - 10, int((each.rect.right - each.rect.left) * energy_remain), 10)) # 绘制血槽框 pygame.draw.rect(screen, black, (each.rect.left, each.rect.top - 10, each.rect.width, 10), 2) # 即将出现时播放音效 if each.rect.bottom == -50 or each.rect.bottom == -51 or each.rect.bottom == -52: enemy3_flying_sound.play(-1) if each.rect.top > height: enemy3_flying_sound.stop() else: # 毁灭 enemy3_flying_sound.stop() if each.e3_down_index == 0: enemy3_down_sound.play() screen.blit(each.down_image[each.e3_down_index], each.rect) if not (delay % 5): each.e3_down_index = (each.e3_down_index + 1) % 6 if each.e3_down_index == 0: score += 10000 if not boss.active: each.reset() big_enemies.remove(each) while True: if pygame.sprite.spritecollide(each, big_enemies, False, pygame.sprite.collide_mask): each.reset() else: break big_enemies.add(each) else: big_enemies.remove(each) enemies.remove(each) # 中型飞机 for each in mid_enemies: if each.active: each.move(boss.active) if each.hit: screen.blit(each.image_hit, each.rect) each.hit = False else: screen.blit(each.image, each.rect) # 绘制血槽 pygame.draw.line(screen, white, (each.rect.left, each.rect.top - 5), (each.rect.right, each.rect.top - 5), 5) # 不同血量显示不同颜色 energy_remain = (each.energy / enemy.MidEnemy.energy) if energy_remain > 0.5: energy_color = green elif 0.5 >= energy_remain > 0.2: energy_color = orange else: energy_color = red pygame.draw.rect(screen, energy_color, (each.rect.left, each.rect.top - 10, int((each.rect.right - each.rect.left) * energy_remain), 10)) # 绘制血槽框 pygame.draw.rect(screen, black, (each.rect.left, each.rect.top - 10, each.rect.width, 10), 2) else: # 毁灭 if each.e2_down_index == 0: enemy2_down_sound.play() screen.blit(each.down_image[each.e2_down_index], each.rect) if not (delay % 5): each.e2_down_index = (each.e2_down_index + 1) % 4 if each.e2_down_index == 0: score += 3000 if not boss.active: each.reset() mid_enemies.remove(each) while True: if pygame.sprite.spritecollide(each, mid_enemies, False, pygame.sprite.collide_mask): each.reset() else: break mid_enemies.add(each) else: mid_enemies.remove(each) enemies.remove(each) # 小型飞机 for each in small_enemies: if each.active: each.move(boss.active) screen.blit(each.image, each.rect) else: # 毁灭 if each.e1_down_index == 0: enemy1_down_sound.play() screen.blit(each.down_image[each.e1_down_index], each.rect) if not (delay % 5): each.e1_down_index = (each.e1_down_index + 1) % 4 if each.e1_down_index == 0: score += 1000 if not boss.active: each.reset() small_enemies.remove(each) while True: if pygame.sprite.spritecollide(each, small_enemies, False, pygame.sprite.collide_mask): each.reset() else: break small_enemies.add(each) else: small_enemies.remove(each) enemies.remove(each) # 绘制炸弹 bomb_text = bomb_font.render('X %d' % bomb_num, True, white) bomb_text_rect = bomb_rect.copy() bomb_text_rect.left = bomb_rect.width + 20 screen.blit(bomb_image, bomb_rect) screen.blit(bomb_text, bomb_text_rect) # 绘制生命数 for i in range(life_num): screen.blit(life_image, (width - 10 - (i + 1) * (life_rect.width + 20), 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 recoded: # 读取历史最高分 with open('record.txt', 'r') as f: record_score = int(f.read()) # 如果玩家打破纪录 if score > record_score: record_score = score with open('record.txt', 'w') as f: f.write(str(score)) recoded = True # 结束界面 record_score_text = record_font.render('BestScore : %s' % record_score, True, white) screen.blit(record_score_text, (10, 10)) end_score_text1 = end_score_font.render('Your Score', True, white) end_score_text2 = end_score_font.render(str(score), True, white) end_score_rect1 = end_score_text1.get_rect() end_score_rect2 = end_score_text2.get_rect() screen.blit(end_score_text1, ((width - end_score_rect1.width) // 2, (height - end_score_rect1.height) // 2 - 80)) screen.blit(end_score_text2, ((width - end_score_rect2.width) // 2, (height - end_score_rect1.height) // 2 - 100 + end_score_rect1.height)) screen.blit(again_image, again_rect) screen.blit(gameover_image, gameover_rect) if life_num: # 绘制难度 level_text = level_font.render('level : %s' % str(level), True, white) screen.blit(level_text, (10, 50)) # 绘制暂停按钮 screen.blit(pause_image, pause_rect) # 绘制分数 score_text = score_font.render('Score : %d' % score, True, white) screen.blit(score_text, (10, 10)) delay -= 1 if not delay: delay = 1000 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) #生成普通子弹1 bullet1 = [] bullet1_index = 0 BULLET1_NUM = 6 for i in range(BULLET1_NUM): bullet1.append(bullet.Bullet1(me.rect.midtop)) #生成超级子弹1 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_num = 3 bomb_font = pygame.font.Font("font/font.ttf", 42) #每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 #解除重生安全时间 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() #增加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, 3) add_mid_enemies(mid_enemies, enemies, 2) add_big_enemies(big_enemies, enemies, 1) #提升小型敌机的速度 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, 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("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,(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//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(): # 重新开始和结束游戏的图片 image_restart = pygame.image.load( r'Images/surface/game_again.png').convert_alpha() image_restart_rect = image_restart.get_rect() image_restart_rect.center = (width // 2, height // 2 + 20) image_over = pygame.image.load( r'Images/surface/game_over.png').convert_alpha() image_over_rect = image_over.get_rect() image_over_rect.center = (width // 2, height // 2 + 80) # 控制帧率 clock = pygame.time.Clock() while True: # 播放bgm pygame.mixer.music.play(-1) # 中弹图片索引值 big_enemy_down_index = 0 mid_enemy_down_index = 0 small_enemy_down_index = 0 hero_down_index = 0 # 保存得分变量 score = 0 score_font = pygame.font.SysFont(name='方正舒体', size=50) # 标志是否暂停游戏 pause = False pause_nor_image = pygame.image.load( r'Images/surface/game_pause_nor.png').convert_alpha() pause_pressed_image = pygame.image.load( r'Images/surface/game_pause_pressed.png').convert_alpha() resume_nor_image = pygame.image.load( r'Images/surface/game_resume_nor.png').convert_alpha() resume_pressed_image = pygame.image.load( r'Images/surface/game_resume_pressed.png').convert_alpha() pause_rect = pause_nor_image.get_rect() pause_rect.left, pause_rect.top = width - pause_rect.width - 10, 10 pause_image = pause_nor_image # 用于限制重复打开记录文件 is_recorded = False # 游戏难度级别 level = 1 # 全屏炸弹 bomb_image = pygame.image.load(r'Images/bomb/bomb.png').convert_alpha() bomb_rect = bomb_image.get_rect() bomb_font = pygame.font.SysFont(name='方正舒体', size=60) bomb_num = 3 # 每30s 提供一个补给包 supply_bomb = supply.SupplyBomb(bg_size) supply_bullet = supply.SupplyBullet(bg_size) SUPPLY_TIMER = USEREVENT # supply_remain_time = 30 * 1000 pygame.time.set_timer(SUPPLY_TIMER, 30 * 1000) # supply_timer_restart = pygame.time.get_ticks() # 超级子弹 BULLET_SUPER_TIMER = USEREVENT + 1 # 标志是否使用超级子弹 is_bullet_super = False # 解除我方无敌计时器 GOD_TIMER = USEREVENT + 2 # 初始化我的飞机 hero = myplane.Myplane(bg_size) # 生成普通子弹 bullet_common = [] bullet_common_index = 0 BULLET_COMMON_NUM = 4 for i in range(BULLET_COMMON_NUM): bullet_common.append(bullet.BulletCommon(hero.rect.midtop)) # 生成超级子弹 bullet_super = [] bullet_super_index = 0 BULLET_SUPER_NUM = 8 for i in range(BULLET_SUPER_NUM // 2): bullet_super.append( bullet.BulletSuper( (hero.rect.centerx - 33, hero.rect.centery))) bullet_super.append( bullet.BulletSuper( (hero.rect.centerx + 30, hero.rect.centery))) # 生成敌方飞机,保存在这个组里面 enemies = pygame.sprite.Group() # 初始生成小 15 中 4 大 2 # 生成小飞机 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) # 屏幕中大型敌方飞机数量 big_enemy_num = 0 running = True count = 100 switch_image = True # 这个变量用于表现飞机喷气效果 # 超级子弹剩余时间 # super_bullet_remain_time = 0 # 还有多少条命 life_num = 3 # gsp@ life_image = pygame.image.load(r'Images/hero/fly/hero_icon.png') life_rect = life_image.get_rect() 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): # 选择应该画的暂停图片 if pause: # 如果当前状态是pause,那么用户按下后就应该继续游戏,图标应该是暂停的样式 pause_image = pause_pressed_image else: pause_image = resume_pressed_image # 响应用户的按键操作 pause = not pause # 暂停声音,停止计时器 if pause: # 补给计时器停止 # supply_remain_time -= (pygame.time.get_ticks() - supply_timer_restart) pygame.time.set_timer(SUPPLY_TIMER, 0) ''' # 如果补给剩余时间为0或者负数,表示应该投放补给了 if supply_remain_time <= 0: print('ATTENTION: supply_remain_time = %d' % supply_remain_time) supply_remain_time = 1 ''' # 超级子弹计时器停止 if is_bullet_super: pygame.time.set_timer(BULLET_SUPER_TIMER, 0) ''' # 如果超级子弹还有时间,证明需要结算它的剩余时间 if super_bullet_remain_time: pygame.time.set_timer(BULLET_SUPER_TIMER, 0) super_bullet_remain_time -= (pygame.time.get_ticks() - super_bullet_timer_restart) # 如果发现实际剩余时间为负数,表示已经没有超级时间了,需要取消超级子弹时间 if super_bullet_remain_time <= 0: print('ATTENTION: super_bullet_remain_time = %d' % super_bullet_remain_time) super_bullet_remain_time = 0 is_bullet_super = False ''' pygame.mixer.music.pause() pygame.mixer.pause() # 重启剩余,重启所有计时器 else: # 重启补给包计时器 # supply_timer_restart = pygame.time.get_ticks() # pygame.time.set_timer(SUPPLY_TIMER, supply_remain_time) pygame.time.set_timer(SUPPLY_TIMER, 30 * 1000) # 重启超级子弹计时器 if is_bullet_super: pygame.time.set_timer(BULLET_SUPER_TIMER, 18 * 1000) ''' if super_bullet_remain_time: super_bullet_timer_restart = pygame.time.get_ticks() pygame.time.set_timer(SUPPLY_TIMER, super_bullet_remain_time) ''' pygame.mixer.music.unpause() pygame.mixer.unpause() # 关闭游戏 elif event.button == 1 and image_over_rect.collidepoint( event.pos): pygame.quit() elif event.button == 1 and image_restart_rect.collidepoint( event.pos): running = False break # 鼠标移动到暂停键哪里,需要变颜色 elif event.type == MOUSEMOTION: if pause_rect.collidepoint(event.pos): if pause: pause_image = resume_pressed_image else: pause_image = pause_pressed_image else: if pause: pause_image = resume_nor_image else: pause_image = pause_nor_image # 按下空格丢炸弹 elif event.type == KEYDOWN: if event.key == K_SPACE: if bomb_num: bomb_num -= 1 bombSound.play() for each in enemies: if each.rect.bottom > 0: each.active = False # 补给包投放定时器触发事件 elif event.type == SUPPLY_TIMER: # supply_timer_restart = pygame.time.get_ticks() # supply_remain_time = 30 * 1000 # 播放补给包声音,待添加,gsp@ if random.choice([True, False]): supply_bomb.reset() else: supply_bullet.reset() # 通知关闭超级子弹,18秒已过 elif event.type == BULLET_SUPER_TIMER: is_bullet_super = False # super_bullet_remain_time = 0 # pygame.time.set_timer(BULLET_SUPER_TIMER, 0) elif event.type == GOD_TIMER: hero.god = False pygame.time.set_timer(GOD_TIMER, 0) # 等级难度设置 # 难度2:增加3个小机,2个中飞机,1个大型机,小飞机加速1 if level == 1 and score > 50000: level = 2 #增加3个小机,2个中飞机,1个大型机 add_small_enemies(small_enemies, enemies, 3) add_mid_enemies(mid_enemies, enemies, 2) add_big_enemies(big_enemies, enemies, 1) #提升小飞机速度 speed_up(small_enemies, 1) # 难度3:增加4个小机,3个中飞机,1个大型机,中飞机加速1 elif level == 2 and score > 300000: level = 3 # 增加4个小机,3个中飞机,1个大型机 add_small_enemies(small_enemies, enemies, 4) add_mid_enemies(mid_enemies, enemies, 3) add_big_enemies(big_enemies, enemies, 1) # 提升中飞机速度 speed_up(mid_enemies, 1) # 难度4:增加5个小机,3个中飞机,2个大型机,小飞机加速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) #提升小飞机速度 speed_up(small_enemies, 1) # 难度5:增加5个小机,3个中飞机,2个大型机,小飞机加速1,中飞机加速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) #提升小飞机速度 speed_up(small_enemies, 1) speed_up(mid_enemies, 1) # 绘制背景 screen.blit(background, (0, 0)) if not pause and life_num: # 喷气效果切换变量转换部分 if not (count % 5): switch_image = not switch_image # 检测用户的键盘操作控制飞机 key_pressed = pygame.key.get_pressed() # 获取所有按键的序列,按下为True if key_pressed[K_w] or key_pressed[K_UP]: hero.moveUp() if key_pressed[K_s] or key_pressed[K_DOWN]: hero.moveDown() if key_pressed[K_a] or key_pressed[K_LEFT]: hero.moveLeft() if key_pressed[K_d] or key_pressed[K_RIGHT]: hero.moveRight() # 此处开始绘制所有的图 ##################################################################################### # 绘制补给包并且检测飞机是否获得 if supply_bomb.active: supply_bomb.move() screen.blit(supply_bomb.image, supply_bomb.rect) # 碰撞检测 if pygame.sprite.collide_mask(supply_bomb, hero): supply_bomb.active = False # 播放获得补给声音 gsp@ if bomb_num < 3: bomb_num += 1 # 绘制补给包并且检测飞机是否获得 if supply_bullet.active: supply_bullet.move() screen.blit(supply_bullet.image, supply_bullet.rect) # 碰撞检测 if pygame.sprite.collide_mask(supply_bullet, hero): supply_bullet.active = False # 播放获得补给声音 gsp@ is_bullet_super = True # super_bullet_remain_time = 18 * 1000 # pygame.time.set_timer(BULLET_SUPER_TIMER, 0) pygame.time.set_timer(BULLET_SUPER_TIMER, 18 * 1000) # super_bullet_timer_restart = pygame.time.get_ticks() # 每10帧绘制一个子弹 if not (count % 10): # 播放子弹声音 # 超级子弹 if is_bullet_super: bullets = bullet_super bullets[bullet_super_index].reset( (hero.rect.centerx - 33, hero.rect.centery)) bullets[bullet_super_index + 1].reset( (hero.rect.centerx + 30, hero.rect.centery)) bullet_super_index = (bullet_super_index + 2) % BULLET_SUPER_NUM else: bullets = bullet_common bullets[bullet_common_index].reset(hero.rect.midtop) bullet_common_index = (bullet_common_index + 1) % BULLET_COMMON_NUM # 检测子弹是否击中敌方飞机 for b in bullets: if b.active: # bulletSound.play() 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: # 绘制hit特效 screen.blit(each.image_hit, each.rect) each.hit = False else: # 喷气动画切换 if switch_image: screen.blit(each.image_fly1, each.rect) else: screen.blit(each.image_fly2, each.rect) # 绘制血槽, 黑色作为底槽 pygame.draw.line(screen, BLACK,\ (each.rect.left, each.rect.top - 5),\ (each.rect.right, each.rect.top - 5),\ 2) # 生命值大于20%显示绿色 energy_ratio = each.energy / enemy.BigEnemy.energy if energy_ratio > 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_ratio, each.rect.top - 5),\ 2) # 播放声音 if each.rect.bottom == -50: big_enemy_num += 1 print('1 create\t\t', big_enemy_num) # 播放大型机到来声音 bigEnemyFlySound.play(-1) # 停止播放飞机声音 elif each.rect.top == each.bg_height - 50: big_enemy_num -= 1 print('2 ------\t\t', big_enemy_num) if big_enemy_num == 0: print('3 num==0\t\t', big_enemy_num) bigEnemyFlySound.stop() else: # 毁灭 if not (count % 3): if big_enemy_down_index == 0: bigEnemyDownSound.play() big_enemy_num -= 1 print('4 destroy\t\t', big_enemy_num) if big_enemy_num == 0: bigEnemyFlySound.stop() screen.blit( each.image_destroy[big_enemy_down_index], each.rect) big_enemy_down_index = (big_enemy_down_index + 1) % 6 if big_enemy_down_index == 0: score += 10000 each.reset() # 绘制敌方中型机 for each in mid_enemies: if each.active: each.move() if each.hit: # 绘制hit特效 screen.blit(each.image_hit, each.rect) each.hit = False else: screen.blit(each.image_fly, each.rect) if each.rect.bottom == -50: # 播放型机到来声音 midEnemyFlySound.play() # 绘制血槽, 黑色作为底槽 pygame.draw.line(screen, BLACK,\ (each.rect.left, each.rect.top - 5),\ (each.rect.right, each.rect.top - 5),\ 2) # 生命值大于20%显示绿色 energy_ratio = each.energy / enemy.MidEnemy.energy if energy_ratio > 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_ratio, each.rect.top - 5),\ 2) else: # 毁灭 if not (count % 3): if mid_enemy_down_index == 0: midEnemyDownSound.play() screen.blit( each.image_destroy[mid_enemy_down_index], each.rect) mid_enemy_down_index = (mid_enemy_down_index + 1) % 4 if mid_enemy_down_index == 0: score += 4000 each.reset() # 绘制敌方小型机 for each in small_enemies: if each.active: each.move() screen.blit(each.image_fly, each.rect) else: # 毁灭 if not (count % 3): if small_enemy_down_index == 0: smallEnemyDownSound.play() screen.blit( each.image_destroy[small_enemy_down_index], each.rect) small_enemy_down_index = (small_enemy_down_index + 1) % 4 if small_enemy_down_index == 0: score += 1000 each.reset() # 我们和敌机的碰撞检测 enemies_down = pygame.sprite.spritecollide( hero, enemies, False, pygame.sprite.collide_mask) if enemies_down and not hero.god: hero.active = False for e in enemies_down: e.active = False # 绘制我方飞机 if hero.active: if switch_image: screen.blit(hero.image1, (hero.rect.left, hero.rect.top)) else: if not hero.god: screen.blit(hero.image2, (hero.rect.left, hero.rect.top)) else: screen.blit(hero.image_god, (hero.rect.left, hero.rect.top)) else: # 毁灭 heroDownSound.play() if not (count % 3): screen.blit(hero.image_destroy[hero_down_index], hero.rect) hero_down_index = (hero_down_index + 1) % 4 if hero_down_index == 0: life_num -= 1 if not life_num: # game over pass else: hero.reset() pygame.time.set_timer(GOD_TIMER, 3000) #左下角绘制炸弹 bomb_text = bomb_font.render('X %d' % bomb_num, True, WHITE) screen.blit(bomb_image, (10, height - 5 - bomb_rect.height)) screen.blit( bomb_text, (20 + bomb_rect.width, height - 15 - 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)\ ) # count自减一和重置部分 count -= 1 if not count: count = 100 # game over elif life_num == 0: # 这里面的部分只执行一次 if not is_recorded: is_recorded = True # 背景音乐停止 pygame.mixer.music.stop() # 停止全部音效 pygame.mixer.stop() # 停止发放补给 pygame.time.set_timer(SUPPLY_TIMER, 0) # 获取历史最高分并且保存在record.txt 中 # 如果不存在,就创建,并且在里面存一个0 if not os.path.isfile('record.txt'): with open('record.txt', 'w') as t: t.write('0') t.close() with open('record.txt', 'r+') as f: temp_score_str = f.read() # 是否为十进制字符串 if temp_score_str.isdecimal(): highest_score = int(temp_score_str) else: print('ERROR:record.txt中的内容为:%s' % temp_score_str) highest_score = 0 if score > highest_score: highest_score = score f.seek(0, 0) f.write(str(highest_score)) # 屏幕显示历史最高分的资源图片生成 highest_score_font = pygame.font.SysFont(name='方正舒体', size=58) highest_score_text = highest_score_font.render( 'Best : %s' % str(highest_score), True, WHITE) # Your score 字体和此次得分的字体 now_score_font = pygame.font.SysFont(name='方正舒体', size=68) # Your Score 的资源图片生成 your_score = now_score_font.render('Your Score', True, WHITE) your_score_rect = your_score.get_rect() your_score_rect.center = (width // 2, height // 2 - 150) # 此次得分的资源图片生成 score_text = now_score_font.render('%s' % str(score), True, WHITE) score_text_rect = score_text.get_rect() score_text_rect.center = (width // 2, height // 2 - 70) # 绘制历史最高分 screen.blit(highest_score_text, (50, 30)) # 屏幕显示Your Score screen.blit(your_score, your_score_rect) # 显示此次得分 screen.blit(score_text, score_text_rect) # 绘制从新开始和结束游戏 screen.blit(image_restart, image_restart_rect) screen.blit(image_over, image_over_rect) if life_num: #绘制分数 score_text = score_font.render('Score : %s' % str(score), True, WHITE) screen.blit(score_text, (10, 5)) #绘制暂停按钮 screen.blit(pause_image, pause_rect) pygame.display.flip() clock.tick(60)