鱼C论坛

 找回密码
 立即注册
查看: 1981|回复: 2

[已解决]pygame关于游戏等级问题

[复制链接]
发表于 2017-7-14 18:13:04 | 显示全部楼层 |阅读模式

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

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

x
设置游戏分数到达20000分时,游戏难度增加,如果我用以下一段代码,分数到达20000分的那一刻,游戏会卡住

  1.                 if score==20000:
  2.                         level_up_sound.play()
  3.                         add_small_enemies(small_enemies,enemies,1)
  4.                         add_mid_enemies(mid_enemies,enemies,1)
  5.                         add_big_enemies(big_enemies,enemies,1)
  6.                         for each in enemies:
  7.                                 each.speed[1]+=1
复制代码


而我用下面一段代码,则游戏正常,这是为什么?有点想不明白
  1.                 if level==1 and score>20000:
  2.                         level=2
  3.                         level_up_sound.play()
  4.                         add_small_enemies(small_enemies,enemies,1)
  5.                         add_mid_enemies(mid_enemies,enemies,1)
  6.                         add_big_enemies(big_enemies,enemies,1)
  7.                         for each in enemies:
  8.                                 each.speed[1]+=1
复制代码


以下是游戏源代码
  1. import sys
  2. import pygame
  3. import traceback
  4. import myplan
  5. import enemy
  6. import bullet
  7. from pygame.locals import *
  8. from random import *
  9. #初始化以及加载背景
  10. pygame.init()
  11. pygame.mixer.init()
  12. clock=pygame.time.Clock()
  13. bg_size=width,height = 400,650
  14. screen=pygame.display.set_mode(bg_size)#创建一个宽600,高四百的窗口
  15. pygame.display.set_caption("飞机大战") #设置标题
  16. background=pygame.image.load('image/background.png') #加载背景图片
  17. BLACK=(0,0,0)
  18. GREEN=(0,255,0)
  19. RED=(255,0,0)
  20. WHITE=(255,255,255)

  21. #载入游戏音乐
  22. pygame.mixer.music.load("sound/game_music.wav")
  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. big_enemy_flying_sound = pygame.mixer.Sound("sound/big_spaceship_flying.wav")
  27. big_enemy_flying_sound.set_volume(0.1)
  28. enemy1_down_sound = pygame.mixer.Sound("sound/enemy1_down.wav")
  29. enemy1_down_sound.set_volume(0.2)
  30. enemy2_down_sound = pygame.mixer.Sound("sound/enemy2_down.wav")
  31. enemy2_down_sound.set_volume(0.2)
  32. enemy3_down_sound = pygame.mixer.Sound("sound/enemy3_down.wav")
  33. enemy3_down_sound.set_volume(0.2)
  34. me_down_sound = pygame.mixer.Sound("sound/game_over.wav")
  35. me_down_sound.set_volume(0.2)
  36. button_down_sound = pygame.mixer.Sound("sound/button.wav")
  37. button_down_sound.set_volume(0.2)
  38. level_up_sound = pygame.mixer.Sound("sound/achievement.wav")
  39. level_up_sound.set_volume(0.2)
  40. bomb_sound = pygame.mixer.Sound("sound/use_bomb.wav")
  41. bomb_sound.set_volume(0.2)
  42. get_bomb_sound = pygame.mixer.Sound("sound/get_bomb.wav")
  43. get_bomb_sound.set_volume(0.2)
  44. get_bullet_sound = pygame.mixer.Sound("sound/get_double_laser.wav")
  45. get_bullet_sound.set_volume(0.2)

  46. #向组中添加大中小飞机函数
  47. def add_small_enemies(group1,group2,num):
  48.         for i in range(num):
  49.                 small_enemie=enemy.SmallEnemy(bg_size)
  50.                 group1.add(small_enemie)
  51.                 group2.add(small_enemie)

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

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


  62. def main():
  63.         switch_image=False #控制我放飞机两张图片切换的标志位
  64.         switch_bullet=0 #切换子弹,普通子弹是0,蓝色子弹为1
  65.         me_life_num=3 #我方出场有三条命
  66.         delay=60#延迟参数
  67.         score=0#得分统计
  68.         level=1#游戏等级
  69.         paused=False #标志是否暂停游戏
  70.         pause_nor_image=pygame.image.load('image/game_pause_nor.png').convert_alpha()
  71.         pause_pressed_image=pygame.image.load('image/game_pause_pressed.png').convert_alpha()
  72.         resume_nor_image=pygame.image.load('image/game_resume_nor.png').convert_alpha()
  73.         resume_pressed_image=pygame.image.load('image/game_resume_pressed.png').convert_alpha()
  74.         paused_rect=pause_nor_image.get_rect()
  75.         paused_rect.left,paused_rect.top=width-paused_rect.width-10,10
  76.         paused_image=pause_nor_image

  77.         #炸弹图片加载
  78.         bomb_num=3
  79.         bomb_image=pygame.image.load('image/bomb.png').convert_alpha()
  80.         bomb_rect=bomb_image.get_rect()
  81.         bomb_rect.left,bomb_rect.top=10,height-bomb_rect.height-10
  82.         #生命图片显示
  83.         me_life_image=pygame.image.load('image/life.png').convert_alpha()
  84.         me_life_rect=me_life_image.get_rect()

  85.         score_font=pygame.font.Font('font/font.ttf',36) #自定义字体
  86.         pygame.mixer.music.play(-1) #循环播放背景音乐
  87.         clock=pygame.time.Clock()
  88.         runnning=True

  89.         #设置定时器,没30秒发放一个补给包
  90.         bullet_supply=bullet.Bullet_supply(bg_size)
  91.         bomb_supply=bullet.Bomb_supply(bg_size)
  92.         SUPPLE_TIME = USEREVENT #自定义事件
  93.         pygame.time.set_timer(SUPPLE_TIME,30*1000)



  94.         me=myplan.MyPlan(bg_size)#生成自己的飞机
  95.         enemies = pygame.sprite.Group()#敌方飞机总组

  96.         small_enemies=pygame.sprite.Group()#生成小飞机组
  97.         add_small_enemies(small_enemies,enemies,15)

  98.         mid_enemies=pygame.sprite.Group()#生成中飞机组
  99.         add_mid_enemies(mid_enemies,enemies,4)

  100.         big_enemies=pygame.sprite.Group()#生成大飞机组
  101.         add_big_enemies(big_enemies,enemies,2)

  102.         bullet1=[]
  103.         bullet1_index=0 #子弹索引
  104.         for i in range(6): #定义了6个普通子弹
  105.                 bullet1.append(bullet.Bullet1(me.rect.midtop)) #子弹的初始位置为我方飞机头部正中央

  106.         bullet2=[]
  107.         bullet2_index=0
  108.         for i in range(5):
  109.                 bullet2.append(bullet.Bullet2((me.rect.centerx - 36, me.rect.centery)))
  110.                 bullet2.append(bullet.Bullet2((me.rect.centerx + 28, me.rect.centery)))       


  111.         #飞机坠毁图像列表索引
  112.         small_destroy_index = 0
  113.         mid_destroy_index = 0
  114.         big_destroy_index = 0
  115.         me_destroy_index = 0

  116.         while runnning:
  117.                 for event in pygame.event.get():
  118.                         if event.type == QUIT:
  119.                                 pygame.quit()
  120.                                 sys.exit()
  121.                         elif event.type==SUPPLE_TIME:
  122.                                 if choice([True,False]):
  123.                                         bomb_supply.reset()
  124.                                 else:
  125.                                         bullet_supply.reset()

  126.                         elif event.type==KEYDOWN:
  127.                                 if event.key == K_SPACE: #如果用户按下了空格
  128.                                         if bomb_num:
  129.                                                 bomb_sound.play()
  130.                                                 bomb_num-=1
  131.                                                 for each in enemies:
  132.                                                         if each.rect.top>0:
  133.                                                                 each.active=False


  134.                         elif event.type==MOUSEBUTTONDOWN: #检测鼠标是否悬停在暂停图标上
  135.                                 button_down_sound.play()
  136.                                 if event.button==1 and paused_rect.collidepoint(event.pos):
  137.                                         paused=not paused
  138.                                         if paused:
  139.                                                 paused_image = resume_pressed_image
  140.                                         else:
  141.                                                 paused_image = pause_pressed_image

  142.                         elif event.type==MOUSEMOTION:
  143.                                 if paused_rect.collidepoint(event.pos): #如果鼠标放在图标上,则显示深色图案
  144.                                         if paused:
  145.                                                 paused_image=resume_pressed_image
  146.                                         else:
  147.                                                 paused_image=pause_pressed_image
  148.                                 else:
  149.                                         if paused:
  150.                                                 paused_image=resume_nor_image
  151.                                         else:
  152.                                                 paused_image=pause_nor_image
  153.                 #随着分数升级难度
  154.                 if level==1 and score>20000:
  155.                         level=2
  156.                         level_up_sound.play()
  157.                         add_small_enemies(small_enemies,enemies,1)
  158.                         add_mid_enemies(mid_enemies,enemies,1)
  159.                         add_big_enemies(big_enemies,enemies,1)
  160.                         for each in enemies:
  161.                                 each.speed[1]+=1

  162.                 screen.blit(background,(0,0)) #背景填充                               
  163.                 if not paused:                               
  164.                         key_pressed = pygame.key.get_pressed() #通过键盘接受指令,使小飞机上下左右移动
  165.                         if key_pressed[K_UP]:
  166.                                 me.speed=[0,-10]
  167.                                 me.move()
  168.                         if key_pressed[K_DOWN]:
  169.                                 me.speed=[0,10]
  170.                                 me.move()
  171.                         if key_pressed[K_LEFT]:
  172.                                 me.speed=[-10,0]
  173.                                 me.move()
  174.                         if key_pressed[K_RIGHT]:
  175.                                 me.speed=[10,0]
  176.                                 me.move()

  177.                         #补给包显示
  178.                         if bullet_supply.active:
  179.                                 bullet_supply.move()
  180.                                 screen.blit(bullet_supply.image,bullet_supply.rect)
  181.                                 if pygame.sprite.collide_mask(bullet_supply,me):
  182.                                         get_bullet_sound.play()
  183.                                         switch_bullet=1
  184.                                         bullet_supply.active=False
  185.                         if bomb_supply.active:
  186.                                 bomb_supply.move()
  187.                                 screen.blit(bomb_supply.image,bomb_supply.rect)
  188.                                 if pygame.sprite.collide_mask(bomb_supply,me):
  189.                                         get_bomb_sound.play()
  190.                                         bomb_supply.active=False
  191.                                         bomb_num+=1
  192.                         #子弹装载
  193.                         if not (delay % 10):   #每10帧发射一枚子弹
  194.                                 bullet_sound.play()
  195.                                 if switch_bullet==0:
  196.                                         bullets=bullet1
  197.                                         bullets[bullet1_index].reset(me.rect.midtop)
  198.                                         bullet1_index=(bullet1_index + 1) % 6
  199.                                 elif switch_bullet==1:
  200.                                         bullets=bullet2
  201.                                         bullets[bullet2_index].reset((me.rect.centerx - 36, me.rect.centery))
  202.                                         bullets[bullet2_index+1].reset((me.rect.centerx + 28, me.rect.centery))
  203.                                         bullet2_index=(bullet2_index + 2) % 10
  204.                        
  205.                         #判断子弹是否打中敌机
  206.                         for each in bullets:
  207.                                 if not each.hit:
  208.                                         each.move()
  209.                                         screen.blit(each.image,each.rect)
  210.                                         bullet_hit=pygame.sprite.spritecollide(each,enemies,False,pygame.sprite.collide_mask)
  211.                                         if bullet_hit:
  212.                                                 each.hit=True
  213.                                                 for i in bullet_hit:
  214.                                                         if i in mid_enemies or i in big_enemies: #判断中飞机和大飞机的血量
  215.                                                                 i.hit=True
  216.                                                                 i.energy-=1
  217.                                                                 if i.energy==0:
  218.                                                                         i.active=False
  219.                                                         else:
  220.                                                                 i.active = False

  221.                         #在屏幕上显示大型飞机
  222.                         for each in big_enemies:
  223.                                 if each.active:
  224.                                         each.move()
  225.                                         if each.hit:
  226.                                                 screen.blit(each.image_hit,each.rect) #如果在弹打中飞机,绘制被击中的画面
  227.                                                 each.hit=False #重置
  228.                                         else:
  229.                                                 if switch_image:#切换大飞机的图片,造成动态效果
  230.                                                         screen.blit(each.image1,each.rect)
  231.                                                 else:
  232.                                                         screen.blit(each.image2,each.rect)
  233.                                         #显示飞机血量
  234.                                         pygame.draw.line(screen,BLACK,\
  235.                                                                         (each.rect.left,each.rect.top-5),\
  236.                                                                         (each.rect.right,each.rect.top-5),2)
  237.                                         #生命值大于%20显示绿色,否则显示红色
  238.                                         energy_remain=each.energy/enemy.BigEnemy.energy
  239.                                         if energy_remain > 0.2:
  240.                                                 energy_color=GREEN
  241.                                         else:
  242.                                                 energy_color=RED
  243.                                         pygame.draw.line(screen,energy_color,\
  244.                                                                         (each.rect.left,each.rect.top-5),\
  245.                                                                         (each.rect.left+each.rect.width*energy_remain,each.rect.top-5),2)       
  246.                                         if each.rect.bottom == -50: #当大飞机即将出现在屏幕上的时候,加载出场音乐
  247.                                                 big_enemy_flying_sound.play(-1) #循环播放
  248.                                 else:
  249.                                         #坠毁
  250.                                         if not (delay % 3):#每三帧切换一次图片
  251.                                                 if big_destroy_index==0:
  252.                                                         enemy3_down_sound.play() #保证每个飞机坠毁只播放一次音效,否则每切换一张坠毁图片就要播放一次
  253.                                                 screen.blit(each.destroy_images[big_destroy_index],each.rect)
  254.                                                 big_destroy_index = (big_destroy_index+1) % 6 #索引值到6后重新变为1
  255.                                                 if big_destroy_index==0:
  256.                                                         big_enemy_flying_sound.stop()
  257.                                                         score+=10000
  258.                                                         each.reset()#当坠毁系列图片播放完毕,重置飞机位置

  259.                         #在屏幕上显示中型飞机
  260.                         for each in mid_enemies:
  261.                                 if each.active:
  262.                                         each.move()
  263.                                         if each.hit:
  264.                                                 screen.blit(each.image_hit,each.rect) #如果在弹打中飞机,绘制被击中的画面
  265.                                                 each.hit=False #重置
  266.                                         else:
  267.                                                 screen.blit(each.image,each.rect)
  268.                                         #显示飞机血量
  269.                                         pygame.draw.line(screen,BLACK,\
  270.                                                                         (each.rect.left,each.rect.top-5),\
  271.                                                                         (each.rect.right,each.rect.top-5),2)
  272.                                         #生命值大于%20显示绿色,否则显示红色
  273.                                         energy_remain=each.energy/enemy.MidEnemy.energy
  274.                                         if energy_remain > 0.2:
  275.                                                 energy_color=GREEN
  276.                                         else:
  277.                                                 energy_color=RED
  278.                                         pygame.draw.line(screen,energy_color,\
  279.                                                                         (each.rect.left,each.rect.top-5),\
  280.                                                                         (each.rect.left+each.rect.width*energy_remain,each.rect.top-5),2)
  281.                                 else:
  282.                                         if not (delay % 3):#每三帧切换一次图片
  283.                                                 if mid_destroy_index==0:
  284.                                                         enemy2_down_sound.play()
  285.                                                 screen.blit(each.destroy_images[mid_destroy_index],each.rect)
  286.                                                 mid_destroy_index = (mid_destroy_index+1) % 4 #索引值到6后重新变为1
  287.                                                 if mid_destroy_index==0:
  288.                                                         score+=6000
  289.                                                         each.reset()#当坠毁系列图片播放完毕,重置飞机位置

  290.                         #在屏幕上显示小型飞机
  291.                         for each in small_enemies:
  292.                                 if each.active:
  293.                                         each.move()
  294.                                         screen.blit(each.image,each.rect)
  295.                                 else:
  296.                                         if not (delay % 3):#每三帧切换一次图片
  297.                                                 if small_destroy_index==0:
  298.                                                         enemy1_down_sound.play()
  299.                                                 screen.blit(each.destroy_images[small_destroy_index],each.rect)
  300.                                                 small_destroy_index = (small_destroy_index+1) % 4 #索引值到6后重新变为1
  301.                                                 if small_destroy_index==0:
  302.                                                         score+=1000
  303.                                                         each.reset()#当坠毁系列图片播放完毕,重置飞机位置

  304.                         #碰撞检测 检测飞机是否坠毁
  305.                         enemies_down=pygame.sprite.spritecollide(me,enemies,False,pygame.sprite.collide_mask)                               
  306.                         if enemies_down:
  307.                                 me.active=False  #如果发生了碰撞,我方飞机状态设置为坠毁
  308.                                 switch_bullet=0
  309.                                 for each in enemies_down:
  310.                                         each.active=False        #敌方碰撞的精灵全部设置为坠毁       
  311.                         if me_life_num == 0:
  312.                                 runnning=False
  313.                                 print("game over")
  314.                         #显示我方飞机
  315.                         if delay==0:
  316.                                 delay=60
  317.                         delay-=1 #与当前参数结合,每一次循环减少一秒,如果为0,重置为60
  318.                         if not delay % 5:
  319.                                 switch_image=not switch_image #每三帧切换一次飞机图片,造成喷气效果
  320.                         if me.active:       
  321.                                 if switch_image:
  322.                                         screen.blit(me.image1,me.rect)
  323.                                 else:
  324.                                         screen.blit(me.image2,me.rect)
  325.                         else:
  326.                                 me_down_sound.play()
  327.                                 if not (delay % 3):#每三帧切换一次图片
  328.                                         screen.blit(me.destroy_images[me_destroy_index],me.rect)
  329.                                         me_destroy_index = (me_destroy_index+1) % 4 #索引值到6后重新变为1
  330.                                         if me_destroy_index==0:
  331.                                                 me.reset()
  332.                                                 me_life_num-=1 #当坠毁系列图片播放完毕,重置飞机位置,并且我方生命减一
  333.                

  334.                 for i in range(me_life_num):
  335.                         screen.blit(me_life_image,(width-me_life_rect.width*(i+1),height-bomb_rect.height-10))
  336.                 screen.blit(bomb_image,bomb_rect)                #绘制炸弹               
  337.                 score_text=score_font.render('Score : %s' % str(score),        True,WHITE )
  338.                 bomb_text=score_font.render(' × %s' % str(bomb_num),True,WHITE)
  339.                 screen.blit(bomb_text,(bomb_rect.left+55,bomb_rect.top+5)) #绘制炸弹数量
  340.                 screen.blit(score_text,(10,5))#显示得分数
  341.                 screen.blit(paused_image,paused_rect)
  342.                 pygame.display.flip()#更新界面
  343.                 clock.tick(60)#帧数为60


  344. if __name__=='__main__':
  345.         try:
  346.                 main()
  347.         except SystemExit:
  348.                 pass
  349.         except:
  350.                 traceback.print_exc()
  351.                 pygame.quit()
  352.                 input()
复制代码
最佳答案
2017-7-14 22:02:00
因为你上面的代码是有限制的,如果score = 20000,才会实现后面的代码
你想没想过,如果后面你通过打敌人score增加了,那么score就不等于20000了,可能等于20001或者更多
,那样后面就不成立了
正确的代码上,如果level = 1就确定了你一定是1级别的,如果你是3级别的,不就坏了吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-7-14 22:02:00 | 显示全部楼层    本楼为最佳答案   
因为你上面的代码是有限制的,如果score = 20000,才会实现后面的代码
你想没想过,如果后面你通过打敌人score增加了,那么score就不等于20000了,可能等于20001或者更多
,那样后面就不成立了
正确的代码上,如果level = 1就确定了你一定是1级别的,如果你是3级别的,不就坏了吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-7-15 09:59:38 | 显示全部楼层
新手·ing 发表于 2017-7-14 22:02
因为你上面的代码是有限制的,如果score = 20000,才会实现后面的代码
你想没想过,如果后面你通过打敌人s ...

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 14:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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