简体   繁体   中英

Getting an endless loop somewhere

I need some help with this program I am trying to finish. This thing is kind of a mess. its the end of a 12 hour day and it's due tonight and I think I'm just making things worse at this point. I'm struggling with implementing input of "4" for the player_choice and getting the program to just say 'Exiting the program' and stop. When I input a choice currently, I get what I think is an endless loop because the entire IDE locks up and crashes.

program requirements:

1) Get and return the value of the computer’s choice as an integer.  
2) Use a menu to get, validate, and return the player’s choices.  
The player will enter their menu choice for rock, paper, scissors, or quit.  
Validate the choice before returning it.
3) Determine the winner.  There are a total of 9 possible combinations of
computer and player choices.  The menu should always be displayed after the outcome has 
been displayed regardless of the outcome 
(i.e. ties should be treated the same as any other outcome). 
4) After the player chooses to stop playing, display the total number of
 games that ended in a tie, the total number the computer won, and the total
 number the player won.  

Here is the program code:

import random

def main():
    display_menu()   
    print('There were', number_of_tied_games, 'tie games played.')
    print('The computer won', number_of_computer_games, 'game(s).')
    print('You won', number_of_player_games, 'game(s).')

def process_computer_choice():
    choice1 = random.randint(1,3)
    return choice1

def process_player_choice():
    print('What is your choice?')
    choice2 = (input())
    while choice2 != "1" and choice2 != "2" and choice2 != "3" and choice2 != "4":
        print("ERROR: the choice can only be 1, 2, 3, or 4.")
        choice2 = (input("Please enter a correct choice: ")) 
    return choice2

def determine_winner(player_choice, computer_choice, choice2):
    while choice2 != "4":
        if computer_choice == 1:
            if player_choice == "2":
                print('Paper covers rock. You win!')
                winner = 'player'
            elif player_choice == "3":
                print("Rock crushes scissors. The computer wins!")
                winner = 'computer'
            else:
                print('The game is tied. Try again.')
                winner = 'tied'
        if computer_choice == 2:
            if player_choice == "1":
                print('Paper covers rock. The computer wins!')
                winner = 'computer'
            elif player_choice == "3":
                print("Scissors cuts paper. You win!")
                winner = 'player'
            else:
                print('The game is tied. Try again.')
                winner = 'tied'
        if computer_choice == 3:
            if player_choice == "1":
                print('Rock smashes scissors. You win!')
                winner = 'player'
            elif player_choice == "2":
                print("Scissors cuts paper. The computer wins!")
                winner = 'computer'
            else:
                print('The game is tied. Try again.')
                winner = 'tied'
    return winner

def display_menu(): 
    choice2 = 0
    number_of_tied_games = 0
    number_of_player_games = 0
    number_of_computer_games = 0   

    print('        MENU')
    print('1) Rock')
    print('2) Paper')
    print('3) Scissors')
    print('4) Quit')
    print("Let's play the game of Rock, Paper, Scissors.")
    computer_choice = process_computer_choice()
    player_choice = process_player_choice()    
    while choice2 != "4":

        if computer_choice == 1:
            print('The computer chooses rock.')
        elif computer_choice == 2:
            print('The computer chooses paper.')
        else:
            print('The computer chooses scissors.')
        #display player choice
        if player_choice == "1":
            print('You choose rock.')
        elif player_choice == "2":
            print('You choose paper.')
        else:
            print('You choose scissors.')

        result = determine_winner(player_choice, computer_choice, choice2)
        if result == 'computer':
            number_of_computer_games += 1
        elif result == 'player':
            number_of_player_games += 1
        else:
            number_of_tied_games += 1
        print    


main()

Your program will run infinitely because you are not updating the variable choice2 inside display_menu() function. What you are doing:

choice2 = 0
while choice2 != "4":
     # your code
     result = determine_winner(player_choice, computer_choice, choice2)

So, ultimately choice2 is always 0 and your while loop keeps running endlessly.

Edit : You are returning a value from your process_player_choice() and assigning the value to a variable player_choice inside display_menu() function.

player_choice = process_player_choice()

I guess you should assign the return value to the variable choice2 so that when user gives 4 as input, program will be terminated.

choice2 = process_player_choice()

Note that , you have another while loop inside determine_winner() which will run endlessly as well because of choice2 . I believe that while loop is not required since you have a while loop already inside display_menu() function.

So, in short you actually don't need an additional variable player_choice , you just need one variable that will store the user choice and can be passed to required functions to execute their operations. You should also omit the while loop from the display_menu() function.

Lastly, as @AdrianoMartins mentioned in his answer, the following variables that you declared inside display_menu() should be global, otherwise you won't be able to access them from main() function.

