In a RPSLS game, if statement always make else be true - python

I'm building a RPSLS game and I have an error that I am running into. Regardless of what input player 1 selects, player 2 always win.
# 10 winning pairs, defined as (winner,loser)
winningPairs = [("scissors,paper"),
("scissors,lizard"),
("Spock,scissors"),
("Spock,rock"),
("lizard,Spock"),
("lizard,paper"),
("rock,lizard"),
("rock,scissors"),
("paper,rock"),
("paper,Spock")]
# ask players for their name
print()
namePlayerOne = input("Player 1, enter your name: ")
namePlayerTwo = input("Player 2, enter your name: ")
print()
# Options that can be selected by any user
options = ["Rock","Paper","Scissors","Lizard","Spock"]
# set two variables for keeping score
playerOneScore = 0
playerTwoScore = 0
while True:
# asking players for their choice
playerOneOption = input(f"{namePlayerOne} select your option (scissors, Spock, lizard, rock, paper): ").lower()
playerTwoOption = input(f"{namePlayerTwo} select your option (scissors, Spock, lizard, rock, paper): ").lower()
if playerOneOption == playerTwoOption: # if both players select the same option, it's always a draw
results = "Draw"
elif (playerOneOption,playerTwoOption) in winningPairs: # check if the order of the input is the same as an element in the winningPairs list, if it is Player one wins (who selects first)
results = f"{namePlayerOne} wins" # print their win
playerOneScore += 1 # add 1 score to their name
else: # if the elif is not true, it means player two wins
results = f"{namePlayerTwo} wins" # print their win
playerTwoScore += 1 # add 1 score to their name
print("-"*20)
print(f"{namePlayerOne} chose {playerOneOption}\n{namePlayerTwo} chose {playerTwoOption}") # print each player's pick
print(results) # print results
print()
print(f"{namePlayerOne} score: {playerOneScore}\n{namePlayerTwo} score: {playerTwoScore}") # print player scores
print("-"*20)
playAgain = input("Play again? (y/n): ") # ask if players want to play again
if playAgain.lower() != "y":
break
Below is the output of what happens. The player selects their names and subsequently picks their options.
Player 1, enter your name: name1
Player 2, enter your name: name2
name1 select your option (scissors, Spock, lizard, rock, paper): rock
name2 select your option (scissors, Spock, lizard, rock, paper): scissors
--------------------
name1 chose rock
name2 chose scissors
name2 wins
name1 score: 0
name2 score: 1
--------------------
Play again? (y/n): n
In this example, player 1 selects rock, and player 2 selects scissors, which means that player 1 should win.

Your winning pairs must be defined as a list of tuples, which contain 2 strings:
winningPairs = [("scissors","paper"),
("scissors","lizard"),
("Spock","scissors"),
("Spock","rock"),
("lizard","Spock"),
("lizard","paper"),
("rock","lizard"),
("rock","scissors"),
("paper","rock"),
("paper","Spock")]
To clarify, this is because you are checking whether a tuple of two strings, player1 and player2's choices respectively, is in the list. The list now contained just strings, since a tuple of 1 element is defined as (item,). But, replace your winningPairs list with this one and it will be all good.

Let's define the "winningPairs" as tuples (a pair of strings in beating order) and extract your crucial algorithm, the evaluation of win, into a function:
# pair (A,B) means: A beats B
def beating_tuples = [
("paper", "rock"),
("rock", "scissor"),
# etc.
]
# returns a result statement
def evaluate_winner(player1_choice, player2_choice):
if player1_choice == player2_choice:
return "Draw"
if (player1_choice, player2_choice) in beating_tuples:
player1_score += 1
return f"{player1_name} wins"
if (player2_choice, player1_choice) in beating_tuples:
player2_score += 1
return f"{player2_name} wins"
return f"Error: Choices of both unequal or not in beating-pairs (player2, player1): {(player2_choice, player1_choice)}"
Note: Instead of a defaulting else a final catching return indicates failure.
Further improvements could be a Player class, where each player object has common attributes as name, choice, score.
See also:
Make Your First Python Game: Rock, Paper, Scissors! – Real Python
Rock Paper Scissors in Python - A Complete Step-By-Step Guide - AskPython

Related

paper scissors rock python game

