首页 > 解决方案 > 为什么我的记分牌没有在 pygame 中更新?

问题描述

我正在为我的网球比赛制作记分牌。为什么球停止时它不更新?

我试过改组缩进,删除 for 循环。

while carryOn:
    font = pygame.font.Font('freesansbold.ttf', 32)
    screen.fill(OUT)

    camden.update()
    robert.update()
    tennisball.update()

    epsilonComp = .1
    stops = []
    ballstop = abs(tennisball.speedx) < epsilonComp and abs(tennisball.speedy) < epsilonComp
    if abs(tennisball.speedx) < epsilonComp and abs(tennisball.speedy) < epsilonComp:
        stops.append(1)
        if sum(stops) == 2:
            score = 15
        elif sum(stops) == 3:
            score = 30
    scorebox = font.render(str(score), True, WHITE, BLACK)
    scoreRect = scorebox.get_rect()
    scoreRect.center = (625, 50)
    screen.blit(scorebox, scoreRect)

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            carryOn = False
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_x:
                carryOn = False



    all_sprites.update()

    # Update
    all_sprites.draw(screen)
    pygame.display.update()
    clock.tick(60)

pygame.quit()

当球停止时它应该更新为 15,然后当它再次停止时更新为 30。如果有人能解决这个问题,我可以解决剩下的分数。

标签: pythonpython-3.xpygame

解决方案


条件if sum(stops) == 2:永远不会满足,因为stops在每一帧中都进行了初始化。sum(stops)永远不会超过1。stops = []在主循环之前做:

stops = []
while carryOn:

    # [...]

    #stops = [] <---- DELETE this
    ballstop = abs(tennisball.speedx) < epsilonComp and abs(tennisball.speedy) < epsilonComp
    if abs(tennisball.speedx) < epsilonComp and abs(tennisball.speedy) < epsilonComp:
        stops.append(1)
        if sum(stops) == 2:
            score = 15
        elif sum(stops) == 3:
            score = 30

可能条件if sum(stops) == 2:是错误的,它必须是if sum(stops) == 1:。但这取决于你的游戏逻辑。如果球在开始时处于“停止”状态,那么if sum(stops) == 2:将是正确的。


根据评论:

当球停止时,您必须设置一个状态ball_is_stopped = True。在评估球是否停止的条件下,您必须评估此状态,以便球的停止不会导致得分:

if not ball_is_stopped and ....
    ball_is_stopped = True

当球开始移动时,您必须重置状态,以便下一站可以增加分数。通过 初始化状态True,因为一开始球是停止的,但分数不应该增加。

if abs(tennisball.speedx) > epsilonComp and abs(tennisball.speedy) > epsilonComp:
    ball_is_stopped = False

此外,没有必要,即stops一个列表,一个计数器就完全足够了。只要count小于 3,就增加计数器。

stops = stops+1
if stops == 4: 
    stops = 0

增加分数的完整代码可能如下所示:

scores = [0, 15, 30, 40]
stops = 0
games = 0
ball_is_stopped = True

while carryOn:

    # [...]

    epsilonComp = .1
    is_moving = abs(tennisball.speedx) > epsilonComp or abs(tennisball.speedy) > epsilonComp
    if is_moving:
        ball_is_stopped = False

    if not ball_is_stopped and not is_moving:
        ball_is_stopped = True

        stops = stops+1
        if stops == 4:
            stops = 0
            games += 1

        score = scores[stops]

推荐阅读