NameError: свободная переменная 'player_one_rps', на которую ссылается перед присваиванием в пределах объема - PullRequest
0 голосов
/ 30 ноября 2018

Я довольно новичок в программировании, и я пытался создать текстовую игру с меню.Сама игра работает нормально, но как только я пытаюсь включить меню, я получаю сообщение об ошибке «NameError: свободная переменная player_one_rps», на которую ссылается перед назначением в прилагаемой области видимости ».Я уже некоторое время гуглял, как сумасшедший, но те немногие ответы, которые я нахожу, используют слишком сложный код, чтобы я его еще не понял.

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

Вот код для меню и опции игры 1:

def main (): print ("\ t \ t *** Добро пожаловать в эту абсолютно адекватную игру! *** ")

def game_menu():
    """Displays game menu and prompts user for input"""
    menu_choice = input("""What do you want to do?

                        1 - One player: rock, paper, scissor, lizard, spock
                        2 - Two player: rock, paper, scissor, lizard, spock
                        3 - Surprise! Bonus feature
                        4 - User guide
                        5 - Quit

                        Enter the menu number to access: """)
    while True:
        if menu_choice == "1":
            print("One player: rock, paper, scissor, lizard, spock")
            player_one_rps()
            break
        elif menu_choice == "2":
            print("Two player: rock, paper, scissor, lizard, spock")
            player_two_rps()
            break
        elif menu_choice == "3":
            print("Surprise! Bonus feature")
            dad_jokes()
            break
        elif menu_choice == "4":
            print("User guide")
            user_info()
        elif menu_choice == "5":
            print("Quit game")
            exit()
        elif menu_choice != 1 - 5:
            print("Error, choose a valid number")

    # print(menu_choice)

game_menu()
main()

# First game
def player_one_rps():
    """One player rock, paper, scissor, lizard, spock - game"""
    import random

    def instructions():
        """Displays menu and simple instructions on how to play"""
        print("Welcome to rock, paper, scissor, lizard, spock!")
        play = input("\nNavigate by \"yes\", \"no\", and numbers.\nNew game?:").lower()
        if play == "yes":
            print("1. Rock")
            print("2. Paper")
            print("3. Scissors")
            print("4. Lizard")
            print("5. Spock")

        elif play != "no":
            print("an error has occured. Please type \"yes\" or \"no\":")
            instructions()

    def get_user_choice():
        """Prompts the player to pick a 'weapon'"""
        choice = int(input("What do you choose?: "))
        if choice > 5:
            print("Invalid number, please try again....")
            get_user_choice()
        elif choice < 1:
            print("Invalid number, please try again....")
            get_user_choice()
        elif choice == 1:
            print("You chose rock")
        elif choice == 2:
            print("You chose paper")
        elif choice == 3:
            print("You chose scissor")
        elif choice == 4:
            print("You chose lizard")
        elif choice == 5:
            print("You chose spock")
        return choice

    def get_pc_choice():
        """The computer chooses a random weapon"""
        choice = random.randint(1, 5)
        if choice == 1:
            print("PC chose rock")
        elif choice == 2:
            print("PC chose paper")
        elif choice == 3:
            print("PC chose scissor")
        elif choice == 4:
            print("PC chose lizard")
        elif choice == 5:
            print("PC chose spock")
        return choice

    def winner(user_choice, pc_choice, user_wins, pc_wins, ties):
        """Calculates if the player or computer won the match"""
        if user_choice == 1 and pc_choice == 3 or pc_choice == 4:
            print("\nYou win.")
            user_wins = user_wins.append(1)
        elif user_choice == 2 and pc_choice == 1 or pc_choice == 5:
            print("\nYou win.")
            user_wins = user_wins.append(1)
        elif user_choice == 3 and pc_choice == 2 or pc_choice == 4:
            print("\nYou win.")
            user_wins = user_wins.append(1)
        elif user_choice == 4 and pc_choice == 2 or pc_choice == 5:
            print("\nYou win.")
            user_wins = user_wins.append(1)
        elif user_choice == 5 and pc_choice == 1 or pc_choice == 3:
            print("\nYou win.")
            user_wins = user_wins.append(1)
        elif user_choice == pc_choice:
            print("\nTie")
            ties = ties.append(1)
        else:
            print("\nPC won")
            pc_wins = pc_wins.append(1)
        return

    def game_total(user_wins, pc_wins, ties):
        """Displays the total score"""
        user_wins = sum(user_wins)
        pc_wins = sum(pc_wins)
        ties = sum(ties)
        print("Your final score: ", user_wins)
        print("PC\'s final Score: ", pc_wins)
        print("Total ties: ", ties)

    def main_one_p():
        """Main instructions for how the game runs"""
        user_choice = 0
        user_wins = []
        pc_choice = 0
        pc_wins = []
        ties = []
        final_user_wins = 0
        final_pc_wins = 0
        final_ties = 0
        Continue = "yes"
        instructions()
        while Continue == "yes":
            user_choice = get_user_choice()
            pc_choice = get_pc_choice()
            winner(user_choice, pc_choice, user_wins, pc_wins, ties)
            Continue = input("Would you like to play again: ").lower()
            if Continue == "no":
                print("This is the final scores.")
                break
        game_total(user_wins, pc_wins, ties)

    main_one_p()
player_one_rps()
game_menu()  # Returns player to the main menu

(извините, если это довольно долго)

Может ли кто-нибудь помочь мне указать направление моей ошибки?Разъяснения и советы по ее устранению также будут с благодарностью:)

В общем, я благодарен за все отзывы, так как я действительно хочу стать лучше в кодировании.

1 Ответ

0 голосов
/ 30 ноября 2018

Глобальная функция должна иметь более высокий декларативный код, чем там, где она вызывается.Просто переместите функцию.Функция game_menu должна быть ниже функции play_one_rps.Остальные функции такие же.

...