Reputation: 85
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()
Upvotes: 1
Views: 94
Reputation: 37691
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.
Upvotes: 4
Reputation: 1808
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:
player_choice
instead. (@lines 62~74)choice2
variable, you don't need to pass it to the determine_winner 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 :)
Upvotes: 2