This is my attempt to create paper, rock and scissors game
There seems to be an error with while loop, "roundNum is not defined", please help?
import random
options = ['rock','paper','scissors']
def game(rounds):
roundNum = 1
playerScore = 0
computerScore = 0
while roundNum <= rounds:
print('Round Number '+ str(roundNum))
Player = input('Please choose rock, paper or scissors')
computer = options[random.randint(0,2)]
print(computer)
How do I create code to ask the payer if he wants to play again? and if so to run the code again?
Make sure your indentation is correct.
import random
options = ['rock','paper','scissors']
def game(rounds):
roundNum = 1
playerScore = 0
computerScore = 0
while roundNum <= rounds:
print('Round Number '+ str(roundNum))
Player = input('Please choose rock, paper or scissors')
computer = options[random.randint(0,2)]
print(computer)
The issue is with the indentation of while loop.
As function game and while are at same level any object declared inside the game function will be out of scope/unreachable for while loop.
A simple tab will resolve the issue in this case as follow :
import random
options = ['rock','paper','scissors']
def game(rounds):
roundNum = 1
playerScore = 0
computerScore = 0
while roundNum <= rounds:
print('Round Number '+ str(roundNum))
Player = input('Please choose rock, paper or scissors')
computer = options[random.randint(0,2)]
print(computer)
The reason you are getting the error RoundNum is not defined is because you are defining variables inside of a function, this means that you will have to call the function game() to define the three variables roundNum, playerScore and computerScore. To solve this, we remove the game() function and define the three variables in the main script like this:
import random
options = ['rock', 'paper', 'scissors']
roundNum = 1 # Defines the roundNum variable
playerScore = 0
computerScore = 0
def game(rounds):
while roundNum <= rounds:
print('Round Number ' + str(roundNum)
Option = input('Please choose rock, paper, or scissors > ')
Computer = options[random.randint(0, 2)]
# After all the rounds are finished, ask if the player wants to play again
x = input("Do you want to play again? ")
# If they say yes, start a new round of Rock, paper, Scissors
if x.lower() == "yes":
game(1)
# If they don't want to play then exit the program
if x.lower() == "no":
print("Bye")
exit()
game(1)
Edit: if you want to ask whether the player wants to play again, just call the input function inside a variable, then check what the player said, if they say yes then start a new game of Rock, Paper Scissors, if they don't then exit the program

How do I increase the value of a variable within a loop?

I'm building this rock, paper, scissors game and I've gotten quite far. However, I can't get the final scores to print correctly. No matter the situation, I always get 0 value on total rounds, total wins and ties.
I've been trying to add to these variables within the loop, however, I just cannot seem to figure this out.
import random
# a rock, paper, scissors game
loop = True
while loop is True:
win = 0
tie = 0
lose = 0
rounds = 0
usrchoice = input("Rock, Paper or Scissors? (Quit ends): ") # user makes a choice
if usrchoice.title() == "Rock":
pass
...
if computer_choice == "Scissors":
print("You WIN!")
win = win + 1
rounds = rounds + 1
elif computer_choice == "Rock":
print("It's a tie!")
tie = tie + 1
rounds = rounds + 1
else:
print("You LOSE!")
lose = lose + 1
rounds = rounds + 1
I expect the output to be anything, depending on the user of course, and not just 0. Like this:
>>> You played 0, and won 0 rounds, playing tie in 0 rounds.
You are setting your variables to 0 at the beginning of every loop. Move the variables above the loop to solve this problem.
Eg:
import random
# a rock, paper, scissors game
# foot beats cockroach, cockroach beats nuke and nuke beats foot
win = 0
tie = 0
lose = 0
rounds = 0
loop = True
while loop is True:
usrchoice = input("Foot, Nuke or Cockroach? (Quit ends): ") # user makes a choice
Just declare them before the loop:
win = 0
loses = 0
ties = 0
rounds = 0
while True:
...
What you are doing is every time the loop starts over again all the variables are set to 0 again. By declaring them before the loop the code will run through and only change the value for them when you increment the by 1 later in the loop.
You should initialize your variables outside the while not inside.

Rock Paper Scissors Program Not Working (Python)

Problems:
Program does not seem to accept the integers entered. Won't add to win/loss/draw count and does not display computer choice in debug mode
Basics Design of the Program:
Write a program that lets the user play the game of Rock, Paper, Scissors against the computer.
The program should work as follows.
A menu is displayed:
Score: 0 wins, 0 draws, 0 losses
(D)ebug to show computer's choice
(N)ew game
(Q)uit
If the user enters "Q" or "q" the program would end. "N" or "n" for a new game, "D" or "d" for debug mode, anything else would cause an error message to be displayed.
When a game begins, a random number in the range of 1 through 3 is generated. If the number is 1, then the computer has chosen rock. If the number is 2, then the computer has chosen paper. If the number is 3, then the computer has chosen scissors. (Don't display the computer's choice yet unless we are in "D"ebug mode.)
The user enters his or her choice of “1-rock”, “2-paper”, or “3-scissors” at the keyboard.
The computer's choice is displayed.
A winner is selected according to the following rules:
• If one player chooses rock and the other player chooses scissors, then rock wins.
(The rock smashes the scissors.)
• If one player chooses scissors and the other player chooses paper, then scissors wins.(Scissors cuts paper.)
• If one player chooses paper and the other player chooses rock, then paper wins.
(Paper wraps rock.)
• If both players make the same choice, the game is a draw.
Your program would keep a running total of the number of wins, loses and draws.
Re-display the menu and repeat the game loop.
My Program:
import random
def main():
continuing = "y"
win = 0
lose = 0
draw = 0
while continuing == "y":
print("Score:", win,"wins,", draw, "draws,", lose,"losses")
print("(D)ebug to show computer's choice")
print("(N)ew game")
print("(Q)uit")
choice = input(" ")
if choice == "n" or choice == "N":
win, draw, lose = playgame(win, draw, lose)
elif choice == "d" or choice == "D":
win, draw, lose = playgame2(win, draw, lose)
elif choice == "q" or choice == "Q":
break
def playgame(win, draw, lose):
computer = random.randint(1,3)
player = input("Enter 1 for Rock, 2 for Paper, or 3 for Scissors: ")
if computer == 1 and player == 2:
Score = "You won"
win += 1
elif computer == 1 and player == 3:
Score = "You lost"
lose += 1
elif computer == 2 and player == 1:
Score = "You lost"
lose += 1
elif computer == 2 and player == 3:
Score = "You won"
win += 1
elif computer == 3 and player == 1:
Score = "You won"
win += 1
elif computer == 3 and player == 2:
Score = "You lost"
lose += 1
elif computer == player:
Score = "Draw"
draw += 1
return (win, draw, lose)
def playgame2(win, draw, lose):
computer = random.randint(1, 3)
player = input("Enter 1 for Rock, 2 for Paper, or 3 for Scissors: ")
if computer == 1 and player == 2:
Score = "You won"
print("Computer chose rock")
win += 1
elif computer == 1 and player == 3:
Score = "You lost"
print("Computer chose rock")
lose += 1
elif computer == 2 and player == 1:
Score = "You lost"
print("Computer chose paper")
lose += 1
elif computer == 2 and player == 3:
Score = "You won"
print("Computer chose paper")
win += 1
elif computer == 3 and player == 1:
Score = "You won"
print("Computer chose scissors")
win += 1
elif computer == 3 and player == 2:
Score = "You lost"
print("Computer chose scissors")
lose += 1
elif computer == player:
Score = "Draw"
print("Computer chose the same as you")
draw += 1
return (win, draw, lose)
main()
I'm no Pythonista, but at a guess, input returns strings, and you'll need to convert to integer before comparing to the computer's int.
I also think you are missing a trick in DRYing up your code - you should be able to have a single playgame method, which takes an additional boolean parameter debugmode, which instead of calling print directly, calls an indirection, e.g.:
def debugPrint(debugString, debugMode)
if debugMode
print(debugString)
Hope this makes sense?
This would work in Python 2.x, but, not in Python 3.x
In Python 3.x, input() returns strings. Thus, the player's input would be of the form "1" or "2" or "3". Since 1 and "1" are different, the program will not execute any of the lines in the if and elif blocks in playgame() and playgame2().
Here is a Python 3.x example:
>>> a = input("Input = ")
Input = 1
>>> print a
SyntaxError: Missing parentheses in call to 'print'
>>> print(a)
1
>>> a
'1'
>>> type(a)
<class 'str'>
Thus, you should use i = int(input("Input = ")) wherever you want an integer input.
However, in Python 2.x, input() will take 1 as 1 itself and not as "1". But, when you want to type a string as an inpu, you will have to give the quotes also. Here is an exxample:
>>> a1 = input("Input = ")
Input = 1
>>> a1
1
>>> type(a1)
<type 'int'>
>>> #I want to input a string now:
>>> a2 = input("Input = ")
Input = string
Traceback (most recent call last):
File "<pyshell#12>", line 1, in <module>
a2 = input("Input = ")
File "<string>", line 1, in <module>
NameError: name 'string' is not defined
>>> a2 = input("Input = ")
Input = "string"
>>> a2
'string'
>>> type(a2)
<type 'str'>
>>> a3 = raw_input("Input = ")
Input = hello
>>> a3
'hello'
>>> type(a3)
<type 'str'>
>>>
In Python 2.x, the raw_input() function takes the input as a string.

How do I compare random result against dictionary keys with 2 values?

I'm just starting out in Python, and I'm trying to modify a simple rock paper scissors game to be rock paper scissors lizard spock. As a result I now need to compare a randomly generated computer choice against not 1, but 2 dictionary items which indicate loosing values:
#!/usr/bin/python
import random
import time
rock = 1
paper = 2
scissors = 3
lizard = 4
spock = 5
names = { rock: "Rock", paper: "Paper", scissors: "Scissors", lizard: "Lizard", spock: "Spock"}
rules = { rock: [scissors, lizard], paper: [rock, spock], scissors: [paper, lizard], lizard: [paper, spock], spock: [rock, scissors]}
player_score = 0
computer_score = 0
def start():
print "Let's play a game of Rock, Paper, Scissors, Lizard, Spock"
while game():
pass
scores()
def game():
player = move()
computer = random.randint(1, 5)
result (player, computer)
return play_again()
def move():
while True:
print
player = raw_input("Rock = 1\nPaper = 2\nScissors = 3\nLizard = 4\nSpock = 5\nMake a move: ")
try:
player = int(player)
if player in (1,2,3,4,5):
return player
except ValueError:
pass
print "Oops! I didn't understand that. Please enter 1, 2, 3, 4, or 5."
def result(player, computer):
# print "1..."
# time.sleep(1)
# print "2..."
# time.sleep(1)
# print "3!"
# time.sleep(0.5)
print "Computer threw {0}!".format(names[computer])
global player_score, computer_score
for i in rules[player]:
if i == computer:
global outcome
outcome = "win"
if outcome == "win":
print "Your victory has been assured."
player_score += 1
elif player == computer:
print "Tie game."
else:
print "The computer laughs as you realise you have been defeated."
computer_score += 1
def play_again():
answer = raw_input("Would you like to play again? y/n: ")
if answer in ("y", "Y", "yes", "Yes", "Of course!"):
return answer
else:
print "Thank you very much for playing. See you next time!"
def scores():
global player_score, computer_score
print "HIGH SCORES"
print "Player: ", player_score
print "Computer: ", computer_score
if __name__ == '__main__':
start()
Unfortunately this code results in the player always winning... what am I doing wrong?
Thanks very much for your help :)
You've got outcome as a global, but you never set it to anything other than "win". So once you've won once, the value of outcome will always be "win".
def result(player, computer):
outcome = ""
You don't use outcome anywhere else, so there's no reason to make it a global anyway.
You really don't even need that variable at all. Combining this with what Hyperboreus' mentioned in his/her answer, your result method could start like this, with everything else being the same:
def result(player, computer):
print "Computer threw {0}!".format(names[computer])
global player_score, computer_score
if computer in rules[player]:
print "Your victory has been assured."
...
Let's say player and otherPlayer hold the codes for the hand forms they made. Then you can check losing by checking if one players' code is contained in the losing conditions of the other player's code.
if player in rules [otherPlayer]: doSomething()
Without criticising your code, I personally would implement it somehow along these lines. Maybe you can grab an idea of two from it, or even some patterns, you surely won't want to use:
import random
rules = '''Scissors cut paper
Paper covers rock
Rock crushes lizard
Lizard poisons Spock
Spock smashes scissors
Scissors decapitate lizard
Lizard eats paper
Paper disproves Spock
Spock vaporizes rock
Rock crushes scissors'''
rules = rules.lower ().split ()
rules = [_ for _ in zip (rules [::3], rules [2::3] ) ]
names = list (set (name for name, _ in rules) )
def turn ():
ai = random.choice (names)
player = input ('Enter your choice: ').lower ()
if player not in names: raise Exception ('Sheldon out of bounds.')
print ('AI chose {}.'.format (ai) )
if (ai, player) in rules:
print ('AI won.')
return (0, 1)
if (player, ai) in rules:
print ('You won.')
return (1, 0)
print ('Draw.')
return (0, 0)
score = (0, 0)
while True:
you, ai = turn ()
score = (score [0] + you, score [1] + ai)
print ('The score is Human:Machine {}:{}'.format (*score) )
if input ('Play again? [n/*] ').lower () == 'n': break

