鱼C论坛

 找回密码
 立即注册
查看: 1552|回复: 6

[作品展示] 飞机大战【进阶版】

[复制链接]
发表于 2019-5-3 09:29:34 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
我改进了一下小甲鱼的飞机大战,
新加的东西:
1.加了医疗包和强化子弹。每打败大型飞机就有几率发射医疗包,每提升一个难度(除了第3个)就会发送一个强化子弹。
2.子弹有普通的(1发),2发的,3发的和4发的。每拿到强化子弹,子弹就会生1发。
3.添加了许多背景图片,每提升一个难度就会换一个背景。
4.修改了我方飞机图片、我方飞机的血量图片和状态栏的全屏炸弹图片。

然后还去掉了双发子弹补给。

源代码:
main模块:
  1. # -*- coding: utf-8 -*-
  2. # main.py
  3. import pygame
  4. import sys
  5. import traceback
  6. import myplane
  7. import enemy
  8. import bullet
  9. import supply

  10. from pygame.locals import *
  11. from random import *

  12. pygame.init()
  13. pygame.mixer.init()

  14. bg_size = width, height = 480, 700
  15. screen = pygame.display.set_mode(bg_size)

  16. icon = pygame.image.load('images/other/icon.ico').convert_alpha()
  17. pygame.display.set_icon(icon)

  18. pygame.display.set_caption("飞机大战")

  19. BLACK = (0, 0, 0)
  20. WHITE = (255, 255, 255)
  21. GREEN = (0, 255, 0)
  22. RED = (255, 0, 0)

  23. # 载入游戏音乐
  24. pygame.mixer.music.load("sound/game_music.ogg")
  25. pygame.mixer.music.set_volume(0.2)
  26. bullet_sound = pygame.mixer.Sound("sound/bullet.wav")
  27. bullet_sound.set_volume(0.2)
  28. bomb_sound = pygame.mixer.Sound("sound/use_bomb.wav")
  29. bomb_sound.set_volume(0.2)
  30. supply_sound = pygame.mixer.Sound("sound/supply.wav")
  31. supply_sound.set_volume(0.2)
  32. get_bomb_sound = pygame.mixer.Sound("sound/get_bomb.wav")
  33. get_bomb_sound.set_volume(0.2)
  34. get_bullet_sound = pygame.mixer.Sound("sound/get_bullet.wav")
  35. get_bullet_sound.set_volume(0.2)
  36. upgrade_sound = pygame.mixer.Sound("sound/upgrade.wav")
  37. upgrade_sound.set_volume(0.2)
  38. enemy3_fly_sound = pygame.mixer.Sound("sound/enemy3_flying.wav")
  39. enemy3_fly_sound.set_volume(0.2)
  40. enemy1_down_sound = pygame.mixer.Sound("sound/enemy1_down.wav")
  41. enemy1_down_sound.set_volume(0.2)
  42. enemy2_down_sound = pygame.mixer.Sound("sound/enemy2_down.wav")
  43. enemy2_down_sound.set_volume(0.2)
  44. enemy3_down_sound = pygame.mixer.Sound("sound/enemy3_down.wav")
  45. enemy3_down_sound.set_volume(0.5)
  46. me_down_sound = pygame.mixer.Sound("sound/me_down.wav")
  47. me_down_sound.set_volume(0.2)


  48. def add_small_enemies(group1, group2, num):
  49.     for i in range(num):
  50.         e1 = enemy.SmallEnemy(bg_size)
  51.         group1.add(e1)
  52.         group2.add(e1)

  53. def add_mid_enemies(group1, group2, num):
  54.     for i in range(num):
  55.         e2 = enemy.MidEnemy(bg_size)
  56.         group1.add(e2)
  57.         group2.add(e2)

  58. def add_big_enemies(group1, group2, num):
  59.     for i in range(num):
  60.         e3 = enemy.BigEnemy(bg_size)
  61.         group1.add(e3)
  62.         group2.add(e3)

  63. def inc_speed(target, inc):
  64.     for each in target:
  65.         each.speed += inc

  66. def main():
  67.     pygame.mixer.music.play(-1)

  68.     # 生成背景图片
  69.     bg = [
  70.         pygame.image.load("images/other/bg1.jpg").convert(),
  71.         pygame.image.load("images/other/bg2.jpg").convert(),
  72.         pygame.image.load("images/other/bg3.jpg").convert(),
  73.         pygame.image.load("images/other/bg4.jpg").convert(),
  74.         pygame.image.load("images/other/bg5.jpg").convert()
  75.     ]

  76.     # 生成我方飞机
  77.     me = myplane.MyPlane(bg_size)

  78.     enemies = pygame.sprite.Group()

  79.     # 生成敌方小型飞机
  80.     small_enemies = pygame.sprite.Group()
  81.     add_small_enemies(small_enemies, enemies, 15)

  82.     # 生成敌方中型飞机
  83.     mid_enemies = pygame.sprite.Group()
  84.     add_mid_enemies(mid_enemies, enemies, 4)

  85.     # 生成敌方大型飞机
  86.     big_enemies = pygame.sprite.Group()
  87.     add_big_enemies(big_enemies, enemies, 2)

  88.     # 生成普通子弹
  89.     bullet1 = []
  90.     bullet1_index = 0
  91.     BULLET1_NUM = 4
  92.     for i in range(BULLET1_NUM):
  93.         bullet1.append(bullet.Bullet1(me.rect.midtop))

  94.     # 生成双发子弹
  95.     bullet2 = []
  96.     bullet2_index = 0
  97.     BULLET2_NUM = 8
  98.     for i in range(BULLET2_NUM//2):
  99.         bullet2.append(bullet.Bullet2((me.rect.centerx-33, me.rect.centery)))
  100.         bullet2.append(bullet.Bullet2((me.rect.centerx+30, me.rect.centery)))

  101.     # 生成三发子弹
  102.     bullet3 = []
  103.     bullet3_index = 0
  104.     BULLET3_NUM = 12
  105.     for i in range(BULLET3_NUM//3):
  106.         bullet3.append(bullet.Bullet3((me.rect.centerx-33, me.rect.centery)))
  107.         bullet3.append(bullet.Bullet3(me.rect.midtop))
  108.         bullet3.append(bullet.Bullet3((me.rect.centerx+30, me.rect.centery)))

  109.     # 生成四发子弹
  110.     bullet4 = []
  111.     bullet4_index = 0
  112.     BULLET4_NUM = 16
  113.     for i in range(BULLET3_NUM//4):
  114.         bullet4.append(bullet.Bullet4((me.rect.centerx-25, me.rect.centery)))
  115.         bullet4.append(bullet.Bullet4((me.rect.centerx-33, me.rect.centery)))
  116.         bullet4.append(bullet.Bullet4((me.rect.centerx+30, me.rect.centery)))
  117.         bullet4.append(bullet.Bullet4((me.rect.centerx+45, me.rect.centery)))

  118.     # 用于知道子弹是多少发
  119.     bullet_mode = 1

  120.     clock = pygame.time.Clock()

  121.     # 中弹图片索引
  122.     e1_destroy_index = 0
  123.     e2_destroy_index = 0
  124.     e3_destroy_index = 0
  125.     me_destroy_index = 0

  126.     # 统计得分
  127.     score = 0
  128.     score_font = pygame.font.Font("font/font.ttf", 36)

  129.     # 标志是否暂停游戏
  130.     paused = False
  131.     pause_nor_image = pygame.image.load("images/pause/pause_nor.png").convert_alpha()
  132.     pause_pressed_image = pygame.image.load("images/pause/pause_pressed.png").convert_alpha()
  133.     resume_nor_image = pygame.image.load("images/pause/resume_nor.png").convert_alpha()
  134.     resume_pressed_image = pygame.image.load("images/pause/resume_pressed.png").convert_alpha()
  135.     paused_rect = pause_nor_image.get_rect()
  136.     paused_rect.left, paused_rect.top = width - paused_rect.width - 10, 10
  137.     paused_image = pause_nor_image

  138.     # 设置难度级别
  139.     level = 1

  140.     # 全屏炸弹
  141.     bomb_image = pygame.image.load("images/me/bomb.png").convert_alpha()
  142.     bomb_launch_image = [
  143.         pygame.image.load('images/bomb/bomb1.png').convert_alpha(),
  144.         pygame.image.load('images/bomb/bomb2.png').convert_alpha(),
  145.         pygame.image.load('images/bomb/bomb3.png').convert_alpha(),
  146.         pygame.image.load('images/bomb/bomb4.png').convert_alpha(),
  147.         pygame.image.load('images/bomb/bomb5.png').convert_alpha()
  148.         ]
  149.     bomb_rect = bomb_image.get_rect()
  150.     bomb_font = pygame.font.Font("font/font.ttf", 48)
  151.     bomb_launch = False
  152.     bomb_index = 0
  153.     bomb_num = 3

  154.     # 每30秒发放一个全屏炸弹
  155.     bomb_supply = supply.Bomb_Supply(bg_size)
  156.     SUPPLY_TIME = USEREVENT
  157.     pygame.time.set_timer(SUPPLY_TIME, 30 * 1000)

  158.     # 其他补给
  159.     medical_supply = supply.Medical_Supply(bg_size)
  160.     bullet_update = supply.Bullet_Update(bg_size)

  161.     # 解除我方无敌状态定时器
  162.     INVINCIBLE_TIME = USEREVENT + 2

  163.     # 生命数量
  164.     life_image = pygame.image.load("images/me/life.png").convert_alpha()
  165.     life_rect = life_image.get_rect()
  166.     life_num = 3

  167.     # 用于阻止重复打开记录文件
  168.     recorded = False

  169.     # 游戏结束画面
  170.     gameover_font = pygame.font.Font("font/font.TTF", 48)
  171.     again_image = pygame.image.load("images/stop/again.png").convert_alpha()
  172.     again_rect = again_image.get_rect()
  173.     gameover_image = pygame.image.load("images/stop/gameover.png").convert_alpha()
  174.     gameover_rect = gameover_image.get_rect()

  175.     # 用于切换图片
  176.     switch_image = True

  177.     # 用于延迟
  178.     delay = 100

  179.     running = True

  180.     while running:
  181.         for event in pygame.event.get():
  182.             if event.type == QUIT:
  183.                 pygame.quit()
  184.                 sys.exit()

  185.             elif event.type == MOUSEBUTTONDOWN:
  186.                 if event.button == 1 and paused_rect.collidepoint(event.pos):
  187.                     paused = not paused
  188.                     if paused:
  189.                         pygame.time.set_timer(SUPPLY_TIME, 0)
  190.                         pygame.mixer.music.pause()
  191.                         pygame.mixer.pause()
  192.                     else:
  193.                         pygame.time.set_timer(SUPPLY_TIME, 30 * 1000)
  194.                         pygame.mixer.music.unpause()
  195.                         pygame.mixer.unpause()

  196.             elif event.type == MOUSEMOTION:
  197.                 if paused_rect.collidepoint(event.pos):
  198.                     if paused:
  199.                         paused_image = resume_pressed_image
  200.                     else:
  201.                         paused_image = pause_pressed_image
  202.                 else:
  203.                     if paused:
  204.                         paused_image = resume_nor_image
  205.                     else:
  206.                        paused_image = pause_nor_image

  207.             elif event.type == KEYDOWN:
  208.                 if event.key == K_SPACE:
  209.                     if bomb_num:
  210.                         bomb_launch = True
  211.                         bomb_num -= 1
  212.                         bomb_sound.play()
  213.                         for each in enemies:
  214.                             if each.rect.bottom > 0:
  215.                                 each.active = False
  216.                                 each.if_add_score = True

  217.             elif event.type == SUPPLY_TIME:
  218.                 supply_sound.play()
  219.                 bomb_supply.reset()

  220.             elif event.type == INVINCIBLE_TIME:
  221.                 me.invincible = False
  222.                 pygame.time.set_timer(INVINCIBLE_TIME, 0)
  223.                         

  224.         # 根据用户的得分增加难度
  225.         if level == 1 and score > 50000:
  226.             bullet_update.active = True
  227.             level = 2
  228.             upgrade_sound.play()
  229.             # 增加3架小型敌机、2架中型敌机和1架大型敌机
  230.             add_small_enemies(small_enemies, enemies, 3)
  231.             add_mid_enemies(mid_enemies, enemies, 2)
  232.             add_big_enemies(big_enemies, enemies, 1)
  233.             # 提升小型敌机的速度
  234.             inc_speed(small_enemies, 1)
  235.         elif level == 2 and score > 300000:
  236.             level = 3
  237.             upgrade_sound.play()
  238.             # 增加5架小型敌机、3架中型敌机和2架大型敌机
  239.             add_small_enemies(small_enemies, enemies, 5)
  240.             add_mid_enemies(mid_enemies, enemies, 3)
  241.             add_big_enemies(big_enemies, enemies, 2)
  242.             # 提升小型敌机和中型飞机的速度
  243.             inc_speed(small_enemies, 1)
  244.             inc_speed(mid_enemies, 1)
  245.         elif level == 3 and score > 600000:
  246.             bullet_update.active = True
  247.             level = 4
  248.             upgrade_sound.play()
  249.             # 增加5架小型敌机、3架中型敌机和2架大型敌机
  250.             add_small_enemies(small_enemies, enemies, 5)
  251.             add_mid_enemies(mid_enemies, enemies, 3)
  252.             add_big_enemies(big_enemies, enemies, 2)
  253.             # 提升小型敌机和中型飞机的速度
  254.             inc_speed(small_enemies, 1)
  255.             inc_speed(mid_enemies, 1)
  256.         elif level == 4 and score > 1000000:
  257.             bullet_update.active = True
  258.             level = 5
  259.             upgrade_sound.play()
  260.             # 增加5架小型敌机、3架中型敌机和2架大型敌机
  261.             add_small_enemies(small_enemies, enemies, 5)
  262.             add_mid_enemies(mid_enemies, enemies, 3)
  263.             add_big_enemies(big_enemies, enemies, 2)
  264.             # 提升小型敌机和中型飞机的速度
  265.             inc_speed(small_enemies, 1)
  266.             inc_speed(mid_enemies, 1)
  267.             

  268.         screen.blit(bg[level-1], (0, 0))
  269.                
  270.         if life_num and not paused:
  271.             if bomb_launch:
  272.                 if not(delay % 10):
  273.                     screen.blit(bomb_launch_image[bomb_index], (0, 0))
  274.                     bomb_index = (bomb_index + 1) % 5
  275.                     if bomb_index == 0:
  276.                         bomb_launch = False
  277.             
  278.             # 检测用户的键盘操作
  279.             key_pressed = pygame.key.get_pressed()

  280.             if key_pressed[K_w] or key_pressed[K_UP]:
  281.                 me.moveUp()
  282.             if key_pressed[K_s] or key_pressed[K_DOWN]:
  283.                 me.moveDown()
  284.             if key_pressed[K_a] or key_pressed[K_LEFT]:
  285.                 me.moveLeft()
  286.             if key_pressed[K_d] or key_pressed[K_RIGHT]:
  287.                 me.moveRight()

  288.             # 绘制全屏炸弹补给并检测是否获得
  289.             if bomb_supply.active:
  290.                 bomb_supply.move()
  291.                 screen.blit(bomb_supply.image, bomb_supply.rect)
  292.                 if pygame.sprite.collide_mask(bomb_supply, me):
  293.                     get_bomb_sound.play()
  294.                     if bomb_num < 5:
  295.                         bomb_num += 1
  296.                     bomb_supply.active = False

  297.             # 绘制强化子弹补给并检测是否获得
  298.             if bullet_update.active:
  299.                 bullet_update.move()
  300.                 screen.blit(bullet_update.image, bullet_update.rect)
  301.                 if pygame.sprite.collide_mask(bullet_update, me):
  302.                     get_bomb_sound.play()
  303.                     if bullet_mode < 5:
  304.                         bullet_mode += 1
  305.                     bullet_update.reset()
  306.                     bullet_update.active = False

  307.             # 绘制医疗包并检测是否获得
  308.             if medical_supply.active:
  309.                 medical_supply.move()
  310.                 screen.blit(medical_supply.image, medical_supply.rect)
  311.                 if pygame.sprite.collide_mask(medical_supply, me):
  312.                     get_bomb_sound.play()
  313.                     if life_num < 5:
  314.                         life_num += 1
  315.                     medical_supply.reset()
  316.                     medical_supply.active = False
  317.                
  318.             # 发射子弹
  319.             if not(delay % 10):
  320.                 bullet_sound.play()
  321.                 if bullet_mode == 1:
  322.                     bullets = bullet1
  323.                     bullets[bullet1_index].reset(me.rect.midtop)
  324.                     bullet1_index = (bullet1_index + 1) % BULLET1_NUM
  325.                 elif bullet_mode == 2:
  326.                     bullets = bullet2
  327.                     bullets[bullet2_index].reset((me.rect.centerx-33, me.rect.centery))
  328.                     bullets[bullet2_index+1].reset((me.rect.centerx+30, me.rect.centery))
  329.                     bullet2_index = (bullet2_index + 2) % BULLET2_NUM
  330.                 elif bullet_mode == 3:
  331.                     bullets = bullet3
  332.                     bullets[bullet3_index].reset((me.rect.centerx-33, me.rect.centery))
  333.                     bullets[bullet3_index+1].reset(me.rect.midtop)
  334.                     bullets[bullet3_index+2].reset((me.rect.centerx+30, me.rect.centery))
  335.                     bullet3_index = (bullet3_index + 3) % BULLET3_NUM
  336.                 elif bullet_mode == 4:
  337.                     bullets = bullet4
  338.                     bullets[bullet4_index].reset((me.rect.centerx-45, me.rect.centery))
  339.                     bullets[bullet4_index+1].reset((me.rect.centerx-33, me.rect.centery))
  340.                     bullets[bullet4_index+2].reset((me.rect.centerx+30, me.rect.centery))
  341.                     bullets[bullet4_index+3].reset((me.rect.centerx+42, me.rect.centery))
  342.                     bullet4_index = bullet4_index % BULLET4_NUM
  343.                
  344.             # 检测子弹是否击中敌机
  345.             for b in bullets:
  346.                 if b.active:
  347.                     b.move()
  348.                     screen.blit(b.image, b.rect)
  349.                     enemy_hit = pygame.sprite.spritecollide(b, enemies, False, pygame.sprite.collide_mask)
  350.                     if enemy_hit:
  351.                         b.active = False
  352.                         for e in enemy_hit:
  353.                             if e in mid_enemies or e in big_enemies:
  354.                                 e.hit = True
  355.                                 e.energy -= 1
  356.                                 if e.energy == 0:
  357.                                     e.active = False
  358.                                     e.if_add_score = True
  359.                             else:
  360.                                 e.active = False
  361.                                 e.if_add_score = True
  362.             
  363.             # 绘制大型敌机
  364.             for each in big_enemies:
  365.                 if each.active:
  366.                     each.move()
  367.                     if each.hit:
  368.                         screen.blit(each.image_hit, each.rect)
  369.                         each.hit = False
  370.                     else:
  371.                         if switch_image:
  372.                             screen.blit(each.image1, each.rect)
  373.                         else:
  374.                             screen.blit(each.image2, each.rect)

  375.                     # 绘制血槽
  376.                     pygame.draw.line(screen, BLACK, \
  377.                                      (each.rect.left, each.rect.top - 5), \
  378.                                      (each.rect.right, each.rect.top - 5), \
  379.                                      2)
  380.                     # 当生命大于20%显示绿色,否则显示红色
  381.                     energy_remain = each.energy / enemy.BigEnemy.energy
  382.                     if energy_remain > 0.2:
  383.                         energy_color = GREEN
  384.                     else:
  385.                         energy_color = RED
  386.                     pygame.draw.line(screen, energy_color, \
  387.                                      (each.rect.left, each.rect.top - 5), \
  388.                                      (each.rect.left + each.rect.width * energy_remain, \
  389.                                       each.rect.top - 5), 2)
  390.                         
  391.                     # 即将出现在画面中,播放音效
  392.                     if each.rect.bottom == -50:
  393.                         enemy3_fly_sound.play(-1)
  394.                 else:
  395.                     # 毁灭
  396.                     if not(delay % 3):
  397.                         if e3_destroy_index == 0:
  398.                             enemy3_down_sound.play()
  399.                         screen.blit(each.destroy_images[e3_destroy_index], each.rect)
  400.                         e3_destroy_index = (e3_destroy_index + 1) % 6
  401.                         if e3_destroy_index == 0:
  402.                             enemy3_fly_sound.stop()
  403.                             if each.if_add_score:
  404.                                 score += 10000
  405.                             each.reset()

  406.                             if choice([True, False]):
  407.                                 medical_supply.active = True

  408.             # 绘制中型敌机:
  409.             for each in mid_enemies:
  410.                 if each.active:
  411.                     each.move()

  412.                     if each.hit:
  413.                         screen.blit(each.image_hit, each.rect)
  414.                         each.hit = False
  415.                     else:
  416.                         screen.blit(each.image, each.rect)

  417.                     # 绘制血槽
  418.                     pygame.draw.line(screen, BLACK, \
  419.                                      (each.rect.left, each.rect.top - 5), \
  420.                                      (each.rect.right, each.rect.top - 5), \
  421.                                      2)
  422.                     # 当生命大于20%显示绿色,否则显示红色
  423.                     energy_remain = each.energy / enemy.MidEnemy.energy
  424.                     if energy_remain > 0.2:
  425.                         energy_color = GREEN
  426.                     else:
  427.                         energy_color = RED
  428.                     pygame.draw.line(screen, energy_color, \
  429.                                      (each.rect.left, each.rect.top - 5), \
  430.                                      (each.rect.left + each.rect.width * energy_remain, \
  431.                                       each.rect.top - 5), 2)
  432.                 else:
  433.                     # 毁灭
  434.                     if not(delay % 3):
  435.                         if e2_destroy_index == 0:
  436.                             enemy2_down_sound.play()
  437.                         screen.blit(each.destroy_images[e2_destroy_index], each.rect)
  438.                         e2_destroy_index = (e2_destroy_index + 1) % 4
  439.                         if e2_destroy_index == 0:
  440.                             if each.if_add_score:
  441.                                 score += 6000
  442.                             each.reset()

  443.             # 绘制小型敌机:
  444.             for each in small_enemies:
  445.                 if each.active:
  446.                     each.move()
  447.                     screen.blit(each.image, each.rect)
  448.                 else:
  449.                     # 毁灭
  450.                     if not(delay % 3):
  451.                         if e1_destroy_index == 0:
  452.                             enemy1_down_sound.play()
  453.                         screen.blit(each.destroy_images[e1_destroy_index], each.rect)
  454.                         e1_destroy_index = (e1_destroy_index + 1) % 4
  455.                         if e1_destroy_index == 0:
  456.                             if each.if_add_score:
  457.                                 score += 1000
  458.                             each.reset()

  459.             # 检测我方飞机是否被撞
  460.             enemies_down = pygame.sprite.spritecollide(me, enemies, False, pygame.sprite.collide_mask)
  461.             if enemies_down:
  462.                 if not me.invincible:
  463.                     me.active = False
  464.                 for e in enemies_down:
  465.                     e.active = False
  466.                     if not me.invincible:
  467.                         e.if_add_score = True
  468.                     else:
  469.                         e.if_add_score = False
  470.             
  471.             # 绘制我方飞机
  472.             if me.active:
  473.                 if switch_image:
  474.                     screen.blit(me.image1, me.rect)
  475.                 else:
  476.                     screen.blit(me.image2, me.rect)
  477.                 if me.invincible:
  478.                     screen.blit(me.shield, (me.rect.left - 27, me.rect.top - 15))
  479.             else:
  480.                 # 毁灭
  481.                 if not(delay % 3):
  482.                     if me_destroy_index == 0:
  483.                         me_down_sound.play()
  484.                     screen.blit(me.destroy_images[me_destroy_index], me.rect)
  485.                     me_destroy_index = (me_destroy_index + 1) % 4
  486.                     if me_destroy_index == 0:
  487.                         life_num -= 1
  488.                         me.reset()
  489.                         pygame.time.set_timer(INVINCIBLE_TIME, 3 * 1000)

  490.             # 绘制全屏炸弹数量
  491.             bomb_text = bomb_font.render(" X %d" % bomb_num, True, WHITE)
  492.             text_rect = bomb_text.get_rect()
  493.             screen.blit(bomb_image, (10, height - 10 - bomb_rect.height))
  494.             screen.blit(bomb_text, (20 + bomb_rect.width, height - 5 - text_rect.height))

  495.             # 绘制剩余生命数量
  496.             if life_num:
  497.                 for i in range(life_num):
  498.                     screen.blit(life_image, \
  499.                                 (width-10-(i+1)*life_rect.width, \
  500.                                  height-10-life_rect.height))

  501.             # 绘制得分
  502.             score_text = score_font.render("Score : %s" % str(score), True, WHITE)
  503.             screen.blit(score_text, (10, 5))

  504.         # 绘制游戏结束画面
  505.         elif life_num == 0:
  506.             # 背景音乐停止
  507.             pygame.mixer.music.fadeout(1200)

  508.             # 停止全部音效
  509.             pygame.mixer.stop()

  510.             # 停止发放补给
  511.             pygame.time.set_timer(SUPPLY_TIME, 0)

  512.             if not recorded:
  513.                 recorded = True
  514.                 # 读取历史最高得分
  515.                 with open("record.txt", "r") as f:
  516.                     record_score = int(f.read())

  517.                 # 如果玩家得分高于历史最高得分,则存档
  518.                 if score > record_score:
  519.                     with open("record.txt", "w") as f:
  520.                         f.write(str(score))

  521.             # 绘制结束画面
  522.             record_score_text = score_font.render("Best : %d" % record_score, True, WHITE)
  523.             screen.blit(record_score_text, (50, 50))
  524.             
  525.             gameover_text1 = gameover_font.render("Your Score", True, WHITE)
  526.             gameover_text1_rect = gameover_text1.get_rect()
  527.             gameover_text1_rect.left, gameover_text1_rect.top = \
  528.                                  (width - gameover_text1_rect.width) // 2, height // 3
  529.             screen.blit(gameover_text1, gameover_text1_rect)
  530.             
  531.             gameover_text2 = gameover_font.render(str(score), True, WHITE)
  532.             gameover_text2_rect = gameover_text2.get_rect()
  533.             gameover_text2_rect.left, gameover_text2_rect.top = \
  534.                                  (width - gameover_text2_rect.width) // 2, \
  535.                                  gameover_text1_rect.bottom + 10
  536.             screen.blit(gameover_text2, gameover_text2_rect)

  537.             again_rect.left, again_rect.top = \
  538.                              (width - again_rect.width) // 2, \
  539.                              gameover_text2_rect.bottom + 50
  540.             screen.blit(again_image, again_rect)

  541.             gameover_rect.left, gameover_rect.top = \
  542.                                 (width - again_rect.width) // 2, \
  543.                                 again_rect.bottom + 10
  544.             screen.blit(gameover_image, gameover_rect)

  545.             # 检测用户的鼠标操作
  546.             # 如果用户按下鼠标左键
  547.             if pygame.mouse.get_pressed()[0]:
  548.                 # 获取鼠标坐标
  549.                 pos = pygame.mouse.get_pos()
  550.                 # 如果用户点击“重新开始”
  551.                 if again_rect.left < pos[0] < again_rect.right and \
  552.                    again_rect.top < pos[1] < again_rect.bottom:
  553.                     # 调用main函数,重新开始游戏
  554.                     main()
  555.                 # 如果用户点击“结束游戏”            
  556.                 elif gameover_rect.left < pos[0] < gameover_rect.right and \
  557.                      gameover_rect.top < pos[1] < gameover_rect.bottom:
  558.                     # 退出游戏
  559.                     pygame.quit()
  560.                     sys.exit()      

  561.         # 绘制暂停按钮
  562.         screen.blit(paused_image, paused_rect)

  563.         # 切换图片
  564.         if not(delay % 5):
  565.             switch_image = not switch_image

  566.         delay -= 1
  567.         if not delay:
  568.             delay = 100

  569.         pygame.display.flip()
  570.         clock.tick(60)
  571.         
  572. if __name__ == "__main__":
  573.     try:
  574.         main()
  575.     except SystemExit:
  576.         pass
  577.     except:
  578.         traceback.print_exc()
  579.         pygame.quit()
  580.         input()
复制代码

myplane模块:
  1. import pygame

  2. class MyPlane(pygame.sprite.Sprite):
  3.     def __init__(self, bg_size):
  4.         pygame.sprite.Sprite.__init__(self)

  5.         self.image1 = pygame.image.load("images/me/me1.png").convert_alpha()
  6.         self.image2 = pygame.image.load("images/me/me2.png").convert_alpha()
  7.         self.destroy_images = []
  8.         self.destroy_images.extend([\
  9.             pygame.image.load("images/me/me_down1.png").convert_alpha(), \
  10.             pygame.image.load("images/me/me_down2.png").convert_alpha(), \
  11.             pygame.image.load("images/me/me_down3.png").convert_alpha(), \
  12.             pygame.image.load("images/me/me_down4.png").convert_alpha() \
  13.             ])
  14.         self.shield = pygame.image.load('images/me/shield.png').convert_alpha()
  15.         self.rect = self.image1.get_rect()
  16.         self.width, self.height = bg_size[0], bg_size[1]
  17.         self.rect.left, self.rect.top = \
  18.                         (self.width - self.rect.width) // 2, \
  19.                         self.height - self.rect.height - 60
  20.         self.speed = 10
  21.         self.active = True
  22.         self.invincible = False
  23.         self.mask = pygame.mask.from_surface(self.image1)

  24.     def moveUp(self):
  25.         if self.rect.top > 0:
  26.             self.rect.top -= self.speed
  27.         else:
  28.             self.rect.top = 0

  29.     def moveDown(self):
  30.         if self.rect.bottom < self.height - 60:
  31.             self.rect.top += self.speed
  32.         else:
  33.             self.rect.bottom = self.height - 60

  34.     def moveLeft(self):
  35.         if self.rect.left > 0:
  36.             self.rect.left -= self.speed
  37.         else:
  38.             self.rect.left = 0

  39.     def moveRight(self):
  40.         if self.rect.right < self.width:
  41.             self.rect.left += self.speed
  42.         else:
  43.             self.rect.right = self.width

  44.     def reset(self):
  45.         self.rect.left, self.rect.top = \
  46.                         (self.width - self.rect.width) // 2, \
  47.                         self.height - self.rect.height - 60
  48.         self.active = True
  49.         self.invincible = True
复制代码

enemy模块:
  1. import pygame
  2. from random import *

  3. class SmallEnemy(pygame.sprite.Sprite):
  4.     def __init__(self, bg_size):
  5.         pygame.sprite.Sprite.__init__(self)

  6.         self.image = pygame.image.load("images/enemy/enemy1.png").convert_alpha()
  7.         self.destroy_images = []
  8.         self.destroy_images.extend([\
  9.             pygame.image.load("images/enemy/enemy1_down1.png").convert_alpha(), \
  10.             pygame.image.load("images/enemy/enemy1_down2.png").convert_alpha(), \
  11.             pygame.image.load("images/enemy/enemy1_down3.png").convert_alpha(), \
  12.             pygame.image.load("images/enemy/enemy1_down4.png").convert_alpha() \
  13.             ])
  14.         self.rect = self.image.get_rect()
  15.         self.width, self.height = bg_size[0], bg_size[1]
  16.         self.speed = 2
  17.         self.active = True
  18.         self.rect.left, self.rect.top = \
  19.                         randint(0, self.width - self.rect.width), \
  20.                         randint(-5 * self.height, 0)
  21.         self.mask = pygame.mask.from_surface(self.image)
  22.         self.if_add_score = False

  23.     def move(self):
  24.         if self.rect.top < self.height:
  25.             self.rect.top += self.speed
  26.         else:
  27.             self.reset()

  28.     def reset(self):
  29.         self.active = True
  30.         self.rect.left, self.rect.top = \
  31.                         randint(0, self.width - self.rect.width), \
  32.                         randint(-5 * self.height, 0)


  33. class MidEnemy(pygame.sprite.Sprite):
  34.     energy = 8
  35.    
  36.     def __init__(self, bg_size):
  37.         pygame.sprite.Sprite.__init__(self)

  38.         self.image = pygame.image.load("images/enemy/enemy2.png").convert_alpha()
  39.         self.image_hit = pygame.image.load("images/enemy/enemy2_hit.png").convert_alpha()
  40.         self.destroy_images = []
  41.         self.destroy_images.extend([\
  42.             pygame.image.load("images/enemy/enemy2_down1.png").convert_alpha(), \
  43.             pygame.image.load("images/enemy/enemy2_down2.png").convert_alpha(), \
  44.             pygame.image.load("images/enemy/enemy2_down3.png").convert_alpha(), \
  45.             pygame.image.load("images/enemy/enemy2_down4.png").convert_alpha() \
  46.             ])
  47.         self.rect = self.image.get_rect()
  48.         self.width, self.height = bg_size[0], bg_size[1]
  49.         self.speed = 1
  50.         self.active = True
  51.         self.rect.left, self.rect.top = \
  52.                         randint(0, self.width - self.rect.width), \
  53.                         randint(-10 * self.height, -self.height)
  54.         self.mask = pygame.mask.from_surface(self.image)
  55.         self.energy = MidEnemy.energy
  56.         self.hit = False
  57.         self.if_add_score = False

  58.     def move(self):
  59.         if self.rect.top < self.height:
  60.             self.rect.top += self.speed
  61.         else:
  62.             self.reset()

  63.     def reset(self):
  64.         self.active = True
  65.         self.energy = MidEnemy.energy
  66.         self.rect.left, self.rect.top = \
  67.                         randint(0, self.width - self.rect.width), \
  68.                         randint(-10 * self.height, -self.height)


  69. class BigEnemy(pygame.sprite.Sprite):
  70.     energy = 20
  71.    
  72.     def __init__(self, bg_size):
  73.         pygame.sprite.Sprite.__init__(self)

  74.         self.image1 = pygame.image.load("images/enemy/enemy3_n1.png").convert_alpha()
  75.         self.image2 = pygame.image.load("images/enemy/enemy3_n2.png").convert_alpha()
  76.         self.image_hit = pygame.image.load("images/enemy/enemy3_hit.png").convert_alpha()
  77.         self.destroy_images = []
  78.         self.destroy_images.extend([\
  79.             pygame.image.load("images/enemy/enemy3_down1.png").convert_alpha(), \
  80.             pygame.image.load("images/enemy/enemy3_down2.png").convert_alpha(), \
  81.             pygame.image.load("images/enemy/enemy3_down3.png").convert_alpha(), \
  82.             pygame.image.load("images/enemy/enemy3_down4.png").convert_alpha(), \
  83.             pygame.image.load("images/enemy/enemy3_down5.png").convert_alpha(), \
  84.             pygame.image.load("images/enemy/enemy3_down6.png").convert_alpha() \
  85.             ])
  86.         self.rect = self.image1.get_rect()
  87.         self.width, self.height = bg_size[0], bg_size[1]
  88.         self.speed = 1
  89.         self.active = True
  90.         self.rect.left, self.rect.top = \
  91.                         randint(0, self.width - self.rect.width), \
  92.                         randint(-15 * self.height, -5 * self.height)
  93.         self.mask = pygame.mask.from_surface(self.image1)
  94.         self.energy = BigEnemy.energy
  95.         self.hit = False
  96.         self.if_add_score = False

  97.     def move(self):
  98.         if self.rect.top < self.height:
  99.             self.rect.top += self.speed
  100.         else:
  101.             self.reset()

  102.     def reset(self):
  103.         self.active = True
  104.         self.energy = BigEnemy.energy
  105.         self.rect.left, self.rect.top = \
  106.                         randint(0, self.width - self.rect.width), \
  107.                         randint(-15 * self.height, -5 * self.height)
复制代码

bullet模块:
  1. import pygame

  2. class Bullet1(pygame.sprite.Sprite):
  3.     def __init__(self, position):
  4.         pygame.sprite.Sprite.__init__(self)

  5.         self.image = pygame.image.load("images/bullet/bullet1.png").convert_alpha()
  6.         self.rect = self.image.get_rect()
  7.         self.rect.left, self.rect.top = position
  8.         self.speed = 12
  9.         self.active = False
  10.         self.mask = pygame.mask.from_surface(self.image)

  11.     def move(self):
  12.         self.rect.top -= self.speed

  13.         if self.rect.top < 0:
  14.             self.active = False

  15.     def reset(self, position):
  16.         self.rect.left, self.rect.top = position
  17.         self.active = True

  18. class Bullet2(pygame.sprite.Sprite):
  19.     def __init__(self, position):
  20.         pygame.sprite.Sprite.__init__(self)

  21.         self.image = pygame.image.load("images/bullet/bullet2.png").convert_alpha()
  22.         self.rect = self.image.get_rect()
  23.         self.rect.left, self.rect.top = position
  24.         self.speed = 14
  25.         self.active = False
  26.         self.mask = pygame.mask.from_surface(self.image)

  27.     def move(self):
  28.         self.rect.top -= self.speed

  29.         if self.rect.top < 0:
  30.             self.active = False

  31.     def reset(self, position):
  32.         self.rect.left, self.rect.top = position
  33.         self.active = True

  34. class Bullet3(pygame.sprite.Sprite):
  35.     def __init__(self, position):
  36.         pygame.sprite.Sprite.__init__(self)

  37.         self.image = pygame.image.load("images/bullet/bullet3.png").convert_alpha()
  38.         self.rect = self.image.get_rect()
  39.         self.rect.left, self.rect.top = position
  40.         self.speed = 50
  41.         self.active = False
  42.         self.mask = pygame.mask.from_surface(self.image)

  43.     def move(self):
  44.         self.rect.top -= self.speed

  45.         if self.rect.top < 0:
  46.             self.active = False

  47.     def reset(self, position):
  48.         self.rect.left, self.rect.top = position
  49.         self.active = True

  50. class Bullet4(pygame.sprite.Sprite):
  51.     def __init__(self, position):
  52.         pygame.sprite.Sprite.__init__(self)

  53.         self.image = pygame.image.load("images/bullet/bullet4.png").convert_alpha()
  54.         self.rect = self.image.get_rect()
  55.         self.rect.left, self.rect.top = position
  56.         self.speed = 70
  57.         self.active = False
  58.         self.mask = pygame.mask.from_surface(self.image)

  59.     def move(self):
  60.         self.rect.top -= self.speed

  61.         if self.rect.top < 0:
  62.             self.active = False

  63.     def reset(self, position):
  64.         self.rect.left, self.rect.top = position
  65.         self.active = True
复制代码

supply模块:
  1. import pygame
  2. from random import *
  3.                  
  4. class Bomb_Supply(pygame.sprite.Sprite):
  5.     def __init__(self, bg_size):
  6.         pygame.sprite.Sprite.__init__(self)

  7.         self.image = pygame.image.load("images/supply/bomb_supply.png").convert_alpha()
  8.         self.rect = self.image.get_rect()
  9.         self.width, self.height = bg_size[0], bg_size[1]
  10.         self.rect.left, self.rect.bottom = \
  11.                         randint(0, self.width - self.rect.width), -100
  12.         self.speed = 5
  13.         self.active = False
  14.         self.mask = pygame.mask.from_surface(self.image)

  15.     def move(self):
  16.         if self.rect.top < self.height:
  17.             self.rect.top += self.speed
  18.         else:
  19.             self.active = False

  20.     def reset(self):
  21.         self.active = True
  22.         self.rect.left, self.rect.bottom = \
  23.                         randint(0, self.width - self.rect.width), -100

  24. class Medical_Supply(pygame.sprite.Sprite):
  25.     def __init__(self, bg_size):
  26.         pygame.sprite.Sprite.__init__(self)

  27.         self.image = pygame.image.load("images/supply/medical_supply.png").convert_alpha()
  28.         self.rect = self.image.get_rect()
  29.         self.width, self.height = bg_size[0], bg_size[1]
  30.         self.rect.left, self.rect.bottom = \
  31.                         randint(0, self.width - self.rect.width), -100
  32.         self.speed = 5
  33.         self.active = False
  34.         self.mask = pygame.mask.from_surface(self.image)

  35.     def move(self):
  36.         if self.rect.top < self.height:
  37.             self.rect.top += self.speed
  38.         else:
  39.             self.active = False

  40.     def reset(self):
  41.         self.active = True
  42.         self.rect.left, self.rect.bottom = \
  43.                         randint(0, self.width - self.rect.width), -100

  44. class Bullet_Update(pygame.sprite.Sprite):
  45.     def __init__(self, bg_size):
  46.         pygame.sprite.Sprite.__init__(self)

  47.         self.image = pygame.image.load("images/supply/bullet_update.png").convert_alpha()
  48.         self.rect = self.image.get_rect()
  49.         self.width, self.height = bg_size[0], bg_size[1]
  50.         self.rect.left, self.rect.bottom = \
  51.                         randint(0, self.width - self.rect.width), -100
  52.         self.speed = 5
  53.         self.active = False
  54.         self.mask = pygame.mask.from_surface(self.image)

  55.     def move(self):
  56.         if self.rect.top < self.height:
  57.             self.rect.top += self.speed
  58.         else:
  59.             self.active = False

  60.     def reset(self):
  61.         self.active = True
  62.         self.rect.left, self.rect.bottom = \
  63.                         randint(0, self.width - self.rect.width), -100
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-5-3 09:44:58 | 显示全部楼层
这么无敌~~~~~~~~~~~~~~
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-6 20:23:13 | 显示全部楼层
有每有源码 楼主?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-7 11:02:31 | 显示全部楼层
可以看看我的进阶版,这些道具都有,甚至还有boss 链接
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-5-7 11:13:26 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-5-7 13:07:34 | 显示全部楼层
大佬啊,
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-5-7 20:34:32 | 显示全部楼层
yanyongyu 发表于 2019-5-7 11:02
可以看看我的进阶版,这些道具都有,甚至还有boss 链接

我的这些素材就是在你这找的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-9-22 04:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表