鱼C论坛

 找回密码
 立即注册
查看: 4671|回复: 4

关于小甲鱼老师的打飞机游戏一共2个问题 我的出现一种BUg

[复制链接]
发表于 2016-10-29 21:52:04 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 ppp111 于 2016-10-29 22:35 编辑

请大牛 帮我  看看哪里出问题了??

问题1:
关于小甲鱼老师的打飞机游戏  我的出现一种BUFF 就是好像 我在飞机没出来 或者说  飞机刚冒一个头时  打他  它的血量会无限扣   并且不死  

我后面想到了  如果我 if e.energy == 0: 改成 if e.energy <= 0:  就不会出现这问题了

现在问题变为: 这种情况只出现  我前面提到的   飞机只冒一个头  或者还没冒身  我的子弹打到它的    然后等它完全出来后  血就一直扣  不会死

如果我没打到敌机  或者敌机已经完全裸露的情况   我打它  他会死的  为什么会出现这种BUG

----------------------------------------------------
问题2:
又发现了一个BUG  这个BUG是在if e.energy == 0: 改成 if e.energy <= 0:的情况下出现的
我还没有想到解决方法
打到后面冒出来的 中敌机  和 大敌机都是残血   刚才上错压缩包了   现在我没法上图片    只能口头描述     我把我的飞机靠站一边   我的飞机是不死的 我  # me.active = False    我测试的比较久    那些残血飞机   我补下刀他们会死的    但是怎么冒出来  就是残血了

  

就是好像 我在飞机没出来 或者说 飞机刚冒一个头时 打他 它的血量会无限扣 并且不死

就是好像 我在飞机没出来 或者说  飞机刚冒一个头时  打他  它的血量会无限扣   并且不死

就是好像 我在飞机没出来 或者说 飞机刚冒一个头时 打他 它的血量会无限扣 并且不死

