Python中的岩石纸剪刀

时间:2011-10-23 00:06:47

标签: python python-3.x

我正在尝试编写一个Python程序,但我很难获得分数。我把它写成一个值返回函数,每次运行程序时,它似乎跳过它检索得分的步骤,除非我包含一个else语句,它会自动跳过else语句。 我将附上以下完整代码。 非常感谢你的帮助,我很高兴! 这也是我第一次在这个论坛发帖,如果我搞砸了,我道歉。

#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()

10 个答案:

答案 0 :(得分:7)

这有很多错误,很难知道从哪里开始(但不要气馁)......

首先,它看起来像(主要是从使用input {对{1}},并与您的打印语句的括号)你使用Python 3,这已经是要限制你获得的帮助。大多数人仍在使用Python 2.6或2.7。但随着这一切......

解决您问题的主要问题是:

首先:您使用字符串进行播放器输入(例如“1”,“2”,“3”)和计算机选择的数字(例如1,2,3)。所以你需要比较它们。换句话说,而不是:

raw_input

你需要说:

if computer == 1 and play == 2:

第二:你试图在另一个函数中引用一个函数的变量,这是行不通的。如果您希望if computer == 1 and play == '2': 等变量是全局变量,则需要在全局范围内初始化它们,例如:在您宣布“#constants”之后和进入computer_wins之前。然后在任何使用它们的函数中,你必须说,例如main表示他们是全球性的而不是本地的。

一旦你解决了这些问题,它应该会更好一点,但你仍然需要做很多清理工作并继续努力!

坚持下去,很快你会很自然。

答案 1 :(得分:3)

我单独回答了你的问题,但只是为了好玩这里有一个小工作的Rock,Paper,Scissors游戏来看看。这个适用于Python 2.x,可能不适用于Python 3,但它可能对您或将来搜索此内容的人有所帮助。

# "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()

答案 2 :(得分:1)

快速浏览代码的几个快速说明:

get_score()中,你可以添加一个else子句来处理发生的任何关系,你不必在play_game()

中明确检查它

import random移至文件顶部。导入通常始终位于文件的顶部。此外,每次需要随机数时都无需重新导入。

不确定这是否是拼写错误,因为play似乎总是包含一个整数,但play == Trueplay == False位于play_game()内。如果您想play包含TrueFalse,则需要使用单个等号,例如play = True。但这似乎没有意义,因为您将playcomputer进行比较,就好像它们是整数一样。

另外,您想要使用score方法中的get_score()变量完成什么?

啊,如果你让get_score()方法返回一些东西,那么你知道谁赢了这场比赛就会有所帮助。您无法在computer_wins方法中访问player_winsget_score(),因为它们是在main()内定义的。一个简单的方法是从get_score()返回一个int。这是一种相当C风格的处理方式(返回-1/0/1)。像(伪代码):

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'

答案 3 :(得分:0)

此代码可能是您的一个很好的参考。 :)
祝你好运!
请注意,这是Py2.x代码

# 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()

答案 4 :(得分:0)

这是另一种方法:

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')

答案 5 :(得分:0)

这是另一个适用于Python 2.x和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()

答案 6 :(得分:0)

制作摇滚,纸张,剪刀但没有循环的另一种方法是......

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')

如果有任何帮助。

答案 7 :(得分:0)

另一种方式,添加Lizard和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')

输出:

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

答案 8 :(得分:0)

好吧...我会用字典。 if / elif / else语句可以正常工作,但它们通常很混乱。这就是我的处理方式。

顺便说一句,我正在使用Python2。似乎您在使用基于打印和输入方式的Python 3。不要复制此代码;只是接受这个想法。我使用Python 2是因为我对它更满意。从两个版本进行更改。

# 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!"

我可能在这里和那里都犯了一些错误,但是这个概念仍然存在:使用字典并将常量设置为负数。您还应该进一步关注PEP8。

答案 9 :(得分:0)

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()