请看我的蟒蛇剪刀程序

时间:2012-03-02 07:14:39

标签: python

我遇到的主要问题是当用户正在玩电脑时(随机功能)试图获得总胜利损失和关系。但是每当我为player_choice输入摇滚剪刀的1,2或3时,我都会收到此错误。

Welcome to a game of paper, rock, scissors!
Please input the correct number according 
to the object.
Select rock(1), paper(2), or scissors(3): 2
Computer chose ROCK .
You chose PAPER .
Traceback (most recent call last):
  File "C:\Program Files (x86)\Wing IDE 101 4.1\src\debug\tserver\_sandbox.py", line    
114, in <module>
  File "C:\Program Files (x86)\Wing IDE 101 4.1\src\debug\tserver\_sandbox.py", line   
43, in main
  File "C:\Program Files (x86)\Wing IDE 101 4.1\src\debug\tserver\_sandbox.py", line 
106, in determine_winner
builtins.UnboundLocalError: local variable 'win' referenced before assignment

显然是一个局部变量问题。还有其他解决方案吗? 这是我的代码:

#import the library function "random" so that you can use it for computer
#choice
import random

#define main
def main():
    #assign win, lose, and tie variables to zero so that later it can be added
    #and displayed
    win = 0
    lose = 0
    tie = 0

    #control loop with 'y' variable
    play_again = 'y'

    #start the game
    while play_again == 'y':
        #make a welcome message and give directions
        print('Welcome to a game of paper, rock, scissors!')
        print('Please input the correct number according')
        print('to the object.')

        #write computer and players choices as value returning functions and
        #assign them to variables
        computer_choice = get_computer_choice()
        player_choice = get_player_choice()

        #print outcome
        print('Computer chose', computer_choice, '.')
        print('You chose', player_choice, '.')

        #determine who won by defining a function
        determine_winner(computer_choice, player_choice)

        #ask the user if they want to play again
        play_again = input("Play again? Enter 'y' for yes or 'n' for no. ")

    #print results
    print('Your total wins are', win, '.')
    print('Your total losses are', lose, '.')
    print('Your total ties are', tie, '.')

#define computer choice
def get_computer_choice():
    #use imported random function from library
    choice = random.randint(1,3)

    #assign what the computer chose to rock, paper, or scissors
    if choice == 1:
        choice = 'ROCK'
    elif choice == 2:
        choice = 'PAPER'
    else:
        choice = 'SCISSORS'

    #return value
    return choice

#define player choice
def get_player_choice():
    #assign input to variable by prompting user
    choice = int(input("Select rock(1), paper(2), or scissors(3): "))

    #use while function if user inputs the invalid selection
    while choice != 1 and choice != 2 and choice != 3:
        print('The valid numbers are rock(type in 1), paper(type in 2),')
        print('or scissors(type in 3).')
        choice = int(input('Enter a valid number please: '))

    #assign what the player chose to rock, paper, or scissors
    if choice == 1:
        choice = 'ROCK'
    elif choice == 2:
        choice = 'PAPER'
    else:
        choice = 'SCISSORS'

    #return value
    return choice

#determine the winner by assigning the assigned variables
def determine_winner(computer_choice, player_choice):
    #if its a tie, add 1 to tie variable and display message
    if computer_choice == player_choice:
        tie += 1
        print("It's a tie!")

    #if its a win, add to win variable and display message
    elif computer_choice == 'SCISSORS' and player_choice == 'ROCK':
        win += 1
        print('ROCK crushes SCISSORS! You win!')
    elif computer_choice == 'PAPER' and player_choice == 'SCISSORS':
        win += 1
        print('SCISSORS cut PAPER! You win!')
    elif computer_choice == 'ROCK' and player_choice == 'PAPER':
        win += 1
        print('PAPER covers ROCK! You win!')

    #if it does not match any of the win criteria then add 1 to lose and
    #display lose message
    else:
        lose += 1
        print('You lose!')
main()

3 个答案:

答案 0 :(得分:1)

函数determine_winner()无法看到您在win中定义的变量tielosemain()。因此,您无法执行win +=1

你通常不会在Python中使用main()例程(我最近在这里看过一些使用它们的问题 - 无论是谁教这个?),但即使你将其内容移到顶端程序的级别,它将无法工作,因为win += 1仍然会因同样的原因而失败。

您可以在win中定义局部变量tielosedetermine_winner()并让它返回它们的值,然后将它们添加到顶级代码中的相应变量中。实际上,你根本不需要那个函数中的那些变量。

例如:

def determine_winner(computer_choice, player_choice):
    #if its a tie, add 1 to tie variable and display message
    if computer_choice == player_choice:
        print("It's a tie!")
        return 0

    #if its a win, add to win variable and display message
    elif computer_choice == 'SCISSORS' and player_choice == 'ROCK':
        print('ROCK crushes SCISSORS! You win!')
        return 1
    elif computer_choice == 'PAPER' and player_choice == 'SCISSORS':
        print('SCISSORS cut PAPER! You win!')
        return 1
    elif computer_choice == 'ROCK' and player_choice == 'PAPER':
        print('PAPER covers ROCK! You win!')
        return 1

    #if it does not match any of the win criteria then add 1 to lose and
    #display lose message
    else:
        print('You lose!')
        return -1

并在顶层:

result = determine_winner(computer_choice, player_choice)
if result == -1:
    lose += 1
elif result == 0:
    tie += 1
else:
    win += 1

答案 1 :(得分:1)

您可以让您的变量赢,输并全球化。在这里,他们不是。 How to make them global

编辑:我同意制作全球不是一个好的解决方案。

答案 2 :(得分:0)

Python使用词法作用域。这意味着如果在函数内部定义了变量,则该函数外部的代码无法看到它(除非它被标记为global)。

快速而肮脏的修复方法是将win以及需要从main外部看到的任何其他变量标记为global。更好的解决方案是重构代码。