How to make variable values carry over outside of if statement - python

So, I've made a rock paper scissors program, and it works like a charm. The only gripe I have with it is that the scores in the output do not carry over afterwards. This is written in Python- and forgive me if the code in the box below is formatted wrong, I'm new to stack overflow.
ties = ties + 1, for example, will print properly, but then when the program is run again, if I get another tie, it won't say ties = 2, it'll keep saying Ties: 1. Or if I get a tie and a loss, it'll say Ties: 1 Loses: 0 and then it'll print Ties: 0 Loses: 1
import random
def main():
playRPS = str.lower(input("Play a game or rock paper scissors? Yes or no. "))
if(playRPS == "no"):
print("Well, why did you run the program them?")
while(playRPS == "yes"):
human = int(input("Welcome to rock paper scissors! Type 1 for rock, 2 for paper, or 3 for scissors"))
cpu = random.randint(1,3)
ties = 0
wins = 0
loses = 0
if(human == cpu):
print("It's a tie!")
ties = ties + 1
playRPS = input("Play again?")
elif(human == 1 and cpu == 2):
print("The computer picked paper, you picked rock, CPU wins!")
loses = loses + 1
playRPS = input("Play again?")
elif(human == 1 and cpu == 3):
print("The computer picked scissors, you picked rock, You win!")
wins = wins + 1
playRPS = input("Play again?")
elif(human == 2 and cpu == 1):
print("You picked paper, the computer picked rock, You win!")
wins = wins + 1
playRPS = input("Play again?")
elif(human == 2 and cpu == 3):
print("You picked paper, the computer picked scissors, CPU wins!")
loses = loses + 1
playRPS = input("Play again?")
elif(human == 3 and cpu == 1):
print("You picked scissors, the computer picked rock, CPU wins!")
loses = loses + 1
playRPS = input("Play again?")
elif(human == 3 and cpu == 2):
print("You picked scissors, the computer picked paper, You win!")
wins = wins + 1
playRPS = input("Play again?")
else:
print("An error occured, maybe you typed 4, or 5, or maybe you made a typo.")
playRPS = str.lower(input("Another game? Yes or no."))
print("Wins: " + str(wins))
print("Ties: " + str(ties))
print("Loses " + str(loses))
main()

As your code is written, each time the while loop runs, it resets ties, wins, and losses back to zero. Move those expressions outside the while loop, and the values won't be reset with each new game.

Related

Why does my code run a while statement when the while statment is finished?

