分数不会正确更新

时间:2019-01-23 14:23:41

标签: python pygame sprite

我的分数显示在屏幕上,它会更新一秒钟,然后又恢复为0,我分析了我的代码的每一部分,找不到了哪里出了错。

def collisions(score,screen, player, mobs, bullets, ai_settings,  all_sprites, meteor_imgs):
    hits = pygame.sprite.groupcollide(mobs, bullets, True, True)
    for hit in hits:
        score += 50
        m = Mob(ai_settings, meteor_imgs)
        all_sprites.add(m)
        mobs.add(m)
    draw_text(screen, "SCORE: " + str(score) , 20, 0,0, ai_settings)

    hits = pygame.sprite.spritecollide(player, mobs, False)
    if hits:
        sys.exit() 

这是我的主循环:

def run_game(): 

    score = 0
    gf.add_mobs(ai_settings, all_sprites, mobs, meteor_imgs)

    while True:

        clock.tick(FPS)

        gf.update_screen(ai_settings, screen, all_sprites, background, background_rect) 
        gf.check_events(player, all_sprites, bullets)   
        gf.collisions(score, screen, player, mobs, bullets, ai_settings, all_sprites, meteor_imgs)  
        all_sprites.update()        


        pygame.display.flip()


run_game()

每次击落暴民时,得分应该相加50,但它会一直回到零。

1 个答案:

答案 0 :(得分:0)

def run_game(): 
    score = 0
    ...
    while True:
        ...
        gf.collisions(score, screen, player, mobs, bullets, ai_settings, all_sprites, meteor_imgs)  
    ...

我怀疑您是在循环中多次调用collisions。这就是为什么每次调用该函数都会得到score = 0的原因。当您在score内更新collisions

def collisions(score, ...):
    ...
    for hit in hits:
        score += 50
    ...

它仅在本地(在函数内部)发生,因为整数是不可变的。那是一件好事,因为从长远来看,依赖于函数内部的可变全局变量并不是一个好的编程习惯。返回分数是更好的选择。

在gf.py模块中

def collisions(score, ...):
    ...
    for hit in hits:
        score += 50
    ...
    return score

在您的主模块中

import gf

...

def run_game(): 
    score = 0
    ...
    while True:
        ...
        score = gf.collisions(
            score, screen, player, mobs, 
            bullets, ai_settings, all_sprites, meteor_imgs
        )  
    ...

P.S。

sys.exit内部调用collisions也不是一件好事。您最好保持所有函数尽可能纯净,并将所有有状态控制流逻辑移入主循环。