Как получить обновленные переменные из других функций? - PullRequest
2 голосов
/ 13 февраля 2020

поэтому в моей игре я пытаюсь создать систему подсчета очков, в которой каждый раз, когда враг поражен, ваш счет увеличивается на 1. Однако счет не обновляется, и я не уверен почему и как это исправить. Если возможно, я не хочу использовать глобальные переменные из-за того, что мой лектор поощряет нас против этого.

Вот весь соответствующий код (я отметил, где упоминается переменная оценки):

main ( ):

def main():
    font = pygame.font.SysFont("28 Days Later", 35, True, False) # (Font name, Font size, Bold?, Italic?)
    board = player(225, 225, 64, 64, 0)
    DiArrow = enemy(100, 410, 48, 48, 410)
    score = 0 # <------------- SCORE
    bullets = []
    E_bullets = []
    while True:
        moveFunctions(board, DiArrow, bullets, E_bullets, score, font) # <------------- SCORE

moveFunctions:

def moveFunctions(board, DiArrow, bullets, E_bullets, score, font): # <------------- SCORE
    clock = pygame.time.Clock()
    run = True
    while run:
        clock.tick(15) # Frame rate per second (FPS)

        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                run = False
                stopGame()

        fireBullet(board, bullets, DiArrow, score) # <------------- SCORE
        E_fireBullet(board, E_bullets, DiArrow)

        arrowKeys = pygame.key.get_pressed()

        bulletDirection(arrowKeys, board, bullets)
        E_bulletDirection(DiArrow, E_bullets, board)
        playerControls(arrowKeys, board)
        enemyControls(DiArrow, board)
        redrawGameWindow(board, DiArrow, bullets, E_bullets, font, score) # <------------- SCORE

fireBullet ():

def fireBullet(board, bullets, DiArrow, score): # <------------- SCORE
    if board.lastDirection == "left":
        for bullet in bullets:
            if bullet.y - bullet.radius < DiArrow.hitbox[1] + DiArrow.hitbox[3] and bullet.y + bullet.radius > \
                    DiArrow.hitbox[1]:
                if bullet.x + bullet.radius > DiArrow.hitbox[0] and bullet.x - bullet.radius < DiArrow.hitbox[0] + \
                        DiArrow.hitbox[2]:
                    DiArrow.getHit()
                    score += 1 # <------------- SCORE
                    bullets.pop(bullets.index(bullet))
            if bullet.x < 500 and bullet.x > 50:
                bullet.x += bullet.vel
            else:
                bullets.pop(bullets.index(bullet))
    elif board.lastDirection == "right":
        for bullet in bullets:
            if bullet.y - bullet.radius < DiArrow.hitbox[1] + DiArrow.hitbox[3] and bullet.y + bullet.radius > \
                    DiArrow.hitbox[1]:
                if bullet.x + bullet.radius > DiArrow.hitbox[0] and bullet.x - bullet.radius < DiArrow.hitbox[0] + \
                        DiArrow.hitbox[2]:
                    DiArrow.getHit()
                    score += 1 # <------------- SCORE
                    bullets.pop(bullets.index(bullet))
            if bullet.x < 450 and bullet.x > 0:
                bullet.x += bullet.vel
            else:
                bullets.pop(bullets.index(bullet))
    elif board.lastDirection == "up":
        for bullet in bullets:
            if bullet.y - bullet.radius < DiArrow.hitbox[1] + DiArrow.hitbox[3] and bullet.y + bullet.radius > \
                    DiArrow.hitbox[1]:
                if bullet.x + bullet.radius > DiArrow.hitbox[0] and bullet.x - bullet.radius < DiArrow.hitbox[0] + \
                        DiArrow.hitbox[2]:
                    DiArrow.getHit()
                    score += 1 # <------------- SCORE
                    bullets.pop(bullets.index(bullet))
            if 500 > bullet.y > 50:
                bullet.y += bullet.vel
            else:
                bullets.pop(bullets.index(bullet))
    else:
        for bullet in bullets:
            if bullet.y - bullet.radius < DiArrow.hitbox[1] + DiArrow.hitbox[3] and bullet.y + \
                bullet.radius > DiArrow.hitbox[1]:
                if bullet.x + bullet.radius > DiArrow.hitbox[0] and bullet.x - bullet.radius < \
                    DiArrow.hitbox[0] + DiArrow.hitbox[2]:
                    DiArrow.getHit()
                    score += 1 # <------------- SCORE
                    bullets.pop(bullets.index(bullet))
            if 450 > bullet.y > 0:
                bullet.y += bullet.vel
            else:
                bullets.pop(bullets.index(bullet))
    # return score <------------------ I tried using return here but to no avail

redrawGameWindow ():

def redrawGameWindow(board, DiArrow, bullets, E_bullets, font, score): # <------------- SCORE
    window.blit(bg, (0,0))
    text = font.render("Score: " + str(score), 1, (255, 255, 255)) # <------------- SCORE
    window.blit(text, (380, 515))
    board.drawCharacter(window)
    DiArrow.drawEnemy(window)
    for bullet in bullets:
        bullet.draw(window)
    for bullet in E_bullets:
        bullet.draw(window)
    pygame.display.update()

Я должен Отметим, что помимо партитуры все работает в основном так, как должно, и что я использую модуль Pygame (хотя проблема здесь не связана с какими-либо функциями Pygame). Кроме того, доска представляет игрока, а ДиАрроу - врага.

Спасибо всем, кто мог бы помочь пролить свет на мой вопрос и пожелать всем хорошего дня

1 Ответ

1 голос
/ 13 февраля 2020

Фактически, ваша попытка вернуть score из функции должна работать, если вы делаете это для каждой функции, которая использует score, но вы также должны сохранять это возвращенное значение при каждом вызове каждой функции, которая использует ее по порядку. распространять обновленное значение между вызовами функций. Измените код, чтобы он соответствовал следующему формату, и вы должны добиться желаемого поведения.

def functionThatUsesScore(score):
    score += 1
    return score


def functionThatDoesNotUseScore():
    pass


def anotherFunctionThatUsesScore(score):
    score += 2
    return score


def main():
    score = 0
    while True:
        score = functionThatUsesScore(score)
        functionThatDoesNotUseScore()
        score = anotherFunctionThatUsesScore(score)
...