I'm trying to make a rock, paper, scissors game, but each time I run it, when the game is supposed to be over, it asks the user to input rock, paper or scissors again. It doesn't add the result of that extra round into the counter, and it doesn't matter what the user input as long as the input something. I've been stuck at this and to me the entire code looks fine, but I want it to end right after either the computer or user get 3 wins. Here is the code:
import random
print("Welcome to rock, paper, scissors, where you will verse a computer, and the first one to win 3 rounds, wins!\n"
"to chose rock, enter r, to chose paper, enter p, to enter scissors enter s.")
computer = random.choice("rps")
print(computer)
player = str(input("Rock, Paper, Scissors, Shoot! "))
player_counter = 0
computer_counter = 0
player_win = 0
computer_win = 0
while player_counter <= 2 and computer_counter <= 2:
if player == "s" and computer == "s" or player == "p" and computer == "p" or player == "r" and computer == "r":
print("You and the computer tied!")
computer = random.choice("rps")
print(computer)
print("Your score is:", player_counter, "and the computer's score is:", computer_counter)
player = str(input("Rock, Paper, Scissors, Shoot! "))
elif player == "r" and computer == "p" or player == "p" and computer == "s" or player == "s" and computer == "r":
print("computer wins!")
computer_counter += 1
computer = random.choice("rps")
print(computer)
print("Your score is:", player_counter, "and the computer's score is:", computer_counter)
player = str(input("Rock, Paper, Scissors, Shoot! "))
elif player == "r" and computer == "s" or player == "p" and computer == "r" or player == "s" and computer == "p":
print("You win!")
player_counter += 1
computer = random.choice("rps")
print(computer)
print("Your score is:", player_counter, "and the computer's score is:", computer_counter)
player = str(input("Rock, Paper, Scissors, Shoot! "))
if player_counter == 3:
print("You win the game!")
elif computer_counter == 3:
print("You lose the game!")
The problem is that everything in your loop is offset — you start a new round before the loop restarts and before the winning condition is rechecked. On the next pass through the loop, it terminates.
You can fix this bug and delete a lot of unnecessary code by simply putting the choice at the start of the loop, in one spot, rather than having it copy+pasted into every individual if block after the score has been updated:
import random
print(
"Welcome to rock, paper, scissors, where you will verse a computer, "
"and the first one to win 3 rounds, wins!\n"
"To chose rock, enter r, to chose paper, enter p, "
"to enter scissors enter s."
)
player_counter = 0
computer_counter = 0
while player_counter < 3 and computer_counter < 3:
player = input("Rock, Paper, Scissors, Shoot! ")
computer = random.choice("rps")
print(computer)
if player == computer:
print("You and the computer tied!")
elif player + computer in ("rp", "ps", "sr"):
print("computer wins!")
computer_counter += 1
elif player + computer in ("rs", "pr", "sp"):
print("You win!")
player_counter += 1
else:
print(f"Invalid choice '{player}'.")
print(
f"Your score is: {player_counter} "
f"and the computer's score is: {computer_counter}"
)
if player_counter == 3:
print("You win the game!")
elif computer_counter == 3:
print("You lose the game!")
First of all, you enter the loop 3 times and read the input 3 times, but you read the input one time before the loop here,
player = str(input("Rock, Paper, Scissors, Shoot! "))
that's why you see that unnecessary input.
Secondly, you should read input only at the beginning of the loop, not inside of each condition. Here is a modified working code
import random
print("Welcome to rock, paper, scissors, where you will verse a computer, and the first one to win 3 rounds, wins!\n",
"to chose rock, enter r, to chose paper, enter p, to enter scissors enter s.")
computer = random.choice("rps")
print(computer)
#player = str(input("Rock, Paper, Scissors, Shoot! "))
player_counter = 0
computer_counter = 0
player_win = 0
computer_win = 0
while player_counter <= 2 and computer_counter <= 2:
player = str(input("Rock, Paper, Scissors, Shoot! "))
if player == "s" and computer == "s" or player == "p" and computer == "p" or player == "r" and computer == "r":
print("You and the computer tied!")
computer = random.choice("rps")
print(computer)
print("Your score is:", player_counter, "and the computer's score is:", computer_counter)
elif player == "r" and computer == "p" or player == "p" and computer == "s" or player == "s" and computer == "r":
print("computer wins!")
computer_counter += 1
computer = random.choice("rps")
print(computer)
print("Your score is:", player_counter, "and the computer's score is:", computer_counter)
# player = str(input("Rock, Paper, Scissors, Shoot! "))
elif player == "r" and computer == "s" or player == "p" and computer == "r" or player == "s" and computer == "p":
print("You win!")
player_counter += 1
computer = random.choice("rps")
print(computer)
print("Your score is:", player_counter, "and the computer's score is:", computer_counter)
#player = str(input("Rock, Paper, Scissors, Shoot! "))
if player_counter == 3:
print("You win the game!")
elif computer_counter == 3:
print("You lose the game!")
There is no need to write the input and use random.choice() statement each time you run into a condition. YOu can move both the input and the random.choice() at the start of the loop. This will also solve the problem of entering input after the computer or the user wins the game.
import random
print(
"Welcome to rock, paper, scissors, where you will verse a computer, and the first one to win 3 rounds, wins!\n"
"to chose rock, enter r, to chose paper, enter p, to enter scissors enter s."
)
player_counter = 0
computer_counter = 0
while player_counter <= 2 and computer_counter <= 2:
player = str(input("Rock, Paper, Scissors, Shoot! "))
computer = random.choice("rps")
print(computer)
if (
player == "s"
and computer == "s"
or player == "p"
and computer == "p"
or player == "r"
and computer == "r"
):
print("You and the computer tied!")
computer = random.choice("rps")
print(computer)
print(
"Your score is:",
player_counter,
"and the computer's score is:",
computer_counter,
)
elif (
player == "r"
and computer == "p"
or player == "p"
and computer == "s"
or player == "s"
and computer == "r"
):
print("computer wins!")
computer_counter += 1
print(computer)
print(
"Your score is:",
player_counter,
"and the computer's score is:",
computer_counter,
)
elif (
player == "r"
and computer == "s"
or player == "p"
and computer == "r"
or player == "s"
and computer == "p"
):
print("You win!")
player_counter += 1
print(computer)
print(
"Your score is:",
player_counter,
"and the computer's score is:",
computer_counter,
)
if player_counter == 3:
print("You win the game!")
elif computer_counter == 3:
print("You lose the game!")

