Python摇滚,纸,剪刀游戏。并不总是给出正确的答案

时间:2015-08-21 12:17:09

标签: python python-3.x

我正在尝试在 python 3.4 中制作一个简单的 Rock,Paper,Scissors 游戏,它在一定程度上有效但有些时间我得到了“You Won Rock crushes Rock”的输出,即使我认为我已经阻止了这种情况的发生,并且只允许使用我的elif和if语句获得代码的某些结果。所以任何人都可以告诉我为什么有时这不起作用。 :)

import random

count = 0
OPTIONS = ['rock', 'paper', 'scissors']
    # then check if the user lose's, wins ties

def computer():
    return random.choice(OPTIONS)

print("\n"+"-=-"*11)
print("Welcome to ROCK, PAPER, SCISSORS")
print("              GAME")
print("   It's you Vs. the computer!")
print("-=-"*11)
while True:
    user = input("What do you choose Rock, Paper, Scissors: ").lower()
    if user in OPTIONS:
        # Possible user time a user can succeeds rock beats sicissor, sicissors cuts paper, paper covers rock
        if user == computer():
            print("tie")

        elif user == 'rock' and computer() == 'scissors':
            print("\nYou Won! {} crushes {}".format(user.title(), computer().title()))

        elif user == 'scissors' and computer() =='rock':
            print("\nComputer Won! {} crushes {}".format(computer().title(), user.title() ))

        elif user == 'scissors' and computer() == 'paper':
            print("\nYou Won! {} cuts {}".format(user.title(), computer().title()))

        elif user == 'paper' and computer() == 'scissors':
            print("\nComputer Won! {} cuts {}".format(computer().title(), user.title()))

        elif user == 'paper' and computer() == 'rock':
            print("\nYou Won! {} covers {}".format(user.title(), computer().title()))

        elif user == 'rock' and computer() == 'paper':
            print("\nComputer Won! {} covers {}".format(computer().title(), user.title()))


    else:
        print("\nMake sure you choose ethier Rock, Paper or Scissors")
    enter code here

4 个答案:

答案 0 :(得分:11)

    elif user == 'rock' and computer() == 'scissors':
        print("\nYou Won! {} crushes {}".format(user.title(), computer().title()))

每次拨打computer()时,它都会生成一个全新的值,与之前的任何呼叫无关。例如,在上面的代码中,完全有可能第一个computer()调用返回“剪刀”,第二个调用返回“rock”。

在循环中只调用computer()一次,然后存储结果。然后将该值用于其余代码。

while True:
    user = input("What do you choose Rock, Paper, Scissors: ").lower()
    if user in OPTIONS:
        computer_move = computer()
        # Possible user time a user can succeeds rock beats sicissor, sicissors cuts paper, paper covers rock
        if user == computer_move:
            print("tie")

        elif user == 'rock' and computer_move == 'scissors':
            print("\nYou Won! {} crushes {}".format(user.title(), computer_move.title()))
        #etc

答案 1 :(得分:1)

您的computer()函数调用一个随机数。
因此,每当您在代码中调用计算机()时,您都会随机选择'一个全新的数字。
因为只有三个答案,你可能会经常得到正确的答案。

把这个功能称为滚动模具(三面,哇)。所以现在你的程序看起来像这样:

def RollDice():
return random.choice(OPTIONS)
#...
while True:
    user = input("What do you choose Rock, Paper, Scissors: ").lower()
    if user in OPTIONS:
        # Possible user time a user can succeeds rock beats scissor, scissors cuts paper, paper covers rock
        if user == RollDice:
            print("tie")

        elif user == 'rock' and RollDice == 'scissors':
            print("\nYou Won! {} crushes {}".format(user.title(),  RollDice.title()))

        elif user == 'scissors' and RollDice =='rock':
            print("\nComputer Won! {} crushes {}".format(RollDice.title(), user.title() ))
#...

现在您可以看到问题所在。

您真正想要的是拯救“一个人”的价值。在if语句的最开头随机选择:

if user in OPTIONS:
    computerChoice = computer()
    if user == computerChoice:
        print("tie")

    elif user == 'rock' and computerChoice == 'scissors':
        print("\nYou Won! {} crushes {}".format(user.title(), computerChoice.title()))

    elif user == 'scissors' and computerChoice =='rock':
        print("\nComputer Won! {} crushes {}".format(computerChoice.title(), user.title() ))
    #....

这样你就可以在变量中保存一个常量选项来调用。

附:最好使用 raw_input 而不是输入,以便程序自动将用户输入更改为字符串。

答案 2 :(得分:1)

免责声明,答案已经给出,这仅仅是为了推广游戏的兴趣达到顶峰。

