Глобальные переменные в Python и как их избежать? - PullRequest
0 голосов
/ 20 января 2019

Я пишу палач. Скрипт состоит из двух функций: setup (), которая инициализирует все переменные (слово, количество догадок, списки проверяемых букв и т. д.) и main (что является основным игровым циклом). Последнее, что делает setup (), это вызывает main (). Из main () вы можете вызвать setup () для перезагрузки игры.

По своей конструкции функция main () должна обращаться к переменным, созданным в setup (), и наоборот. Это требует от меня интенсивного использования «глобальных» операторов - для всех объявлений в setup ().

Как мне подойти к нему, чтобы избежать «плохих» глобальных переменных?

import random

def setup():
    with open("Ex30_Pick_a_word/sowpods.txt", "r") as f:
        lines = [x for x in f.readlines()]
    count = 0
    for line in lines:
        count += 1
    global selected_word
    selected_word = lines[random.randint(1, count)].rstrip()

    ## initialize variables
    global guess_state
    guess_state = ['-' for letter in selected_word]
    global bad_letters
    bad_letters = ""
    global chances
    chances = 6

    ##  start game
    print("\n\n\n####     WELCOME TO HANGMAN      ###")
    print("Word to guess is: " + selected_word + ".")  ## debug only ;)
    main()

def main():
    while True:
        success = False
        print("\n""The word is:")
        display = "".join(guess_state)
        print(display)
        global chances
        print("You've got " + str(chances) + " chances left.")
        guess_letter = input("Guess a letter:").capitalize()

        ## logic
        for letter_id, letter in enumerate(selected_word):
            if guess_letter == letter:                      ## if found
                if guess_state[letter_id] == "-":           ## if not yet found
                    guess_state[letter_id] = letter
                    success = True
                    break
        if not success:
            global bad_letters
            if guess_letter in bad_letters:
                print("You've aread tried: \"" + guess_letter + "\"")
            else:
                bad_letters += guess_letter + " "
            chances -= 1
        if ''.join(guess_state) == selected_word:
            print("You've won, the word was: " + selected_word)
            again = input("Do you want to play again? (y/n)")
            if again == "y":
                setup()
            break
        if len(bad_letters) > 0:
            print("\nBad letters: " + bad_letters)
        if chances == 0:
            print("Game Over.")
            again = input("Do you want to play again? (y/n)")
            if again == "y":
                setup()
            break

setup()
...