Error in rock paper scissors game with Python

I'm trying to create a rock paper scissors game for a class assignment with Python, but I can't get the result out.
The game is supposed to start with the 1) user's input, 2) show what computer randomly chose, 3) the result (You win, You lose, or Tie with how you won or lost), 4) then ask if you want to Play again, and 5) finally escape.
I did succeed on the first 2 parts, but I can't figure out why 3, 4, 5 is not printing...
The result after showing what the computer played(2), it says 'None' then it loops back to (1) getting the input from the user.
Below is the code. Please advise me on how to fix them. Thank you so much!!
import random
while True :
player = input("Enter a number (0 for rock, 1 for paper, 2 for scissors) >>")
RPS = [0,1,2]
computer = random.choics(RPS)
RPS_dict = {0:'Rock', 1:'Paper', 2:'Scissors'}
print("The computer played", RPC_dict.get(computer))
def game(player, computer):
RPS_dict = {0:'Rock', 1:'Paper', 2:'Scissors'}
if player == computer:
print("Tie!")
elif player == 0:
if computer == 1:
print("You lose!", RPS_dict.get(computer), 'covers', RPS_dict.get(player))
else:
print("You win!", RPS_dict.get(player), 'cut', RPS_dict.get(computer))
elif player == 1:
if computer == 2:
print("You lose!", RPS_dict.get(computer), 'cut', RPS_dict.get(player))
else:
print("You win!", RPS_dict.get(player), 'covers', RPS_dict.get(computer))
game(player, computer)
print(game(player, computer))
again = input("Play again? 0 for no, 1 for yes\n")
Your function should be outside your while loop and you don't need to call it within a print statement...
import random
def game(player, computer):
if player == computer:
print('game tied')
else:
if (player == 1 and computer == 3) or (player == 2 and computer == 1) or (player == 3 and computer == 2):
print('you win')
else:
print('computer wins')
def choice(x):
y = None
if x == 1:
y = 'rock'
elif x == 2:
y = 'paper'
elif x == 3:
y = 'scissors'
return y
playing = True
while playing == True:
player_input = int(input("Enter 1 for rock, 2 for paper, 3 for scissors"))
print('You chose:'+ choice(player_input))
computer_input = random.choice([1,2,3])
print('Computer chose:'+ choice(computer_input))
game(player_input, computer_input)
restart = int(input("Enter 1 to play again or 2 to quit"))
if restart == 2:
playing = False

python rock paper scissors counter

