2016-03-26 21 views
1

これは私の最初の投稿ですが、私はここでGoogleを介して多くの素晴らしい情報を見つけました。現時点では、私はPython Programming Absolute Beginnerを研究しています。私は本の比較的早い段階で挑戦の質問の一つに立ち往生しています。課題は、1から100の間でランダムに選択した数字を推測するプログラムを作成することです。Pythonの初心者は、この1つにこだわった

この時点では、有効ではない回答が除外され、最終的にはルールでプレイすると推測されます。あなたが正直にゲームをプレイすると、それは動作します。しかし、 "高い"の代わりに "低い"を置くと、プログラムがクラッシュするポイントになります。これは動作しますが、私はむしろカウンターをリセットして、メッセージでユーザーを罵倒します。

とにかく、これまでのところ私のコードです。 whileループの最初の "if"節を使って作業していれば、どこで何をしようとしているのか分かります。どう思いますか?

#Computer Guesses Number Program 

import random 

print("Please select a number between 1 and 100.") 
print("As I attempt to guess, you may respond with Higher, Lower, or Yes.") 

input("\nPress enter to continue.") 

#Start Guessing in the Middle 
guess = 50 
response = input("\nIs your number " + str(guess) + "?") 

#Narrow down guessing further 
if response.lower() == "higher": 
    guess = 75 
    lowerbound = 50 
    upperbound = 100 
    response = input("\nIs your number " + str(guess) + "?") 
else: 
    guess = 25 
    lowerbound = 1 
    upperbound = 50 
    response = input("\mIs your number " + str(guess) + "?") 

#Guess loop - eliminates invalid responses and need for capitalization 
while response.lower() != "yes": 
    if lowerbound > upperbound or upperbound < lowerbound: 
     print("You've been dishonest, let's try again.") 
     guess = 50 
     lowerbound = 1 
     upperbound = 100 
    elif response.lower() == "higher": 
     lowerbound = guess + 1 
     guess = random.randint(lowerbound, upperbound) 
    elif response.lower() == "lower": 
     upperbound = guess - 1 
     guess = random.randint(lowerbound, upperbound) 
    else: 
     print("The response options are 'Higher', 'Lower', or 'Yes'.") 

    response = input("Is this your number " + str(guess) + "?") 

print("\nI knew it was ", guess, "the whole time!") 
input("\n\nPress enter to exit.") 

答えて

3

あなたが得るエラーは、例えば、randintに無効な範囲を渡すことです:

ValueError: empty range for randrange() (51,51, 0) 

randrangeは内部randintによって使用され、最初の二つの引数としてstartstop値を期待しています。間接的には、startstopより低いことが必要です。あなたはrandintを呼び出す前にlowerbound < upperboundことを世話をする必要がありますので、あなたのコードで

は、あなたは、引数lowerboundupperboundrandintを使用しています。

あなたは既に(ところでa < bは - あなたはちょうど別の方向にそれを読んb > aと同じであることに注意してください。)ループ内のその最初のifと場所にチェックを持っているが、それは間違っている時にチェックされています:あなたが欲しいですこれらの境界線の1つが変更された後で、randintに電話する前にチェックを実行します。私たちは、ユーザの入力を解析する際に、我々は唯一の境界線を変更するには、ここで

while response.lower() != "yes": 
    if response.lower() == "higher": 
     lowerbound = guess + 1 
    elif response.lower() == "lower": 
     upperbound = guess - 1 
    else: 
     print("The response options are 'Higher', 'Lower', or 'Yes'.") 
     response = input("Is this your number " + str(guess) + "?") 
     continue 

    if lowerbound > upperbound: 
     print("You've been dishonest, let's try again.") 
     guess = 50 
     lowerbound = 1 
     upperbound = 100 
    guess = random.randint(lowerbound, upperbound) 
    response = input("Is this your number " + str(guess) + "?") 

:それをする

一つの方法は、このようなあなたの流れを変更することです。ユーザーが無効なものを入力した場合は、もう一度尋ねて、最初からループを続けます(下部をスキップします)。それ以外の場合は、境界が更新された後、境界の検証を実行してから、randintを使用して新しい推測を行います。

このようにして、有効な境界線を持つrandintを確実に使用します。

+0

あなたの助けをありがとう、それは多くの意味があります。私は近くにいる気がしましたが、それはかなり見えませんでした。 – dstana

+0

ようこそ。あなたの質問に答えた場合は、[解決してください](http://meta.stackexchange.com/a/5235/141542)を覚えてください。 – poke

関連する問題