鱼C论坛

 找回密码
 立即注册
查看: 6200|回复: 24

如何编写出小甲鱼的打飞机游戏

[复制链接]
发表于 2014-8-2 00:33:13 | 显示全部楼层 |阅读模式

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

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

x
大家好,看到小甲鱼老师的第13讲的时候,老师说已经够知识去编写之前说的打飞机游戏了,但我还是没有头绪,请老师和各位鱼油帮忙给出源代码进行学习,谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-8-6 18:05:15 | 显示全部楼层
Python制作的射击游戏
http://bbs.fishc.com/thread-36820-1-1.html
(出处: 鱼C论坛)
参考下这篇帖子就知道了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-2 01:22:02 | 显示全部楼层
个人感觉还差好多~{:7_181:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-2 02:07:02 | 显示全部楼层
说的是呢~~~@小甲鱼 老实一点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-2 02:34:58 | 显示全部楼层
要用到PyGame。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-2 02:58:03 | 显示全部楼层
还没教图形化编程、、
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-2 10:00:22 | 显示全部楼层
是啊是啊,感觉还有很多内容没讲
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-6 14:02:45 | 显示全部楼层
其实可以讲做一个游戏的全部详细过程
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-6 16:44:41 | 显示全部楼层
{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-8-6 17:52:39 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-8-6 18:03:37 | 显示全部楼层
是差不多可以写出后台逻辑吧:lol:
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-6 22:41:18 | 显示全部楼层
1121098405 发表于 2014-8-6 18:05
Python制作的射击游戏
http://bbs.fishc.com/thread-36820-1-1.html
(出处: 鱼C论坛)

感谢,但是要看得明白,我还是需要一段时间,唉,继续努力
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-7 07:49:59 | 显示全部楼层
同样期待呀!{:1_1:}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-7 10:18:51 | 显示全部楼层
rollerpig 发表于 2014-8-6 22:41
感谢,但是要看得明白,我还是需要一段时间,唉,继续努力

如果仅仅是看明白某段代码是起什么作用 那还是不难的
但想深入的话 就要费一番心思了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-7 11:09:48 | 显示全部楼层
看看哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-7 12:14:38 | 显示全部楼层
同样期待呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-7 13:45:42 | 显示全部楼层
嘻嘻
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-8-7 17:01:27 | 显示全部楼层
确实是写不出来啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-14 16:47:47 | 显示全部楼层
通过写游戏来入手是个非常好的途径
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-28 09:32:55 | 显示全部楼层
main.py:
  1. # main.py
  2. import pygame
  3. import sys
  4. import traceback
  5. import myplane
  6. import enemy
  7. import bullet
  8. import supply

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

  11. pygame.init()
  12. pygame.mixer.init()

  13. bg_size = width, height = 480, 700
  14. screen = pygame.display.set_mode(bg_size)
  15. pygame.display.set_caption("飞机大战 -- FishC Demo")

  16. background = pygame.image.load("images/background.png").convert()

  17. BLACK = (0, 0, 0)
  18. WHITE = (255, 255, 255)
  19. GREEN = (0, 255, 0)
  20. RED = (255, 0, 0)
  21. BLUE = (0, 0, 255)
  22. YW = (255, 255, 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.     me = myplane.MyPlane(bg_size)

  70.     enemies = pygame.sprite.Group()

  71.     # 生成敌方小型飞机
  72.     small_enemies = pygame.sprite.Group()
  73.     add_small_enemies(small_enemies, enemies, 15)

  74.     # 生成敌方中型飞机
  75.     mid_enemies = pygame.sprite.Group()
  76.     add_mid_enemies(mid_enemies, enemies, 4)

  77.     # 生成敌方大型飞机
  78.     big_enemies = pygame.sprite.Group()
  79.     add_big_enemies(big_enemies, enemies, 2)

  80.     # 生成普通子弹
  81.     bullet1 = []
  82.     bullet1_index = 0
  83.     BULLET1_NUM = 4
  84.     for i in range(BULLET1_NUM):
  85.         bullet1.append(bullet.Bullet1(me.rect.midtop))

  86.     # 生成超级子弹
  87.     bullet2 = []
  88.     bullet2_index = 0
  89.     BULLET2_NUM = 8
  90.     for i in range(BULLET2_NUM//2):
  91.         bullet2.append(bullet.Bullet2((me.rect.centerx-33, me.rect.centery)))
  92.         bullet2.append(bullet.Bullet2((me.rect.centerx+30, me.rect.centery)))

  93.     clock = pygame.time.Clock()

  94.     # 中弹图片索引
  95.     e1_destroy_index = 0
  96.     e2_destroy_index = 0
  97.     e3_destroy_index = 0
  98.     me_destroy_index = 0

  99.     # 统计得分
  100.     score = 0
  101.     score_font = pygame.font.Font("font/font.ttf", 36)

  102.     # 标志是否暂停游戏
  103.     paused = False
  104.     pause_nor_image = pygame.image.load("images/pause_nor.png").convert_alpha()
  105.     pause_pressed_image = pygame.image.load("images/pause_pressed.png").convert_alpha()
  106.     resume_nor_image = pygame.image.load("images/resume_nor.png").convert_alpha()
  107.     resume_pressed_image = pygame.image.load("images/resume_pressed.png").convert_alpha()
  108.     paused_rect = pause_nor_image.get_rect()
  109.     paused_rect.left, paused_rect.top = width - paused_rect.width - 10, 10
  110.     paused_image = pause_nor_image

  111.     # 设置难度级别
  112.     level = 1

  113.     # 全屏炸弹
  114.     bomb_image = pygame.image.load("images/bomb.png").convert_alpha()
  115.     bomb_rect = bomb_image.get_rect()
  116.     bomb_font = pygame.font.Font("font/font.ttf", 48)
  117.     bomb_num = 3

  118.     # 每30秒发放一个补给包
  119.     bullet_supply = supply.Bullet_Supply(bg_size)
  120.     bomb_supply = supply.Bomb_Supply(bg_size)
  121.     SUPPLY_TIME = USEREVENT
  122.     pygame.time.set_timer(SUPPLY_TIME, 30 * 1000)

  123.     # 超级子弹定时器
  124.     DOUBLE_BULLET_TIME = USEREVENT + 1

  125.     # 标志是否使用超级子弹
  126.     is_double_bullet = False

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

  129.     # 生命数量
  130.     life_image = pygame.image.load("images/life.png").convert_alpha()
  131.     life_rect = life_image.get_rect()
  132.     life_num = 3

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

  135.     # 游戏结束画面
  136.     gameover_font = pygame.font.Font("font/font.TTF", 48)
  137.     again_image = pygame.image.load("images/again.png").convert_alpha()
  138.     again_rect = again_image.get_rect()
  139.     gameover_image = pygame.image.load("images/gameover.png").convert_alpha()
  140.     gameover_rect = gameover_image.get_rect()

  141.     # 用于切换图片
  142.     switch_image = True

  143.     # 用于延迟
  144.     delay = 100

  145.     running = True

  146.     while running:
  147.         for event in pygame.event.get():
  148.             if event.type == QUIT:
  149.                 pygame.quit()
  150.                 sys.exit()

  151.             elif event.type == MOUSEBUTTONDOWN:
  152.                 if event.button == 1 and paused_rect.collidepoint(event.pos):
  153.                     paused = not paused
  154.                     if paused:
  155.                         pygame.time.set_timer(SUPPLY_TIME, 0)
  156.                         pygame.mixer.music.pause()
  157.                         pygame.mixer.pause()
  158.                     else:
  159.                         pygame.time.set_timer(SUPPLY_TIME, 30 * 1000)
  160.                         pygame.mixer.music.unpause()
  161.                         pygame.mixer.unpause()

  162.             elif event.type == MOUSEMOTION:
  163.                 if paused_rect.collidepoint(event.pos):
  164.                     if paused:
  165.                         paused_image = resume_pressed_image
  166.                     else:
  167.                         paused_image = pause_pressed_image
  168.                 else:
  169.                     if paused:
  170.                         paused_image = resume_nor_image
  171.                     else:
  172.                        paused_image = pause_nor_image

  173.             elif event.type == KEYDOWN:
  174.                 if event.key == K_SPACE:
  175.                     if bomb_num:
  176.                         bomb_num -= 1
  177.                         bomb_sound.play()
  178.                         for each in enemies:
  179.                             if each.rect.bottom > 0:
  180.                                 each.active = False

  181.             elif event.type == SUPPLY_TIME:
  182.                 supply_sound.play()
  183.                 if choice([True, False]):
  184.                     bomb_supply.reset()
  185.                 else:
  186.                     bullet_supply.reset()

  187.             elif event.type == DOUBLE_BULLET_TIME:
  188.                 is_double_bullet = False
  189.                 pygame.time.set_timer(DOUBLE_BULLET_TIME, 0)

  190.             elif event.type == INVINCIBLE_TIME:
  191.                 me.invincible = False
  192.                 pygame.time.set_timer(INVINCIBLE_TIME, 0)
  193.                         

  194.         # 根据用户的得分增加难度
  195.         if level == 1 and score > 50000:
  196.             level = 2
  197.             upgrade_sound.play()
  198.             # 增加3架小型敌机、2架中型敌机和1架大型敌机
  199.             add_small_enemies(small_enemies, enemies, 3)
  200.             add_mid_enemies(mid_enemies, enemies, 2)
  201.             add_big_enemies(big_enemies, enemies, 1)
  202.             # 提升小型敌机的速度
  203.             inc_speed(small_enemies, 1)
  204.         elif level == 2 and score > 300000:
  205.             level = 3
  206.             upgrade_sound.play()
  207.             # 增加5架小型敌机、3架中型敌机和2架大型敌机
  208.             add_small_enemies(small_enemies, enemies, 5)
  209.             add_mid_enemies(mid_enemies, enemies, 3)
  210.             add_big_enemies(big_enemies, enemies, 2)
  211.             # 提升小型敌机的速度
  212.             inc_speed(small_enemies, 1)
  213.             inc_speed(mid_enemies, 1)
  214.         elif level == 3 and score > 600000:
  215.             level = 4
  216.             upgrade_sound.play()
  217.             # 增加5架小型敌机、3架中型敌机和2架大型敌机
  218.             add_small_enemies(small_enemies, enemies, 5)
  219.             add_mid_enemies(mid_enemies, enemies, 3)
  220.             add_big_enemies(big_enemies, enemies, 2)
  221.             # 提升小型敌机的速度
  222.             inc_speed(small_enemies, 1)
  223.             inc_speed(mid_enemies, 1)
  224.         elif level == 4 and score > 1000000:
  225.             level = 5
  226.             upgrade_sound.play()
  227.             # 增加5架小型敌机、3架中型敌机和2架大型敌机
  228.             add_small_enemies(small_enemies, enemies, 5)
  229.             add_mid_enemies(mid_enemies, enemies, 3)
  230.             add_big_enemies(big_enemies, enemies, 2)
  231.             # 提升小型敌机的速度
  232.             inc_speed(small_enemies, 1)
  233.             inc_speed(mid_enemies, 1)
  234.             

  235.         screen.blit(background, (0, 0))
  236.                
  237.         if life_num and not paused:
  238.             # 检测用户的键盘操作
  239.             key_pressed = pygame.key.get_pressed()

  240.             if key_pressed[K_w] or key_pressed[K_UP]:
  241.                 me.moveUp()
  242.             if key_pressed[K_s] or key_pressed[K_DOWN]:
  243.                 me.moveDown()
  244.             if key_pressed[K_a] or key_pressed[K_LEFT]:
  245.                 me.moveLeft()
  246.             if key_pressed[K_d] or key_pressed[K_RIGHT]:
  247.                 me.moveRight()

  248.             # 绘制全屏炸弹补给并检测是否获得
  249.             if bomb_supply.active:
  250.                 bomb_supply.move()
  251.                 screen.blit(bomb_supply.image, bomb_supply.rect)
  252.                 if pygame.sprite.collide_mask(bomb_supply, me):
  253.                     get_bomb_sound.play()
  254.                     if bomb_num < 3:
  255.                         bomb_num += 1
  256.                     bomb_supply.active = False

  257.             # 绘制超级子弹补给并检测是否获得
  258.             if bullet_supply.active:
  259.                 bullet_supply.move()
  260.                 screen.blit(bullet_supply.image, bullet_supply.rect)
  261.                 if pygame.sprite.collide_mask(bullet_supply, me):
  262.                     get_bullet_sound.play()
  263.                     is_double_bullet = True
  264.                     pygame.time.set_timer(DOUBLE_BULLET_TIME, 18 * 1000)
  265.                     bullet_supply.active = False

  266.             # 发射子弹
  267.             if not(delay % 10):
  268.                 bullet_sound.play()
  269.                 if is_double_bullet:
  270.                     bullets = bullet2
  271.                     bullets[bullet2_index].reset((me.rect.centerx-33, me.rect.centery))
  272.                     bullets[bullet2_index+1].reset((me.rect.centerx+30, me.rect.centery))
  273.                     bullet2_index = (bullet2_index + 2) % BULLET2_NUM
  274.                 else:
  275.                     bullets = bullet1
  276.                     bullets[bullet1_index].reset(me.rect.midtop)
  277.                     bullet1_index = (bullet1_index + 1) % BULLET1_NUM

  278.                
  279.             # 检测子弹是否击中敌机
  280.             for b in bullets:
  281.                 if b.active:
  282.                     b.move()
  283.                     screen.blit(b.image, b.rect)
  284.                     enemy_hit = pygame.sprite.spritecollide(b, enemies, False, pygame.sprite.collide_mask)
  285.                     if enemy_hit:
  286.                         b.active = False
  287.                         for e in enemy_hit:
  288.                             if e in mid_enemies or e in big_enemies:
  289.                                 e.hit = True
  290.                                 e.energy -= 1
  291.                                 if e.energy == 0:
  292.                                     e.active = False
  293.                             else:
  294.                                 e.active = False
  295.             
  296.             # 绘制大型敌机
  297.             for each in big_enemies:
  298.                 if each.active:
  299.                     each.move()
  300.                     if each.hit:
  301.                         screen.blit(each.image_hit, each.rect)
  302.                         each.hit = False
  303.                     else:
  304.                         if switch_image:
  305.                             screen.blit(each.image1, each.rect)
  306.                         else:
  307.                             screen.blit(each.image2, each.rect)

  308.                     # 绘制血槽
  309.                     pygame.draw.line(screen, BLACK, \
  310.                                      (each.rect.left, each.rect.top - 5), \
  311.                                      (each.rect.right, each.rect.top - 5), \
  312.                                      2)
  313.                     # 当生命大于20%显示绿色,否则显示红色
  314.                     energy_remain = each.energy / enemy.BigEnemy.energy
  315.                     if energy_remain > 0.2:
  316.                         energy_color = GREEN
  317.                     else:
  318.                         energy_color = RED
  319.                     pygame.draw.line(screen, energy_color, \
  320.                                      (each.rect.left, each.rect.top - 5), \
  321.                                      (each.rect.left + each.rect.width * energy_remain, \
  322.                                       each.rect.top - 5), 2)
  323.                         
  324.                     # 即将出现在画面中,播放音效
  325.                     if each.rect.bottom == -50:
  326.                         enemy3_fly_sound.play(-1)
  327.                 else:
  328.                     # 毁灭
  329.                     if not(delay % 3):
  330.                         if e3_destroy_index == 0:
  331.                             enemy3_down_sound.play()
  332.                         screen.blit(each.destroy_images[e3_destroy_index], each.rect)
  333.                         e3_destroy_index = (e3_destroy_index + 1) % 6
  334.                         if e3_destroy_index == 0:
  335.                             enemy3_fly_sound.stop()
  336.                             score += 10000
  337.                             each.reset()

  338.             # 绘制中型敌机:
  339.             for each in mid_enemies:
  340.                 if each.active:
  341.                     each.move()

  342.                     if each.hit:
  343.                         screen.blit(each.image_hit, each.rect)
  344.                         each.hit = False
  345.                     else:
  346.                         screen.blit(each.image, each.rect)

  347.                     # 绘制血槽
  348.                     pygame.draw.line(screen, BLUE, \
  349.                                      (each.rect.left, each.rect.top - 5), \
  350.                                      (each.rect.right, each.rect.top - 5), \
  351.                                      2)
  352.                     # 当生命大于20%显示绿色,否则显示红色
  353.                     energy_remain = each.energy / enemy.MidEnemy.energy
  354.                     if energy_remain > 0.2:
  355.                         energy_color = YW
  356.                     else:
  357.                         energy_color = GREEN
  358.                     pygame.draw.line(screen, energy_color, \
  359.                                      (each.rect.left, each.rect.top - 5), \
  360.                                      (each.rect.left + each.rect.width * energy_remain, \
  361.                                       each.rect.top - 5), 2)
  362.                 else:
  363.                     # 毁灭
  364.                     if not(delay % 3):
  365.                         if e2_destroy_index == 0:
  366.                             enemy2_down_sound.play()
  367.                         screen.blit(each.destroy_images[e2_destroy_index], each.rect)
  368.                         e2_destroy_index = (e2_destroy_index + 1) % 4
  369.                         if e2_destroy_index == 0:
  370.                             score += 6000
  371.                             each.reset()

  372.             # 绘制小型敌机:
  373.             for each in small_enemies:
  374.                 if each.active:
  375.                     each.move()
  376.                     screen.blit(each.image, each.rect)
  377.                 else:
  378.                     # 毁灭
  379.                     if not(delay % 3):
  380.                         if e1_destroy_index == 0:
  381.                             enemy1_down_sound.play()
  382.                         screen.blit(each.destroy_images[e1_destroy_index], each.rect)
  383.                         e1_destroy_index = (e1_destroy_index + 1) % 4
  384.                         if e1_destroy_index == 0:
  385.                             score += 1000
  386.                             each.reset()

  387.             # 检测我方飞机是否被撞
  388.             enemies_down = pygame.sprite.spritecollide(me, enemies, False, pygame.sprite.collide_mask)
  389.             if enemies_down and not me.invincible:
  390.                 me.active = False
  391.                 for e in enemies_down:
  392.                     e.active = False
  393.             
  394.             # 绘制我方飞机
  395.             if me.active:
  396.                 if switch_image:
  397.                     screen.blit(me.image1, me.rect)
  398.                 else:
  399.                     screen.blit(me.image2, me.rect)
  400.             else:
  401.                 # 毁灭
  402.                 if not(delay % 3):
  403.                     if me_destroy_index == 0:
  404.                         me_down_sound.play()
  405.                     screen.blit(me.destroy_images[me_destroy_index], me.rect)
  406.                     me_destroy_index = (me_destroy_index + 1) % 4
  407.                     if me_destroy_index == 0:
  408.                         life_num -= 1
  409.                         me.reset()
  410.                         pygame.time.set_timer(INVINCIBLE_TIME, 3 * 1000)

  411.             # 绘制全屏炸弹数量
  412.             bomb_text = bomb_font.render("× %d" % bomb_num, True, WHITE)
  413.             text_rect = bomb_text.get_rect()
  414.             screen.blit(bomb_image, (10, height - 10 - bomb_rect.height))
  415.             screen.blit(bomb_text, (20 + bomb_rect.width, height - 5 - text_rect.height))

  416.             # 绘制剩余生命数量
  417.             if life_num:
  418.                 for i in range(life_num):
  419.                     screen.blit(life_image, \
  420.                                 (width-10-(i+1)*life_rect.width, \
  421.                                  height-10-life_rect.height))

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

  425.         # 绘制游戏结束画面
  426.         elif life_num == 0:
  427.             # 背景音乐停止
  428.             pygame.mixer.music.stop()

  429.             # 停止全部音效
  430.             pygame.mixer.stop()

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

  433.             if not recorded:
  434.                 recorded = True
  435.                 # 读取历史最高得分
  436.                 with open("record.txt", "r") as f:
  437.                     record_score = int(f.read())

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

  442.             # 绘制结束画面
  443.             record_score_text = score_font.render("Best : %d" % record_score, True, (255, 255, 255))
  444.             screen.blit(record_score_text, (50, 50))
  445.             
  446.             gameover_text1 = gameover_font.render("Your Score", True, (255, 255, 255))
  447.             gameover_text1_rect = gameover_text1.get_rect()
  448.             gameover_text1_rect.left, gameover_text1_rect.top = \
  449.                                  (width - gameover_text1_rect.width) // 2, height // 3
  450.             screen.blit(gameover_text1, gameover_text1_rect)
  451.             
  452.             gameover_text2 = gameover_font.render(str(score), True, (255, 255, 255))
  453.             gameover_text2_rect = gameover_text2.get_rect()
  454.             gameover_text2_rect.left, gameover_text2_rect.top = \
  455.                                  (width - gameover_text2_rect.width) // 2, \
  456.                                  gameover_text1_rect.bottom + 10
  457.             screen.blit(gameover_text2, gameover_text2_rect)

  458.             again_rect.left, again_rect.top = \
  459.                              (width - again_rect.width) // 2, \
  460.                              gameover_text2_rect.bottom + 50
  461.             screen.blit(again_image, again_rect)

  462.             gameover_rect.left, gameover_rect.top = \
  463.                                 (width - again_rect.width) // 2, \
  464.                                 again_rect.bottom + 10
  465.             screen.blit(gameover_image, gameover_rect)

  466.             # 检测用户的鼠标操作
  467.             # 如果用户按下鼠标左键
  468.             if pygame.mouse.get_pressed()[0]:
  469.                 # 获取鼠标坐标
  470.                 pos = pygame.mouse.get_pos()
  471.                 # 如果用户点击“重新开始”
  472.                 if again_rect.left < pos[0] < again_rect.right and \
  473.                    again_rect.top < pos[1] < again_rect.bottom:
  474.                     # 调用main函数,重新开始游戏
  475.                     main()
  476.                 # 如果用户点击“结束游戏”            
  477.                 elif gameover_rect.left < pos[0] < gameover_rect.right and \
  478.                      gameover_rect.top < pos[1] < gameover_rect.bottom:
  479.                     # 退出游戏
  480.                     pygame.quit()
  481.                     sys.exit()      

  482.         # 绘制暂停按钮
  483.         screen.blit(paused_image, paused_rect)

  484.         # 切换图片
  485.         if not(delay % 5):
  486.             switch_image = not switch_image

  487.         delay -= 1
  488.         if not delay:
  489.             delay = 100

  490.         pygame.display.flip()
  491.         clock.tick(60)
  492.         
  493. if __name__ == "__main__":
  494.     try:
  495.         main()
  496.     except SystemExit:
  497.         pass
  498.     except:
  499.         traceback.print_exc()
  500.         pygame.quit()
  501.         input()
复制代码

myplane.py:
  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/me1.png").convert_alpha()
  6.         self.image2 = pygame.image.load("images/me2.png").convert_alpha()
  7.         self.destroy_images = []
  8.         self.destroy_images.extend([\
  9.             pygame.image.load("images/me_destroy_1.png").convert_alpha(), \
  10.             pygame.image.load("images/me_destroy_2.png").convert_alpha(), \
  11.             pygame.image.load("images/me_destroy_3.png").convert_alpha(), \
  12.             pygame.image.load("images/me_destroy_4.png").convert_alpha() \
  13.             ])
  14.         self.rect = self.image1.get_rect()
  15.         self.width, self.height = bg_size[0], bg_size[1]
  16.         self.rect.left, self.rect.top = \
  17.                         (self.width - self.rect.width) // 2, \
  18.                         self.height - self.rect.height - 60
  19.         self.speed = 10
  20.         self.active = True
  21.         self.invincible = False
  22.         self.mask = pygame.mask.from_surface(self.image1)

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

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

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

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

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

enemy.py:
  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/enemy1.png").convert_alpha()
  7.         self.destroy_images = []
  8.         self.destroy_images.extend([\
  9.             pygame.image.load("images/enemy1_down1.png").convert_alpha(), \
  10.             pygame.image.load("images/enemy1_down2.png").convert_alpha(), \
  11.             pygame.image.load("images/enemy1_down3.png").convert_alpha(), \
  12.             pygame.image.load("images/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.     def move(self):
  23.         if self.rect.top < self.height:
  24.             self.rect.top += self.speed
  25.         else:
  26.             self.reset()

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


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

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

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

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


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

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

  94.     def move(self):
  95.         if self.rect.top < self.height:
  96.             self.rect.top += self.speed
  97.         else:
  98.             self.reset()

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

bullet.py:
  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/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/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.    
复制代码

supply.py:
  1. import pygame
  2. from random import *

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

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

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

  19.     def reset(self):
  20.         self.active = True
  21.         self.rect.left, self.rect.bottom = \
  22.                         randint(0, self.width - self.rect.width), -100
  23.                  
  24. class Bomb_Supply(pygame.sprite.Sprite):
  25.     def __init__(self, bg_size):
  26.         pygame.sprite.Sprite.__init__(self)

  27.         self.image = pygame.image.load("images/bomb_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                                          
复制代码


pygame:切换到命令提示符,输入pip install pygame
素材:链接:https://pan.baidu.com/s/1smheMmx 密码:c94r




想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 15:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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