I'm building a rock paper scissors game and I would like to add a counter to the code I already have.
I want to count wins, losses and ties, and print these when the player does not want to play anymore.
This code does just about everything else I set out to do. I have seen a few other ideas on the site, but none of them seem to be adaptable to my code. Any ideas?
Here is the code:
import random
def rock(rand):
if rand == (1):
print("Tie Game!")
elif rand == (2):
print("Your rock got covered by opponent's paper. You Lose!")
elif rand == (3):
print("You crushed the opponent's scissors with your rock! You Win!")
print("Good game!")
def paper(rand):
if rand == (1):
print("You covered opponent's rock with your paper. You Win!")
print("Good game!")
elif rand == (2):
print("Tie Game!")
elif rand == (3):
print("Your opponent cut your paper with its scissors. You Lose!")
def scissors(rand):
if rand == (1):
print("Your opponent's rock crushed your scissors. You Lose!")
elif rand == (2):
print("Your scissors cut opponent's paper. You Win!")
print("Good game!")
elif rand == (3):
print("Tie Game!")
def main():
name = input("What is your name? ")
print("Hello, " + name + "! I'm a rock paper scissors game.")
while True:
choice = input("Would you like to play? (yes/no) ").upper()[0]
if choice == "N":
print("Let's play later!")
break
elif choice == "Y":
print("Ok, lets play!")
print("Rules: Rock breaks Scissors, Scissors cuts Paper, Paper covers Rock. ")
raw = input("Choose rock, paper, or scissors ").upper()
try:
answer = raw[0]
except:
IndexError
print("Illegal input! Exiting.")
break
rand = random.randint(1, 3) # 1 = rock, 2 =Paper 3 = Scissors
if answer == "S":
scissors(rand)
elif answer == "P":
paper(rand)
elif answer == "R":
rock(rand)
else:
print("Enter a valid answer!")
main()
It would be better to put all the methods in a class instead of using global variables.
Here you go.
import random
my_win = 0
my_loss = 0
my_tie = 0
def rock(rand):
global my_tie, my_loss, my_win
if rand == (1):
print("Tie Game!")
my_tie += 1
elif rand == (2):
print("Your rock got covered by opponent's paper. You Lose!")
my_loss += 1
elif rand == (3):
print("You crushed the opponent's scissors with your rock! You Win!")
print("Good game!")
my_win += 1
def paper(rand):
if rand == (1):
print("You covered opponent's rock with your paper. You Win!")
print("Good game!")
my_win += 1
elif rand == (2):
print("Tie Game!")
my_tie += 1
elif rand == (3):
print("Your opponent cut your paper with its scissors. You Lose!")
my_loss += 1
def scissors(rand):
if rand == (1):
print("Your opponent's rock crushed your scissors. You Lose!")
my_loss += 1
elif rand == (2):
print("Your scissors cut opponent's paper. You Win!")
print("Good game!")
my_win += 1
elif rand == (3):
print("Tie Game!")
my_tie += 1
def main():
name = input("What is your name? ")
print("Hello, " + name + "! I'm a rock paper scissors game.")
while True:
choice = input("Would you like to play? (yes/no) ").upper()[0]
if choice == "N":
print("Let's play later!")
break
elif choice == "Y":
print("Ok, lets play!")
print("Rules: Rock breaks Scissors, Scissors cuts Paper, Paper covers Rock. ")
raw = input("Choose rock, paper, or scissors ").upper()
try:
answer = raw[0]
except:
print("Illegal input! Exiting.")
break
rand = random.randint(1, 3) # 1 = rock, 2 =Paper 3 = Scissors
if answer == "S":
scissors(rand)
elif answer == "P":
paper(rand)
elif answer == "R":
rock(rand)
else:
print("Enter a valid answer!")
print ("You win %d times!" % my_win)
print ("You lose %d times!" % my_loss)
print ("You tie %d times!" % my_tie)
main()
OUTPUT:
What is your name? a
Hello, a! I'm a rock paper scissors game.
Would you like to play? (yes/no) y
Ok, lets play!
Rules: Rock breaks Scissors, Scissors cuts Paper, Paper covers Rock.
Choose rock, paper, or scissors Rock
Tie Game!
Would you like to play? (yes/no) no
Let's play later!
You win 0 times!
You lose 0 times!
You tie 1 times!
Process finished with exit code 0

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.

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