Python Forum
Rock Paper Scissor GAME
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
Rock Paper Scissor GAME
#3
I like ThomasL solution for using dictionary but at the same time I am vary of using long handwritten datastructures (matrix dictionary). There is good probability that some typo or simple error will slip in while entering this data. Therefore alternative approaches for consideration focusing on how to determine winner. Following does not provide fully functional code but just ideas how problem can be approached.

If taking away all validation and output formatting it boils down to how to determine winner. Basically there can be two outcomes: (1) draw or (2) either side wins.

Draw is simple - if choices are equal its draw. For winners there is actually only three winning combinations:

>>> first_wins = [('Rock', 'Scissors'), ('Paper', 'Rock'), ('Scissors', 'Paper')]
So it can be expressed:

if user_choice == computer_choice:
    # draw
elif (user_choice, computer_choice) in first_wins:
    # user wins
else:
    # computer wins
Another approach can be considered 'too clever'. One can have possible choices ordered so that next beats previous:

>>> choices = ['Rock', 'Paper', 'Scissors']
The problem is, that 'previous' to 'Rock' should be 'Scissors' which is actually last in list.

Winning combinations using indices are:

0,2 (Rock beat Scissors)
1,0 (Paper beat Rock)
2,1 (Scissors beat Paper)

Loosing combinations using indices are:

2,0 (Scissors defeated by Rock)
0,1 (Rock defeated by Paper)
1,2 (Paper defeated by Scissors)

Doing %3 on these combinations:

>>> (0 - 2) % 3
1
>>> (1 - 0) % 3
1
>>> (2 - 1) % 3
1
>>> (2 - 0) % 3
2
>>> (0 - 1) % 3
2
>>> (1 - 2) % 3
2
As one can see, winning combination is always 1 and loosing one is 2. This can be used something like this:

choices = ['Rock', 'Paper', 'Scissors']
players = ['user', 'computer'] 
user_choice = # get user choice and return corresponding index in choices
computer_choice = random.choice(range(3))  # or random.choice(len(choices))

if user_choice == computer_choice:
    # draw
else:
    # winner = players[(user_choice - computer_choice) % 3 - 1]
Of course, draw is always 3 as same indices return 0 (0-0, 1-1, 2-2) and 0 % 3 is 3. It can be used if deemed useful (a la result = ['user wins', 'computer wins', 'draw']).

I would not argue that these are better options. They are alternative options Smile
I'm not 'in'-sane. Indeed, I am so far 'out' of sane that you appear a tiny blip on the distant coast of sanity. Bucky Katt, Get Fuzzy

Da Bishop: There's a dead bishop on the landing. I don't know who keeps bringing them in here. ....but society is to blame.
Reply


Messages In This Thread
Rock Paper Scissor GAME - by inamullah9 - Aug-06-2019, 05:07 PM
RE: Rock Paper Scissor GAME - by ThomasL - Aug-10-2019, 10:14 AM
RE: Rock Paper Scissor GAME - by perfringo - Aug-11-2019, 08:27 AM
RE: Rock Paper Scissor GAME - by ichabod801 - Aug-11-2019, 12:17 PM

Possibly Related Threads…
Thread Author Replies Views Last Post
  Another Rock, Paper, Scissors Yoriz 4 3,224 Jun-30-2020, 07:56 PM
Last Post: Yoriz
  The tkinter version of Rock Paper Scissors menator01 3 3,240 Jun-28-2020, 07:15 AM
Last Post: ndc85430
  My version of Rock Paper Scissors menator01 12 6,207 Jun-27-2020, 10:25 PM
Last Post: menator01
  PyQt5 Version of Rock, Paper, & Scissors menator01 8 3,723 Jun-06-2020, 12:15 PM
Last Post: pyzyx3qwerty
  Rock, Paper, Scissors foksikrasa 11 4,424 May-28-2020, 05:58 PM
Last Post: BitPythoner
  A CLI based Rock,Paper or Scissor game. Ablazesphere 7 4,595 Oct-28-2018, 07:25 AM
Last Post: Ablazesphere
  A basic Rock-paper-scissors game by me... Unlimiter 0 2,501 Dec-25-2017, 03:41 PM
Last Post: Unlimiter
  Basic Rock, Paper, Scissors CinnamonBeard 1 3,592 Dec-19-2017, 02:32 PM
Last Post: sparkz_alot

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020