我的分数显示在屏幕上,它会更新一秒钟,然后又恢复为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,但它会一直回到零。
答案 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
也不是一件好事。您最好保持所有函数尽可能纯净,并将所有有状态控制流逻辑移入主循环。