[Tutor] Paper Rock Scissors game - User's choice not returned properly

Joel Montes de Oca joelmontes01 at gmail.com
Mon Oct 31 18:57:24 CET 2011


On 10/31/2011 11:41 AM, Joel Montes de Oca wrote:
> Hello everyone,
>
> I am having a little trouble with a block of code that isn't behaving 
> the way I would expect. Maybe you can give me a hand and point where 
> it is going wrong.
>
> The function that is not working correctly belongs to a Paper Rock 
> Scissor game I am making.
>
> This particular function is responsible to:
>   a) Get the user's choice (Paper, Rock, or Scissors)
>   b) Return the user's choice within the variable choice to the 
> function that called it.
>
> The function works correctly as long as the user _does not try to 
> enter a string other than_ 'P', 'R', or 'S'.
>
> Logic:
>     Take the user's string and put it in the variable choice.
>     If choice is not 'P', 'R', or 'S'then pass a message to the user 
> and call the function again.
>     If the choice is 'P', 'R', or 'S'then return choice to where it 
> was called from.
>
> The problem is this.
>
> When the user enters a string other than the valid ones, the if 
> statements catches it and calls the same function again so the user 
> can enter a valid string. But the variable choice does not get 
> assigned the new string entered by the user, instead it is empty.
>
> I would expect if the function runs again, the variable choice would 
> be updated to the last value given by the user.
>
> The function: ( http://dpaste.com/644857/)
>
> def  UserChoice  ():	# The function that returns the choice from the user
> 	print  'Please select (P) for paper, (R) for Rock, or (S) for Scissors.'
> 	choice  =  raw_input('What is your selection?:')
>
> 	if  choice.lower()  not  in  ('p',  'r','s'):	# Converts the user's choice to lowercase and confirms the choice is valid
> 		print  'I am sorry, you entered\''  +  choice.upper()  +  '\'  which is an invalid response. Please try again.'
> 		raw_input('Press Enter to try again.')
> 		UserChoice  ()		# If the choice is not valid, run the function over
> 	else:
> 		return  choice
>
>
> Output with no problems: ( http://dpaste.com/644866/) 
> <http://dpaste.com/644866/>
> Welcome to the PRS game.
>
> Please select (P) for paper, (R) for Rock, or (S) for Scissors.
> What is your selection?: s
>
> 	You threw down Scissors while the computer threw down Rock
>
> LOOSE
> Output with problems: ( http://dpaste.com/644868/)
>
> Welcome to the PRS game.
>
> Please select (P) for paper, (R) for Rock, or (S) for Scissors.
> What is your selection?: L
> I am sorry, you entered 'L' which is an invalid response. Please try again.
> Press Enter to try again.
> Please select (P) for paper, (R) for Rock, or (S) for Scissors.
> What is your selection?: s
>
> 	You threw down None while the computer threw down Paper
>
> LOOSE
> Here's the full source code in case the problem is outside of the 
> function: ( http://dpaste.com/644873/)
>
> import  random	# Import the random library
>
> def  main  ():	# The main function that gets called from main()
> 	print  '\nWelcome to the PRS game.\n'
>
> 	choice  =  UserChoice  ()	# Gets the choice from the user
> 	cchoice  =  ComputerChoice  ()		# Gets the choice from the computer
> 	
> 	PrintOutcome  (choice,  cchoice)	# Passes both choices to the PrintChoice function for display
>
>
> 	return  0
>
> def  UserChoice  ():	# The function that returns the choice from the user
> 	print  'Please select (P) for paper, (R) for Rock, or (S) for Scissors.'
> 	choice  =  raw_input('What is your selection?:')
>
> 	if  choice.lower()  not  in  ('p',  'r','s'):	# Converts the user's choice to lowercase and confirms the choice is valid
> 		print  'I am sorry, you entered\''  +  choice.upper()  +  '\'  which is an invalid response. Please try again.'
> 		raw_input('Press Enter to try again.')
> 		UserChoice  ()		# If the choice is not valid, run the function over
> 	else:
> 		return  choice
>
> def  ComputerChoice  ():		# The function that returns the choice from the computer
> 	PRS  =  ['Rock',  'Paper',  'Scissors']		# A list of choices
>
> 	cchoice  =  random.choice(PRS)	# Choose a random item from the list
>
> 	return  cchoice		# Return the function
>
> def  PrintOutcome  (UC,  CC):		# Function responsable to display the choices and results
> 	PRS  =  ['Rock',  'Paper',  'Scissors']
> 	
> 	# Convert the letters to words
> 	if  UC  ==  'r':
> 		UC  =  PRS[0]
> 	elif  UC  ==  'p':
> 		UC  =  PRS[1]
> 	elif  UC  ==  's':
> 		UC  =  PRS[2]
> 		
> 	print  '\n\tYou threw down',  UC,  'while the computer threw down',  CC  +'\n'
> 		
> 	# find the outcome of the game
> 	if  UC  ==  CC:
> 		print  'We have a tie, both players gain a point!'
> 	elif  UC  ==  'Rock'  and  CC  ==  'Scissors':
> 		print  'WIN'
> 	elif  UC  ==  'Paper'  and  CC  ==  'Rock':
> 		print  'WIN'
> 	elif  UC  ==  'Scissors'  and  CC  ==  'Paper':
> 		print  'WIN'
> 	else:
> 		print  'LOOSE'
>
> 	return  0
>
> main()
> I am using Python 2.7
> I am running on Ubuntu 11.10
>
> Thanks for any help
> -- 
> -Joel M.
OK everyone,

After burning my little noob brain cells a bit, I came up with this to 
solve the problem.

def  UserChoice  ():     # The function that returns the choice from the user
     while  1:

         print  'Please select (P) for paper, (R) for Rock, or (S) for Scissors.'
         choice  =  raw_input('What is your selection?:')
         if  choice.lower()  in  ('p',  'r','s'):     # Converts the user's choice to lowercase and confirms the choice is valid
             return  choice
             break
         else:
             print  'Try again.'

It puts the choice into a loop and only exits when the user enters a 
valid value. It works and it's so much easier to read too!

Thanks for all the help! :)

-- 
-Joel M.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/tutor/attachments/20111031/6fe43573/attachment-0001.html>


More information about the Tutor mailing list