-1

このコードに入る基本的なスコアリング システムの実行方法を教えてください。

import random
print 'Welcome to Rock, paper, scissors!'
firstto=raw_input('How many points do you want to play before it ends? ')

playerscore=+0
compscore=+0

while True:
    choice = raw_input ('Press R for rock, press P for paper or press S for scissors, CAPITALS!!! ')

    opponent = random.choice(['rock', 'paper' ,'scissors' ])

    print 'Computer has chosen', opponent

    if choice == 'R' and opponent == "rock":
        print 'Tie'
        playerscore = playerscore+0
        compscore = compscore+0

    elif choice == 'P' and opponent == "paper":
        print 'Tie'
        playerscore = playerscore+0
        compscore = compscore+0

    elif choice == 'S' and opponent == "scissors":
        print 'Tie'
        playerscore = playerscore+0
        compscore = compscore+0

    elif choice == 'R' and opponent == "paper":
        print 'CPU Wins'
        playerscore = playerscore+0
        compscore = compscore+1

    elif choice == 'P' and opponent == "scissors":
        print 'CPU Wins'
        playerscore = playerscore+0
        compscore = compscore+1

    elif choice == 'S' and opponent == "rock":
        print 'CPU Wins'
        playerscore = playerscore+0
        compscore = compscore+1


    elif choice == 'P' and opponent == "rock":
            print 'You Win'
            playerscore = playerscore+1 
            compscore = compscore+0

    elif choice == 'S' and opponent == "paper":
            print 'You Win'
            playerscore = playerscore+1
            compscore = compscore+0

    elif choice == 'R' and opponent == "scissors":
            print 'You Win'
            playerscore = playerscore+1
            compscore = compscore+0


    print 'Player score is',playerscore
    print 'Computer score is',compscore

    if playerscore == firstto:
        'You won the game :)'
        exit()
    elif compscore == firstto:
        'You lost the game :('
        exit()
4

3 に答える 3

3

問題はraw_input3 行目にあります。raw_input常に文字列を返しますが、必要なのは int です。3 行目を次のように変更した場合:

firstto = int(raw_input('How many points do you want to play before it ends? '))

あなたのコードは動作します。

"hello"ユーザー入力をサニタイズするには (ユーザーが の代わりに入力したときにコードがクラッシュしないようにするため)、呼び出しを,ステートメントに5ラップできます。raw_inputtryexcept

例えば:

valid_input = False # flag to keep track of whether the user's input is valid.
while not valid_input:
    firstto_str = raw_input('How many points do you want to play before it ends? ')
    try:
        # try converting user input to integer
        firstto = int(firstto_str)
        valid_input = True
    except ValueError:
        # user input that cannot be coerced to an int -> raises ValueError.
        print "Invalid input, please enter an integer."

余談ですがraw_input、整数との比較で提供された文字列を使用していたため、コードは無限ループに陥っていました。これは常に False を返します。

>>> "5" == 5
False
于 2013-09-12T11:33:08.450 に答える
1

このコードを最適化する方法はたくさんありますが、差し迫った問題はraw_inputポイントの入力です。これは文字列を返しますが、int. で巻いてint()大丈夫です。つまり、誰かが解析できない何かを入力するまでです。

firstto = int(raw_input('How many points do you want to play before it ends? '))

編集:興味がある場合は、コードを少し最適化してみました(極端に行くことなく):

import random

what_beats_what = [('R', 'S'), ('S', 'P'), ('P', 'R')]
choices = {'R': 'Rock', 'P': 'Paper', 'S': 'Scissors'}


def outcome(player_a, player_b):
    for scenario in what_beats_what:
        if player_a == scenario[0] and player_b == scenario[1]:
            return 'A'
        elif player_b == scenario[0] and player_a == scenario[1]:
            return 'B'


print 'Welcome to Rock, paper, scissors!'

score_to_win = 0

while True:
    try:
        score_to_win = int(raw_input('How many points do you want to play before it ends? '))
        if score_to_win > 0:
            break
    except ValueError:
        pass

    print 'Try again, with a positive integer.'

human_score = 0
cpu_score = 0

while human_score < score_to_win and cpu_score < score_to_win:
    human_choice = ''
    while True:
        human_choice = raw_input('Press R for rock, press P for paper or press S for scissors: ').upper()
        if human_choice in choices:
            break
        else:
            print 'Try again ...'

    cpu_choice = random.choice(choices.keys())
    print 'Computer has chosen: {0}'.format(choices[cpu_choice])

    result = outcome(human_choice, cpu_choice)

    if result == 'A':
        print "Human wins!"
        human_score += 1
    elif result == 'B':
        print "CPU wins!"
        cpu_score += 1
    else:
        print 'It is a tie!'

    print 'Human score is: {0}'.format(human_score)
    print 'CPU score is: {0}'.format(cpu_score)

print 'You won the game :)' if human_score > cpu_score else 'You lost the game :('
于 2013-09-12T11:45:02.190 に答える
0

最初の raw_input 値を変更します。あなたはそこで文字列を取得しています。

より良い結果を得るには、入力も検証してください:-)

while 1:
    firstto=raw_input('How many points do you want to play before it ends? ')
    if firstto.isdigit():
        firstto = int(firstto)
        break
    else:
        print "Invalid Input. Please try again"

これは、数字を含む文字列のみを受け入れます。誰かが「5.0」と入力しても無視されます。

raw_input の詳細については、ここをクリックしてください。組み込み文字列メソッドの詳細については、こちらをお読みください

PS:これは質問とは関係ありません。でもちょっと提案。あなたのコードはもっと簡単にできます。学習中の場合は、このコードを v0.1 のままにして、進行状況に応じて更新してください。

于 2013-09-12T12:02:18.247 に答える