我的分数显示在屏幕上,它会更新一秒钟,然后又回到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,但它总是回到零。
发布于 2019-01-23 22:42:19
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时
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
)
...附注:
在collisions中调用sys.exit也不是一件好事。你最好保持你所有的函数尽可能的纯净,并将所有有状态的控制流逻辑转移到主循环中。
https://stackoverflow.com/questions/54329380
复制相似问题