4
\$\begingroup\$

To fulfil the requirements of the instructions, this version of rock, paper, scissors game works by taking a number from the user and the computer to represent their hand. (0 = rock, 1 = paper, 2 = scissors) From the numbers we then get the string representations of their hands. Next, we determine the winner by comparing the string representations of their hands. Lastly, we print out the result of the game to announce the winner.

I tried to make the function determine_winner() as simple as possible and this is how far I could get. Do you think it is a good idea to use dictionary there? Any comments to improve in general would be appreciated.

import random
user_hand = None
computer_hand = None
winner = None
result = None
def get_hand(num: int) -> str:
 """Get str representation of the user or the computer's hand."""
 if num == 0:
 return "rock"
 elif num == 1:
 return "paper"
 elif num == 2:
 return "scissors"
def determine_winner() -> str:
 """Get str representation of the winner."""
 user_win_combinations = {"rock": "scissors", "paper": "rock", "scissors": "paper"}
 
 if user_hand == computer_hand:
 winner = "Draw"
 elif (user_hand, computer_hand) in user_win_combinations.items():
 winner = "You"
 else:
 winner = "Computer"
 
 return winner
# take in a number 0-2 from the user that represents their choice
print("Rock = 0, paper = 1, scissors = 2")
while True:
 user_input = input("Please enter your choice: ")
 if user_input in ["0", "1", "2"]:
 break
 else:
 print("Incorrect input!")
# get str representations of user's hand and computer's hand.
user_hand = get_hand(int(user_input))
computer_hand = get_hand(random.randint(0,2))
# determine who wins
winner = determine_winner()
# print out the result
print(f"Your choice ({user_hand}) vs Computer's choice ({computer_hand})")
if winner == "Draw":
 result = "It's a draw!"
else:
 result = f"{winner} won!"
print(result)

Output examples:

# Draw
Rock = 0, paper = 1, scissors = 2
Please enter your choice: 1
Your choice (paper) vs Computer's choice (paper)
It's a draw!
# User wins
Rock = 0, paper = 1, scissors = 2
Please enter your choice: 2
Your choice (scissors) vs Computer's choice (paper)
You won!
# Computer wins
Rock = 0, paper = 1, scissors = 2
Please enter your choice: 2
Your choice (scissors) vs Computer's choice (rock)
Computer won!
Heslacher
50.9k5 gold badges83 silver badges177 bronze badges
asked Apr 13, 2023 at 18:01
\$\endgroup\$

1 Answer 1

3
\$\begingroup\$

Your code is working, but it needs a lot of improvements.

The function get_hand is redundant, there is no need to convert from int to str just to perform checks.

You can just compare ints directly.

If you need to print the result human readably, just use a list to keep track of the strs and use indexing to retrieve them when needed.

And you absolutely shouldn't use (key, val) in dict.items() to check if dict[key] == val, it is terribly inefficient and unpythonic, as it defeats the purpose of having a dict in the first place. Instead use the correct syntax I mentioned.

And since you already used functions, you should put the game inside a function to increase reusability.

And don't use globals for function arguments, pass them as arguments to functions properly.

There are still a lot room for improvements, but fixing aforementioned issues would make the code good for a beginner.

Suggested code:

import random
HANDS = ['rock', 'paper', 'scissors']
USER_WIN_COMBINATIONS = {0: 2, 1: 0, 2: 1}
def determine_winner(user_hand, computer_hand):
 if user_hand == computer_hand:
 return "It's a draw!"
 winner = "Computer"
 if computer_hand == USER_WIN_COMBINATIONS[user_hand]:
 winner = "You"
 
 return f"{winner} won!"
def game()
 print("Rock = 0, paper = 1, scissors = 2")
 while True:
 user_input = input("Please enter your choice: ")
 if user_input in {"0", "1", "2"}:
 break
 else:
 print("Incorrect input!")
 user_hand = int(user_input)
 computer_hand = random.randrange(3)
 print("Your choice ({0}) vs Computer's choice ({1})".format(HANDS[user_hand], HANDS[computer_hand])
 print(determine_winner(user_hand, computer_hand))
if __name__ == '__main__':
 game()
answered Apr 13, 2023 at 19:44
\$\endgroup\$
2
  • \$\begingroup\$ A little FYI, I wrote all this on my phone and didn't run any of the code, as I was going to sleep and my computer isn't in my bedroom. The point is I know exactly what the code will do without needing to run it. \$\endgroup\$ Commented Apr 13, 2023 at 19:51
  • \$\begingroup\$ "You can just compare ints directly." Yes I was thinking the same but thought to stick to the exercise's original instructions as it might have a reason for it. But all your points make total sense and very helpful. \$\endgroup\$ Commented Apr 14, 2023 at 14:49

Your Answer

Draft saved
Draft discarded

Sign up or log in

Sign up using Google
Sign up using Email and Password

Post as a guest

Required, but never shown

Post as a guest

Required, but never shown

By clicking "Post Your Answer", you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.