首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >分数不会正确更新

分数不会正确更新
EN

Stack Overflow用户
提问于 2019-01-23 22:23:41
回答 1查看 61关注 0票数 0

我的分数显示在屏幕上,它会更新一秒钟,然后又回到0,我已经分析了代码的每一部分,但找不到哪里出了问题。

代码语言:javascript
复制
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() 

这是我的主循环:

代码语言:javascript
复制
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,但它总是回到零。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-01-23 22:42:19

代码语言:javascript
复制
def run_game(): 
    score = 0
    ...
    while True:
        ...
        gf.collisions(score, screen, player, mobs, bullets, ai_settings, all_sprites, meteor_imgs)  
    ...

正如我所怀疑的那样,您在一个循环中多次调用collisions。这就是为什么每次调用该函数时,它都会得到score = 0。在collisions中更新score

代码语言:javascript
复制
def collisions(score, ...):
    ...
    for hit in hits:
        score += 50
    ...

它只在局部发生(在函数内部),因为整数是不可变的。这是一件好事,因为从长远来看,在函数中依赖可变的全局变量不是一种好的编程实践。返回分数是一个更好的选择。

在模块gf.py中

代码语言:javascript
复制
def collisions(score, ...):
    ...
    for hit in hits:
        score += 50
    ...
    return score

在你的主模块中

代码语言:javascript
复制
import gf

...

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

附注:

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54329380

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档