Результаты не будут обновляться правильно - PullRequest
0 голосов
/ 23 января 2019

Мой счет отображается на экране и обновляется на секунду, а затем возвращается к 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 голосов
/ 23 января 2019
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 тоже нехорошо. Вам лучше сохранить все свои функции как можно более чистыми и переместить всю логику потока управления с состоянием в основной цикл.

...