就是好像 我在飞机没出来 或者说  飞机刚冒一个头时  打他  它的血量会无限扣   并且不死


  1. # main.py
  2. import pygame
  3. import sys
  4. import traceback
  5. import myplane
  6. import bullet
  7. import enemy
  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. # 载入游戏音乐
  22. pygame.mixer.music.load("sound/game_music.ogg")
  23. pygame.mixer.music.set_volume(0.2)
  24. bullet_sound = pygame.mixer.Sound("sound/bullet.wav")
  25. bullet_sound.set_volume(0.2)
  26. bomb_sound = pygame.mixer.Sound("sound/use_bomb.wav")
  27. bomb_sound.set_volume(0.2)
  28. supply_sound = pygame.mixer.Sound("sound/supply.wav")
  29. supply_sound.set_volume(0.2)
  30. get_bomb_sound = pygame.mixer.Sound("sound/get_bomb.wav")
  31. get_bomb_sound.set_volume(0.2)
  32. get_bullet_sound = pygame.mixer.Sound("sound/get_bullet.wav")
  33. get_bullet_sound.set_volume(0.2)
  34. upgrade_sound = pygame.mixer.Sound("sound/upgrade.wav")
  35. upgrade_sound.set_volume(0.2)
  36. enemy3_fly_sound = pygame.mixer.Sound("sound/enemy3_flying.wav")
  37. enemy3_fly_sound.set_volume(0.2)
  38. enemy1_down_sound = pygame.mixer.Sound("sound/enemy1_down.wav")
  39. enemy1_down_sound.set_volume(0.1)
  40. enemy2_down_sound = pygame.mixer.Sound("sound/enemy2_down.wav")
  41. enemy2_down_sound.set_volume(0.2)
  42. enemy3_down_sound = pygame.mixer.Sound("sound/enemy3_down.wav")
  43. enemy3_down_sound.set_volume(0.5)
  44. me_down_sound = pygame.mixer.Sound("sound/me_down.wav")
  45. me_down_sound.set_volume(0.2)

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

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

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

  61. def main():
  62.     pygame.mixer.music.play(-1)

  63.     # 生成我方飞机
  64.     me = myplane.MyPlane(bg_size)

  65.     enemies = pygame.sprite.Group()

  66.     #生成敌方小型飞机
  67.     small_enemies = pygame.sprite.Group()
  68.     add_small_enemies(small_enemies,enemies,15)

  69.     # 生成敌方中型飞机
  70.     mid_enemies = pygame.sprite.Group()
  71.     add_mid_enemies(mid_enemies, enemies, 4)

  72.     # 生成敌方大型飞机
  73.     big_enemies = pygame.sprite.Group()
  74.     add_big_enemies(big_enemies, enemies, 2)

  75.     #生成普通子弹
  76.     bullet1 = []
  77.     bullet1_index = 0
  78.     BULLET1_NUM = 4
  79.     for i in range(BULLET1_NUM):
  80.         bullet1.append(bullet.Bullet1(me.rect.midtop))

  81.     clock = pygame.time.Clock()

  82.     #中弹图片索引
  83.     e1_destroy_index = 0
  84.     e2_destroy_index = 0
  85.     e1_destroy_index = 0
  86.     me_destroy_index = 0

  87.     #统计得分
  88.     score = 0
  89.     score_font = pygame.font.Font("font/font.ttf ",36)

  90.     #标准是否暂停游戏
  91.     paused = False
  92.     pause_nor_image = pygame.image.load("images/pause_nor.png").convert_alpha()
  93.     pause_pressed_image = pygame.image.load("images/pause_pressed.png").convert_alpha()
  94.     resume_nor_image = pygame.image.load("images/resume_nor.png").convert_alpha()
  95.     resume_pressed_image = pygame.image.load("images/resume_pressed.png").convert_alpha()
  96.     paused_rect = pause_nor_image.get_rect()
  97.     paused_rect.left, paused_rect.top = width - paused_rect.width -10,10
  98.     paused_image = pause_nor_image

  99.     #用于切换图片
  100.     switch_image = True

  101.     #用于延迟
  102.     delay = 100
  103.     running = True

  104.     while running:
  105.         for event in pygame.event.get():
  106.             if event.type == QUIT:
  107.                 pygame.quit()
  108.                 sys.exit()

  109.             elif event.type == MOUSEBUTTONDOWN:
  110.                 if event.button == 1 and paused_rect.collidepoint(event.pos):
  111.                     paused = not paused

  112.             elif event.type == MOUSEMOTION:
  113.                 if paused_rect.collidepoint(event.pos):
  114.                     if paused:
  115.                         paused_image = resume_pressed_image
  116.                     else:
  117.                         paused_image = pause_pressed_image
  118.                 else:
  119.                     if paused:
  120.                         paused_image = resume_nor_image
  121.                     else:
  122.                         paused_image = pause_nor_image

  123.         screen.blit(background, (0, 0))

  124.         if not paused:
  125.             #检测用户的键盘操作
  126.             key_pressed = pygame.key.get_pressed()

  127.             if key_pressed[K_w] or key_pressed[K_UP]:
  128.                 me.moveUp()
  129.             if key_pressed[K_s] or key_pressed[K_DOWN]:
  130.                 me.moveDown()
  131.             if key_pressed[K_a] or key_pressed[K_LEFT]:
  132.                     me.moveLeft()
  133.             if key_pressed[K_d] or key_pressed[K_RIGHT]:
  134.                 me.moveRight()

  135.             # 发射子弹
  136.             if not(delay % 10):
  137.                 bullet1[bullet1_index].reset(me.rect.midtop)
  138.                 bullet1_index =(bullet1_index + 1) % BULLET1_NUM

  139.             #检测子弹是否击中敌机
  140.             for b in bullet1:
  141.                 if b.active:
  142.                     b.move()
  143.                     screen.blit(b.image,b.rect)
  144.                     enemy_hit = pygame.sprite.spritecollide(b,enemies,False,pygame.sprite.collide_mask)
  145.                     if enemy_hit:
  146.                         b.active = False
  147.                         for e in enemy_hit:
  148.                             if e in mid_enemies or e in big_enemies:
  149.                                 e.hit = True
  150.                                 e.energy -= 1
  151.                                 if e.energy == 0:
  152.                                     e.active = False
  153.                             else:
  154.                                 e.active = False

  155.             #绘制大型飞机
  156.             for each in big_enemies:
  157.                 if each.active:
  158.                     each.move()
  159.                     if each.hit:
  160.                         #绘制被打到的特效
  161.                         screen.blit(each.image_hit, each.rect)
  162.                         each.hit = False
  163.                     else:
  164.                         if switch_image:
  165.                             screen.blit(each.image1, each.rect)
  166.                         else:
  167.                             screen.blit(each.image2, each.rect)

  168.                     #绘制血槽
  169.                     pygame.draw.line(screen,BLACK,\
  170.                                     (each.rect.left,each.rect.top - 5),\
  171.                                     (each.rect.right,each.rect.top -5),\
  172.                                     2)

  173.                     #当生命大于20%显示绿色,否则显示红色
  174.                     energy_remain = each.energy / enemy.BigEnemy.energy
  175.                     if energy_remain > 0.2:
  176.                         energy_color = GREEN
  177.                     else:
  178.                         energy_color = RED
  179.                     pygame.draw.line(screen, energy_color,\
  180.                                      (each.rect.left,each.rect.top - 5),\
  181.                                      (each.rect.left + each.rect.width * energy_remain,\
  182.                                       each.rect.top - 5),2)

  183.                     #即将出现在画面中,播放音效
  184.                     if each.rect.bottom == -50:
  185.                         enemy3_fly_sound.play(-1)
  186.                 else:
  187.                     #毁灭
  188.                     if not (delay % 3):
  189.                         if e1_destroy_index == 0:
  190.                             enemy3_down_sound.play()
  191.                         screen.blit(each.destroy_images[e1_destroy_index],each.rect)
  192.                         e1_destroy_index = (e1_destroy_index+1) % 6
  193.                         if e1_destroy_index == 0:
  194.                             enemy3_fly_sound.stop()
  195.                             score += 10000
  196.                             each.reset()

  197.             # 绘制中型飞机
  198.             for each in mid_enemies:
  199.                 if each.active:
  200.                     each.move()

  201.                     if each.hit:
  202.                         #绘制被打倒的特效
  203.                         screen.blit(each.image_hit, each.rect)
  204.                         each.hit = False
  205.                     else:
  206.                         screen.blit(each.image, each.rect)

  207.                     # 绘制血槽
  208.                     pygame.draw.line(screen, BLACK,\
  209.                                     (each.rect.left, each.rect.top - 5), \
  210.                                     (each.rect.right, each.rect.top - 5), \
  211.                                     2)

  212.                     # 当生命大于20%显示绿色,否则显示红色
  213.                     energy_remain = each.energy / enemy.MidEnemy.energy
  214.                     if energy_remain > 0.2:
  215.                         energy_color = GREEN
  216.                     else:
  217.                         energy_color = RED
  218.                     pygame.draw.line(screen, energy_color, \
  219.                                      (each.rect.left, each.rect.top - 5), \
  220.                                      (each.rect.left + each.rect.width * energy_remain, \
  221.                                       each.rect.top - 5), 2)
  222.                 else:
  223.                     #毁灭
  224.                     if not (delay % 3):
  225.                         if e2_destroy_index == 0:
  226.                             enemy2_down_sound.play()
  227.                         screen.blit(each.destroy_images[e2_destroy_index],each.rect)
  228.                         e2_destroy_index = (e2_destroy_index+1) % 4
  229.                         if e2_destroy_index == 0:
  230.                             score += 6000
  231.                             each.reset()

  232.             # 绘制小型飞机
  233.             for each in small_enemies:
  234.                 if each.active:
  235.                     each.move()
  236.                     screen.blit(each.image, each.rect)
  237.                 else:
  238.                     #毁灭
  239.                     if not (delay % 3):
  240.                         if e1_destroy_index == 0:
  241.                             enemy1_down_sound.play()
  242.                         screen.blit(each.destroy_images[e1_destroy_index], each.rect)
  243.                         e1_destroy_index = (e1_destroy_index+1) % 4
  244.                         if e1_destroy_index == 0:
  245.                             score += 1000
  246.                             each.reset()

  247.             #检测我方飞机是否被撞
  248.             enemies_down = pygame.sprite.spritecollide(me,enemies,False,pygame.sprite.collide_mask)
  249.             if enemies_down:
  250.                 # me.active = False
  251.                 for e in enemies_down:
  252.                     e.active = False

  253.             #绘制我方飞机
  254.             if me.active:
  255.                 if switch_image:
  256.                     screen.blit(me.image1,me.rect)
  257.                 else:
  258.                     screen.blit(me.image2, me.rect)
  259.             else:
  260.                 #毁灭
  261.                 if not (delay % 3):
  262.                     if me_destroy_index == 0:
  263.                         me_down_sound.play()
  264.                     screen.blit(me.destroy_images[me_destroy_index],each.rect)
  265.                     me_destroy_index = (me_destroy_index+1) % 4
  266.                     if me_destroy_index == 0:
  267.                         print("Game Over!")
  268.                         running = False

  269.         score_text = score_font.render("Score : %s" % str(score), True, WHITE)
  270.         screen.blit(score_text, (10, 5))

  271.         #绘制暂停按钮
  272.         screen.blit(paused_image,paused_rect)

  273.         #切换图片
  274.         if not(delay % 5):
  275.             switch_image = not switch_image

  276.         delay -= 1
  277.         if not delay:
  278.             delay = 100

  279.         pygame.display.flip()
  280.         clock.tick(60)
  281.         
  282. if __name__ == "__main__":
  283.     try:
  284.         main()
  285.     except SystemExit:
  286.         pass
  287.     except:
  288.         traceback.print_exc()
  289.         pygame.quit()
  290.         input()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-10-29 22:13:15 | 显示全部楼层
本帖最后由 ppp111 于 2016-10-29 22:38 编辑

我误点了  已解决   好像撤不会来了   第一次发这种问题贴    大牛  麻烦你们看下   问题没解决
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-10-30 07:58:03 | 显示全部楼层
召唤大神来解答
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-17 19:15:53 | 显示全部楼层
我也遇到了,想来想去,都没解决。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-11-17 19:48:05 | 显示全部楼层
我刚才直接在 enemy模块中,中型和大型敌机的reset方法中,添加了energy等于初始状态值,就解决了这个问题。从代码分析角度,我看不出来。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-23 15:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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