要制作任何类型的Rock-Paper-Scissor游戏,您可以意识到它实际上是一个循环的胜利表。

例如,如果你这样做:

P-R-S..P-R-S

你可以看到上一个字母总是在下一个字母上获胜。

使用这种方法,使用环视表创建自定义摇滚纸剪刀游戏变得很容易:

import random
from collections import OrderedDict

# Important to retain order of "kill"
OPTIONS = OrderedDict([('P', 'Paper'),
                       ('R', 'Rock'),
                       ('S', 'Scissors')])
# N_KILLS determines how many letters in front it is killing
N_KILLS = 1

OPTIONS = OrderedDict([('P', 'Princess'),
                       ('J', 'Knight'),
                       ('W', 'Wizard'),
                       ('D', 'Dragon'),
                       ('K', 'King')])
N_KILLS = 2


# Create lookup table
LOOKUP = OPTIONS.keys()
# Number of items
N_ITEMS = len(LOOKUP)

# Options to choose from
STR_OPTIONS = ' ,'.join( OPTIONS.values() )

def computer():
    return random.randint(0,N_ITEMS-1)

print("\n"+"-=-"*11)
print("Welcome to "+STR_OPTIONS)
print("              GAME")
print("   It's you vs. the computer!")
print("-=-"*11)
while True:

    # Convert user option to integer
    uidx = computer()

    if uidx >= 0:
        # Get computer index
        cidx = computer()

        d = cidx - uidx

        # Correct for wrap-arounds
        if d > N_KILLS: 
            d = d - N_ITEMS
        elif d < -N_KILLS:
            d = d + N_ITEMS

        print(' You choose: '+OPTIONS[LOOKUP[uidx]] + ' computer chooses: '+OPTIONS[LOOKUP[cidx]])

        if d == 0:
            print('   Tie ...')
        elif d > 0 and d <= N_KILLS:
            print('   You WIN ...')
        elif d < 0 and -d <= N_KILLS:
            print('   You LOOSE ...')
        else:
            # This will only occur if N_KILLS*2+1<N_ITEMS
            print('   Tie ...')

不仅代码更容易阅读(在我看来),而且实现几个新的游戏变得非常容易。例如,检查这个惊人的游戏:http://www.umop.com/rps101.htm

答案 3 :(得分:0)

如上所述,对于每个游戏,你几乎都是正确的,对computer()的调用应该只进行一次。显示两个玩家的选择也是有意义的。此外,当你在标题案例中工作时,将所有内容转换为使用它是有意义的,以避免需要多次调用.title()

import random

OPTIONS = ['Rock', 'Paper', 'Scissors']
    # then check if the user lose's, wins ties

def computer():
    return random.choice(OPTIONS)

print("\n"+"-=-"*11)
print("Welcome to ROCK, PAPER, SCISSORS")
print("              GAME")
print("   It's you Vs. the computer!")
print("-=-"*11)

while True:
    user_choice = input("\nWhat do you choose Rock, Paper, Scissors: ").title()
    computer_choice = computer()
    print("User: {}   Computer: {}".format(user_choice, computer_choice))

    if user_choice in OPTIONS:
        # Possible user_choice time a user_choice can succeeds rock beats sicissor, sicissors cuts paper, paper covers rock
        if user_choice == computer_choice:
            print("tie")

        elif user_choice == 'Rock' and computer_choice == 'Scissors':
            print("You Won! {} crushes {}".format(user_choice, computer_choice))

        elif user_choice == 'Scissors' and computer_choice == 'Rock':
            print("Computer Won! {} crushes {}".format(computer_choice, user_choice ))

        elif user_choice == 'Scissors' and computer_choice == 'Paper':
            print("You Won! {} cuts {}".format(user_choice, computer_choice))

        elif user_choice == 'Paper' and computer_choice == 'Scissors':
            print("Computer Won! {} cuts {}".format(computer_choice, user_choice))

        elif user_choice == 'Paper' and computer_choice == 'Rock':
            print("You Won! {} covers {}".format(user_choice, computer_choice))

        elif user_choice == 'Rock' and computer_choice == 'Paper':
            print("Computer Won! {} covers {}".format(computer_choice, user_choice))
    else:
        print("Make sure you choose either Rock, Paper or Scissors")

所以游戏看起来像:

-=--=--=--=--=--=--=--=--=--=--=-
Welcome to ROCK, PAPER, SCISSORS
              GAME
   It's you Vs. the computer!
-=--=--=--=--=--=--=--=--=--=--=-

What do you choose Rock, Paper, Scissors: rock
User: Rock   Computer: Scissors
You Won! Rock crushes Scissors