Rock Paper Scissors in Python

I am trying to write a Python program and I am having a hard time getting my score. I have written it as a value returning function and every time I run the program it seems to skip the step where it retrieves the score unless I include an else statement which it will automatcially jump the the else statement.
I will attach the full code below.
Thank you very much for any help, I'm greatful!
This is also my first time posting in this forum I apologize if I screw something up.
#constants
Rock = 1
Paper = 2
Scissors = 3
#Define the main function
def main():
#set control loop
keep_going = 'Y'
#set counter to zero
computer_wins = 0
player_wins = 0
tie_score = 0
#call display message
display_message()
while keep_going == 'y' or keep_going == 'Y':
play_game()
#prompt user to keep going
keep_going = input('would you like to play again? (Y for Yes): ')
print('The computer won', computer_wins, 'times')
print('The player won', player_wins, 'times')
print('There were', tie_score, 'tie scores')
def play_game():
#get random input
computer = get_random()
#get the players input
play = get_play()
#validate input
if play == '1' or play == '2' or play == '3':
play == True
else:
play == False
print('Error: Invalid Entry')
play = input('Please enter 1 for Rock, 2 for Paper, or 3 for Scissors: ')
if play == computer:
print('Tie Score, Please try again')
tie_score += 1
else:
get_score(computer, play)
print('The computer chose:', computer)
print('The player chose: ', play)
#define display message
def display_message():
print('Welcome to Rock Paper Scissors, a game of chance to see who will')
print('outsmart the other. This game is Man VS Computer.')
print('The program will select a random integer and then ask you for an integer')
print('1 for Rock 2 for paper or 3 for Scissors. The program will then tell')
print('you who won the game.')
print('GOOD LUCK!')
print
print
def get_random():
import random
#generate random int
computer = random.randint(1, 3)
return computer
def get_play():
#prompt user to enter an integer 1, 2, or 3
play = input('Select 1 for Rock, 2 for Paper, or 3 for Scissors: ')
return play
def get_score(computer, play):
if computer == 1 and play == 2:
score = 'player wins'
print('Paper covers Rock, Player Wins')
#player wins
player_wins += 1
elif computer == 1 and play == 3:
score = 'computer wins'
print('Scissors cut Paper, Computer Wins')
#computer wins
computer_wins += 1
elif computer == 2 and play == 1:
score = 'computer wins'
print('Paper covers Rock, Computer Wins')
#computer wins
computer_wins += 1
elif computer == 2 and play == 3:
score = 'player wins'
print('Scissors cut Paper, Player Wins')
#player wins
player_wins += 1
elif computer == 3 and play == 1:
score = 'player wins'
print('Rock smashes Scissors, Player Wins')
#player wins
player_wins += 1
elif computer == 3 and play == 2:
score = 'computer wins'
print('Scissors cut Paper, Computer Wins')
#computer wins
computer_wins += 1
#call main function
main()
There's so much wrong with this, it's hard to know where to start (but don't get discouraged)...
First of all, it looks like (mostly from your use of input vs. raw_input and your parens with your print statements) you're using Python 3, which already is going to limit the amount of help you get. Most people are still using Python 2.6 or 2.7. But with that out of the way...
The main remaining issues addressing your question are:
First: you're using strings for player input (e.g. '1', '2', '3'), and numbers for computer choice (e.g. 1, 2, 3). So you need to compare them as such. In other words, instead of:
if computer == 1 and play == 2:
You would need to say:
if computer == 1 and play == '2':
Second: you're trying to reference one function's variables in another one, and that won't work. If you want your computer_wins, etc. variables to be global, you need to initialize them at the global scope, e.g. right after your "#constants" are declared and before you get into main. Then in any function that uses them, you must say e.g. global computer_wins to indicate they are global and not local.
Once you get these issues addressed, it should work a bit better, but you'll still need to do a lot of cleanup and keep working on it!
Keep at it, and soon it will be natural for you.
I answered your question separately, but just for fun here's a little working Rock, Paper, Scissors game to look at. This one is for Python 2.x and probably won't work in Python 3, but it might be helpful for you or somebody in the future searching for this.
# "Rock, Paper, Scissors" demo for Python 2.x
# by Dan Kamins
import random
ROCK = 1
PAPER = 2
SCISSORS = 3
NAMES = { ROCK: 'Rock', PAPER: 'Paper', SCISSORS: 'Scissors' }
WHAT_BEATS_WHAT = { ROCK: SCISSORS, PAPER: ROCK, SCISSORS: PAPER }
WIN_ACTIONS = { ROCK: 'crushes', PAPER: 'smothers', SCISSORS: 'cuts' }
score_player = 0
score_computer = 0
score_ties = 0
def main():
intro()
while main_loop():
pass
summary()
def intro():
print "Welcome to Rock, Paper, Scissors!"
def main_loop():
player = get_player_input()
computer = random.randint(1, 3)
check_result(player, computer)
return ask_play_again()
def check_result(player, computer):
global score_player, score_computer, score_ties
if player == computer:
print "Tie! Computer also chose {0}.".format(NAMES[computer])
score_ties += 1
else:
if WHAT_BEATS_WHAT[player] == computer:
print "Your massive {0} {1} the computer's {2}!".format(
NAMES[player], WIN_ACTIONS[player], NAMES[computer])
score_player += 1
else:
print "The computer's {0} {1} your pathetic {2}!".format(
NAMES[computer], WIN_ACTIONS[computer], NAMES[player])
score_computer += 1
def ask_play_again():
again = raw_input("Enter Y to play again: ")
return again in ('y', 'Y')
def get_player_input():
while True:
print
player = raw_input("Enter 1 for Rock 2 for paper or 3 for Scissors: ")
try:
player = int(player)
if player in (1,2,3):
return player
except ValueError:
pass
print "Please enter a number from 1 to 3."
def summary():
global score_player, score_computer, score_ties
print "Thanks for playing."
print "Player won: ", score_player
print "Computer won: ", score_computer
print "Ties: ", score_ties
if __name__ == '__main__':
main()
A couple quick notes from quickly skimming the code:
In get_score() you could add an else clause to handle any ties that happen and you wouldn't have to check for it explicitly in play_game()
Move the import random to the top of the file. imports are generally always found at the top of the file. Also, there's no need to re-import every time you want a random number.
Not sure if this is a typo, cause play seems to always hold an integer, but you have play == True and play == False inside play_game(). If you want to make play contain either True or False, you need to be using a single equals sign, eg, play = True. But this doesn't seem to make sense because you're comparing play to computer as if they're integers.
Also, what are you trying to accomplish with the score variable in the get_score() method?
Ah, if you made the get_score() method return something so you know who won the match it would be helpful. You can't access computer_wins or player_wins inside the get_score() method because they were defined inside main(). A simple way to do this is return an int from get_score(). here is a rather C-style way of handling it (returning -1/0/1). something like (pseudo code):
def get_score():
score = 0
if computer wins:
score = -1
elif player wins:
score = 1
return score
winner = get_score()
if winner == 0:
print 'tie game'
elif winner == 1
print 'the player won'
else:
print 'the computer won'
Here's another variant that works both in Python 2.x and 3.x:
try: input = raw_input
except NameError: input = input # py3k
import random
import sys
import textwrap
from collections import namedtuple
ROCK, PAPER, SCISSORS = ROCK_PAPER_SCISSORS = range(1, 4)
NAME = dict(zip(ROCK_PAPER_SCISSORS, "Rock Paper Scissors".split()))
Score = namedtuple('Score', 'win verb')
GAME_MATRIX = { # who wins and who does what
(PAPER, ROCK): Score(win=True, verb='covers'),
(SCISSORS, PAPER): Score(win=True, verb='cut'),
(ROCK, SCISSORS): Score(win=True, verb='smashes'),
}
GAME_MATRIX.update(dict(((second, first), Score(not win, verb))
for (first,second), (win,verb) in GAME_MATRIX.items()))
def main():
# keep scores: how many times computer, player win and number of ties
scores = dict(zip("computer player tie".split(), [0]*3))
display_welcome_message()
# set control loop
keep_going = 'Y'
while keep_going.upper() == 'Y':
try: play_game(scores)
except Exception as e:
print("Error: %s" % (e,))
sys.exit(1)
# prompt player to keep going
keep_going = input('Would you like to play again? (Y for Yes): ')
print('\nThe computer won {computer} times\n'
'The player won {player} times\n'
'There were {tie} tie scores'.format(**scores))
def play_game(scores):
# get players choices for this round
computer_choice = random.choice(ROCK_PAPER_SCISSORS)
player_choice = get_player_input()
# print choices
for player, choice in [('computer', computer_choice),
('player', player_choice)]:
print('The {0} chose: {1} ({2})'.format(player, NAME[choice], choice))
# update scores; print who wins
if player_choice == computer_choice:
scores['tie'] += 1
print('Tie Score, Please try again')
else:
score = GAME_MATRIX[computer_choice, player_choice]
if score.win: # computer wins
scores['computer'] += 1
template = '{first} {verb} {second}, Computer wins'
else: # player wins
scores['player'] += 1
template = '{second} {verb} {first}, Player wins'
print(template.format(first=NAME[computer_choice],
second=NAME[player_choice], verb=score.verb))
def display_welcome_message():
print(textwrap.fill(textwrap.dedent("""
Welcome to Rock Paper Scissors, a game of chance to see who
will outsmart the other. This game is Man VS Computer. The
program will select a random integer and then ask you to input
%s for Rock %s for Paper or %s for Scissors. The program will
then tell you who won the game. GOOD LUCK!
""" % tuple(ROCK_PAPER_SCISSORS))))
def get_player_input(ntries=10):
for _ in range(ntries):
try:
choice = int(input('\nSelect %s for Rock, %s for Paper, or '
'%s for Scissors: ' % tuple(ROCK_PAPER_SCISSORS)))
except ValueError:
pass
else:
if choice in ROCK_PAPER_SCISSORS:
return choice # success
print('Error: your choice must be one of: %s' % (
', '.join(map(str, ROCK_PAPER_SCISSORS))))
raise RuntimeError('failed to get player choice in %d tries' % ntries)
if __name__=="__main__":
main()
This code might be a good reference for you. :)
Good Luck !
Note that this is Py2.x code
# Author: Niklas Rosenstein
# Created: 2011/10/23
import sys
import random
PAPER = 0
ROCK = 1
SCISSOR = 2
WIN = 10
LOSS = 11
TIE = 12
TABLE = {
PAPER: 'Paper',
ROCK: 'Rock',
SCISSOR: 'Scissor',
}
if 'expand TABLE':
# just for overvieability
# expands the TABLE conveniently
tableExpand = [
(PAPER,('paper', 'p', '0')),
(ROCK, ('rock', 'r', 'stone', '1')),
(SCISSOR, ('scissor', 's', '2'))
]
exp = None
key = None
for exp in tableExpand:
for key in exp[1]:
TABLE[key] = exp[0]
del tableExpand, exp, key
class Game(object):
wins = 0
losses = 0
ties = 0
def evaluateInput(self, inp):
# evaluate the input
# raises ValueError if input is invalid
# lowercase the string
inp = inp.strip()
inp = inp.lower()
# comparison table
try:
return TABLE[inp]
except KeyError:
raise ValueError, 'Input is invalid.'
def choose(self, choice):
# make a choice and compare it with
# the computers choice
# check if the choice is correct
if choice not in [ROCK, PAPER, SCISSOR]:
raise ValueError, 'Expected Id of either ROCK, PAPER or SCISSOR'
# generate a choice for the computer
com = random.choice([ROCK, PAPER, SCISSOR])
result = choice - com
if result == 0:
self.ties += 1
return TIE, com
elif result < 0:
self.wins += 1
return WIN, com
else:
self.losses += 1
return LOSS, com
TEXT_CHOOSE = 'Choose (or "quit" to quit): '
TEXT_PLAYER_CHOOSE = "You've choosen: "
TEXT_COMPUTER_CHOOSE = 'The computer choosed: '
TEXT_CHOICE_INVALID = 'You choice is invalid.\n'
TEXT_WIN = "You've won this match."
TEXT_LOSS = "You've lost this match."
TEXT_TIE = "This match was tie."
TEXT_GOODBYE = "Thanks for playing."
TEXT_WELCOME = "Welcome to Rock-Paper-Scissor !\n" \
"This game is all about guessing. Try to choose the\n" \
"thing that beats the computers choice. Thereby, the\n" \
"following rules are importan:\n" \
" Paper beats Rock.\n" \
" Rock beats Scissor.\n" \
" Scissor beats Paper.\n" \
"\n" \
"Valid inputs are:\n\n" \
" | for Paper: | p | paper | - | 0 |\n" \
" | for Rock: | r | rock | stone | 1 |\n" \
" | for Scissor: | s | scissor | - | 2 |\n" \
" | To quit the game: | q | quit | - | - |\n" \
"\n" \
"Much fun whishes you: Niklas Rosenstein (2011)\n" \
+ ("-" * 50) + "\n"
def printScores(g):
print "Scores:"
print " Wins: %s" % g.wins
print " Losses: %s" % g.losses
print " Ties: %s" % g.ties
def main():
g = Game()
# play the game ;-)
print TEXT_WELCOME
while True:
inp = raw_input(TEXT_CHOOSE)
if inp.lower() in ('q', 'quit'):
break
try:
inp = g.evaluateInput(inp)
except ValueError:
print TEXT_CHOICE_INVALID
continue
t, com = g.choose(inp)
inp = TABLE[inp]
com = TABLE[com]
print TEXT_PLAYER_CHOOSE, inp
print TEXT_COMPUTER_CHOOSE, com
print
if t == WIN:
print inp, "beats", com + ".",
print TEXT_WIN
elif t == LOSS:
print com, "beats", inp + ".",
print TEXT_LOSS
else:
print inp, "euqals", com + ".",
print TEXT_TIE
print
printScores(g)
print "-" * 50
print
print TEXT_GOODBYE
printScores(g)
print
print "Press any key to exit."
sys.stdin.read(1)
main()
Here is another way to do it:
import random;
print ('Game of chance 1=Rock,2=Paper,3=Scissor');
print ('Type 9 to exit');
while 1:
z=random.randint(1,3);
a=int(input('1=Rock,2=Paper,3=Scissor:--->'));
if a==z:
print ('Tie!!!');
if a==1 and z==2:
print ('Rock covers paper So You Win!!!');
if a==2 and z==3:
print ('Scissor cuts paper so you loose :(');
if a==2 and z==1:
print ('Rock covers paper so you loose :(');
if a==3 and z==2:
print ('Scissor cuts paper So You Win!!!');
if a==9:
break
print ('Thanks for playing the game')
Another way of making Rock, Paper, Scissors but without looping is this...
import random
Rock = '1'
Paper = '2'
Scissors = '3'
print('Welcome to Rock, Paper Scissors! The game of all kids to decide on something. \nIn this game you will have to beat the computer once. \n(Psst if it\'s a draw the start the program again! ;D)\nSo how to play. Well, it\'s simple. Pick 1 for Rock, 2 for Paper and 3 for Scissors. \nSo Rock beats Scissors. Scissors cuts Paper and Paper covers Rock. Got it Lets play')
player=int(input('Please enter number 1 = Rock, 2 = Paper, 3 = Scissors: '))
if player<1 or player>3:
player=int(input('Invalid number. Please enter number 1 = Rock, 2 = Paper, 3 = Scissors: '))
if player<1 or player>3:
print('Well, now you can\'t play this game because you are mucking around. Next time DON\'T!')
else:
computer=random.randint(1, 3)
print(player,computer)
print('Remember Rock = 1, Paper = 2 and Scissors = 3')
if player==1 and computer==1 or player==2 and computer==2 or player==3 and computer==3:
print('It\'s a draw. =l Restart the game if you want to.')
if player==1 and computer==2 or player==2 and computer==3 or player==3 and computer==1:
print('Computer wins! You lose. Sorry. =(')
if player==1 and computer==3 or player==2 and computer==1 or player==3 and computer==2:
print('You have won. Well done. =D')
If that is any help.
Yet another way, adding Lizard and Spock
import random
def winner(p1, p2):
actors = ['Paper', 'Scissors', 'Spock', 'Lizard', 'Rock']
verbs = {'RoLi':'crushes', 'RoSc':'breaks', 'LiSp':'poisons',
'LiPa':'eats', 'SpSc':'smashes', 'SpRo':'vaporizes',
'ScPa':'cut', 'ScLi':'decapitate', 'PaRo':'covers',
'PaSp':'disproves'}
p1, p2 = actors.index(p1), actors.index(p2)
winner, looser = [(p1, p2), (p1, p2), (p2, p1), (p1, p2), (p2, p1)][p1 - p2]
return ' '.join([actors[winner],
verbs.get(actors[winner][0:2] + actors[looser][0:2],
'ties'),
actors[looser]])
more = True
while more:
z=random.randint(0,4);
a=int(input('1=Rock, 2=Paper, 3=Scissors, 4=Lizard, 5=Spock:--->'))-1;
if a==z:
print 'Tie\n';
else:
try:
print winner(a,z) + '\n'
except IndexError:
more = False
print ('Thanks for playing the game')
Output:
1=Rock, 2=Paper, 3=Scissors, 4=Lizard, 5=Spock:--->1
Rock crushes Lizard
1=Rock, 2=Paper, 3=Scissors, 4=Lizard, 5=Spock:--->2
Paper covers Rock
1=Rock, 2=Paper, 3=Scissors, 4=Lizard, 5=Spock:--->3
Scissors tie Scissors
1=Rock, 2=Paper, 3=Scissors, 4=Lizard, 5=Spock:--->4
Lizard poisons Spock
well... I would use a dictionary. If/elif/else statements work fine, but they are often messy. This is how I would approach it.
By the way, I am using Python 2. It seems like you are using Python 3 based on the way you use print and input. Don't copy off this code; just take the idea. I am using Python 2 because I am more comfortable with it; make the changes from both versions.
# Imports
import random
# Constants
SELECTION = ["rock", "paper", "scissors"]
WIN = -1 # This is a dummy assignment: we will return this value later.
WIN_LOSE_DICT = {("rock", "paper"): False,
("paper", "rock"): True,
("paper", "scissors"): False,
("scissors", "paper"): True,
("scissors", "rock"): False,
("rock", "scissors"): True}
# Variables
total_wins = 0
# Functions
def do_round():
comp = random.choice(SELECTION)
player = raw_input("Rock, paper, scissors, SHOOT! ").lower() # Set player response
# to lowercase
# Use input() on Python 3 and not raw_input()
while player not in SELECTION:
player = raw_input("Please choose either rock, paper, or scissors. ").lower()
if player == comp:
print "The computer chose %s: it is a tie." % comp
else:
result = WIN_LOSE_DICT[(player, comp)]
if result: # If you want to be clear, do - if result == True:
print "The computer chose %s: you win!" % comp
return WIN
else:
print "The computer chose %s: you lose" % comp
# Main
if __name__ == "__main__":
running = True
while running:
this_round = do_round()
if this_round == WIN:
total_wins += 1
print "You won %s times so far." % total_wins
continue_ = raw_input("Do you want to play another round (y/n) ?").lower()
if continue_ == "n":
continue
else:
running = False
print "Thank you for playing!"
I might have made a few mistakes here and there, but the concept is still there: use a dictionary and set a constant to be a negative number. You should also work on following PEP8 a bit more.
import random
lst=['rock','scisor','paper']
player_score=0
comp_score=0
print('''Welcome to the game of our childhood Rock, Paper and scisor.
play this game against the computer.You must input the
rock,paper,scisor .So let's start the game.''')
def new_game():
user_input=input("START A NEW GAME![Y/N]: \n")
if user_input.upper()=="Y":
global player_score
player_score=0
global comp_score
comp_score=0
RPS_game()
else:
print("Have a great day ahead!\n")
def again():
user_input=input("WANNA PLAY AGAIN![Y/N]: \n")
if user_input.upper()=="Y":
RPS_game()
else:
print("YOUR FINAL SCORE: ",player_score)
print("COMPUTER'S FINAL CORE: ",comp_score)
if comp_score>player_score:
print("OOPS!YOU LOOSE THE GAME\n")
new_game()
elif comp_score<player_score:
print("GREAT! YOU WON THE GAME\n")
new_game()
else:
print("IT'S A DRAW!\n")
new_game()
def RPS_game():
comp_move=random.choice(lst)
player_move=input("Enter your move: ")
if player_move=='rock' or player_move=='paper' or player_move=='scisor':
print("Computers Move:",comp_move)
if player_move=="rock":
if comp_move=="scisor":
print("YOU WON!")
global player_score
player_score=player_score+1
elif comp_move=="paper":
print("YOU lOOSE!")
global comp_score
comp_score=comp_score+1
elif comp_move=="rock":
print("TRY AGAIN!")
elif player_move=="paper":
if comp_move=="paper":
print("TRY AGAIN!")
elif comp_move=="scisor":
print("YOU lOOSE!")
comp_score=comp_score+1
elif comp_move=="rock":
print("YOU WON!")
player_score+=1
elif player_move=="scisor":
if comp_move=="paper":
print("YOU WON!")
player_score+=1
elif comp_move=="scisor":
print("TRY AGAIN!")
elif comp_move=="rock":
print("YOU LOOSE!")
comp_score=comp_score+1
again()
else:
print('''Enter correct spellings !
as "rock,paper,scisor"''' )
RPS_game()
RPS_game()

Categories

Resources