number_of_tied_games = 0
number_of_player_games = 0
number_of_computer_games = 0

You can declare them in global scope and then declare them as global inside display_menu() to modify their value. For example:

// declaring globally
tied_games = 0
player_games = 0
computer_games = 0

def display_menu():
    // need to modify global copy of the variables
    global tied_games
    global player_games
    global computer_games

To learn more, i encourage you to see this SO post .

The issue is related to the determine_winner method. The code inside the method will run while the value of choice2 isn't 4, but you don't change it during the loop, therefore it won't stop looping.

There are several solutions to this issue, the easiest is simply to not use a loop (after all, you should check the result only once every game played).

def determine_winner(player_choice, computer_choice, choice2):
    if computer_choice == 1:
        if player_choice == "2":
            print('Paper covers rock. You win!')
            winner = 'player'
        elif player_choice == "3":
            print("Rock crushes scissors. The computer wins!")
            winner = 'computer'
        else:
            print('The game is tied. Try again.')
            winner = 'tied'
    if computer_choice == 2:
        if player_choice == "1":
            print('Paper covers rock. The computer wins!')
            winner = 'computer'
        elif player_choice == "3":
            print("Scissors cuts paper. You win!")
            winner = 'player'
        else:
            print('The game is tied. Try again.')
            winner = 'tied'
    if computer_choice == 3:
        if player_choice == "1":
            print('Rock smashes scissors. You win!')
            winner = 'player'
        elif player_choice == "2":
            print("Scissors cuts paper. The computer wins!")
            winner = 'computer'
        else:
            print('The game is tied. Try again.')
            winner = 'tied'
    return winner

That said, there are other errors that you should fix:

  • The loop location is wrong. You should display the menu and get the data every time the a match ends. (@line75)
  • You have added the choice2 variable but you never changed it. I believe it should be player_choice instead. (@lines 62~74)
  • By removing the choice2 variable, you don't need to pass it to the determine_winner method.
  • Remember that the "number_of_*_games" variables should declared on the global escope and later on global, otherwise you won't be able to access them later on main() method.

The full complete code is:

import random

tied_games = 0
player_games = 0
computer_games = 0

def main():
    display_menu()
    print('There were', tied_games, 'tie games played.')
    print('The computer won', computer_games, 'game(s).')
    print('You won', player_games, 'game(s).')


def process_computer_choice():
    choice1 = random.randint(1,3)
    return choice1


def process_player_choice():
    print('What is your choice?')
    choice2 = (input())
    while choice2 != "1" and choice2 != "2" and choice2 != "3" and choice2 != "4":
        print("ERROR: the choice can only be 1, 2, 3, or 4.")
        choice2 = (input("Please enter a correct choice: "))
    return choice2


def determine_winner(player_choice, computer_choice):
    if computer_choice == 1:
        if player_choice == "2":
            print('Paper covers rock. You win!')
            winner = 'player'
        elif player_choice == "3":
            print("Rock crushes scissors. The computer wins!")
            winner = 'computer'
        else:
            print('The game is tied. Try again.')
            winner = 'tied'
    if computer_choice == 2:
        if player_choice == "1":
            print('Paper covers rock. The computer wins!')
            winner = 'computer'
        elif player_choice == "3":
            print("Scissors cuts paper. You win!")
            winner = 'player'
        else:
            print('The game is tied. Try again.')
            winner = 'tied'
    if computer_choice == 3:
        if player_choice == "1":
            print('Rock smashes scissors. You win!')
            winner = 'player'
        elif player_choice == "2":
            print("Scissors cuts paper. The computer wins!")
            winner = 'computer'
        else:
            print('The game is tied. Try again.')
            winner = 'tied'
    return winner

def display_menu():
    global tied_games
    global player_games
    global computer_games

    player_choice = 0

    while player_choice != "4":
        print('        MENU')
        print('1) Rock')
        print('2) Paper')
        print('3) Scissors')
        print('4) Quit')
        print("Let's play the game of Rock, Paper, Scissors.")
        computer_choice = process_computer_choice()
        player_choice = process_player_choice()

        if player_choice != "4":
            if computer_choice == 1:
                print('The computer chooses rock.')
            elif computer_choice == 2:
                print('The computer chooses paper.')
            else:
                print('The computer chooses scissors.')

            #display player choice
            if player_choice == "1":
                print('You choose rock.')
            elif player_choice == "2":
                print('You choose paper.')
            else:
                print('You choose scissors.')

            result = determine_winner(player_choice, computer_choice)
            if result == 'computer':
                computer_games += 1
            elif result == 'player':
                player_games += 1
            else:
                tied_games += 1


if __name__ == '__main__':
    main()

I believe that's all :)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM