2012-03-20 9 views
1

(ゲームプログラムを推測数を作る)私は、ゲームプログラムを推測数を作成する必要があり、コードを書かれているが、私の最初の数の推測を入力した後、出力は無限ループになり、永遠に繰り返し続けるので、私はシャットダウンを余儀なくされています私のプログラムをダウン。私の "{}"にはエラーがあるようですが、どこにエラーがあるのか​​分かりません。私はユーザーに8つの異なる時間を推測させなければならないし、それが繰り返されるので、第1の推測の結果に固執している。ここに私のコードは次のとおりです。私のコードでこの無限ループを取り除くには?

print "Welcome to the Perl Whole Number Guessing Game!\n Please enter a number between 1 and 100 and I will tell you if the number you're trying to guess is higher or lower than your guess. You have up to 8 chances to guess the number.\n"; 

my ($guess, $target, $counter); #my variables 
$target = (int rand 100) +1;  #must be between 1-100 
$counter =1; 

#1st guess: 
print "Enter guess #$counter:"; 
chomp ($guess = <>); 
while ($guess != $target) 
{ if ($guess < $target) 
{ 
    print "Your guess, $guess, is too low. Try again.\n "; 
    } 
else 
{ print "Your guess, $guess, is too high. Try again.\n "; 
}} 
until ($guess ==$target) 
{ 
    print "Congratulations! You guessed the secret number ($target) in $counter tries!\n"; 
} 
$counter ++; 

...そして、正確なコードは、最後のビットまで8回を繰り返していること、これは言う:私は、コードを持っていることができるようにしたい

#8th and final guess: 
print "Enter guess #$counter:"; 
chomp ($guess = <>); 
while ($guess != $target) 
{ if ($guess < $target) 
{print "I'm sorry, you didn't guess the secret number, which was $target.\n"; 
} 
else 
{print "I'm sorry, you didn't guess the secret number, which was $target.\n"; 
}} 
until ($guess ==$target) 
{ print "Congratulations! You guessed the secret number ($target) in $counter tries!\n"; 
} 

推測する私に尋ねます再びすべての8回、非常に最初の推測無限ループに行くことなく。

注:私はPerlプログラミングクラスを始めて最初に思いますし、任意の空想、困難なコードを使用することはできません、基本的には最も簡単な解決策は、本当に私はちょっと理解できる唯一のことが最良であると。

ありがとうございました!

+1

まず、コードの最初の部分を7回コピーして貼り付けたことを意味しますか? –

+0

何が繰り返されていますか? 「あなたの推測は低すぎますか? (または "高") –

答えて

0

あなたはまず、あなたの中の内側にあなたの増分を配置する必要があります。

繰り返しコードは、プログラムを作る恐ろしい方法です。それがループの目的です。 あなただけの第八の試行後にループから抜け出す必要があります。

PERLは選択の私のLANGはありませんが、ほとんどの言語では、このような構文は動作します:

while (($guess != $target) && ($count <= 8)) 
{...} 
+0

@Drのおかげで、私はちょうど実現しました。私が投稿したコードが必要であることと、ループの中で質問を動かすことをKameleonに教えてください。 – TecBrat

+0

参考までに、言語はPERLではなくPerlです。 http://perldoc.perl.org/perlfaq1.html#What's-the-difference-between-%22perl%22-and-%22Perl%22%3f –

+0

私が言ったように、私の言語は選択肢ではないので... – TecBrat

0

while ($guess != $target)

手段をユーザーの推測では、コンピュータが「考えを持っている乱数ではありませんが」... は括弧で囲まれて何をすべきか...

IS

:メッセージを印刷するには(推測があったかどうか 『』、 『低高』または正しい)

、我々はこのゲームをプレイしましょう...それについて考えて...と私はあなたが考えるのは、それをシミュレートしてみましょう...あなたの数を推測しなければならない1 ...

  • よ番号は(さんが言わせて:ターゲット= 34)
  • 私は(のは言わせて:45)の推測を作ってるんだ
  • 私の推測が正しいではありませんが、だから、「それは高すぎだ」

を教えてください、あなた私の主張を得る:コードの残りの部分は決して実行されません。あなたは、単にので...別の推測を行うせることなく、私が間違っていることを私に言って

を維持するように、なぜあなたは...その邪悪で何かをしない... WHILE?

0

私はPerlを知らないが、(推測しながら、論理的に、あなたは一つのループ

に全体を入れることができます!答えが目標増加wrongAnswerカウンタに等しくない場合= & & wrongAnswer < 8) {

}

を標的とします。

2

繰り返しコードは、おそらく非常に単純な場合を除いて、基本的には決して行うべきではありません。あなたは特定のカウントを持っているので、カウンターでforループを使用してください。

また、簡単な間違いを避けて情報の誤りを避けるために、use warnings; use strict;も必ず使用してください。

また、if文で正しい推測が検出されません。数字が高すぎるかどうかを確認するには、elsif(yes、 "e"なし)を使用する必要があります。

my $guesses = 8; 
for my $counter (1 .. $guesses) { 
    print "Enter guess #$counter:"; 
    chomp (my $guess = <>); 
    if ($guess < $target) { 
     print "Your guess, $guess, is too low. Try again.\n "; 
    } elsif ($guess > $target) { 
     print "Your guess, $guess, is too high. Try again.\n "; 
    } else { 
     print "Congratulations! You guessed the secret number ($target) in $counter tries!\n"; 
    } 
} 
+0

もしできれば、あなたは 'if($ guess == $ target){print" Congrats ";最終; } 'あなたが残っているのは、if/elseであり、コードが勝利した場合にはループしません。 (TLP私はあなたがこれを行うことができると知っている、私はOPの利益のために言及) –

0

他のポスターが指摘しているように、whileループのどこかで増分する必要があります。また、次のコードブロックを必要としない点に注意してください。

until ($guess ==$target) { 
    print "Congratulations! You guessed the secret number ($target) in $counter tries!\n"; 
} 

あなたのコードでは、このポイントに到達した場合、$の推測は$ターゲットに等しいという条件が既に満たされています。だから、もう一度チェックするのは冗長です。 untilブロックをスキップし、whileループの後にprintステートメントに右に行くことができます。

残りの最も重要な問題は、whileブロックが開始される前に入力を1回だけ求めていることです。したがって、whileブロックの間、ユーザーは2度目の推測の機会を得ることはありません。推測は変わらず、ループは永遠に続くでしょう。コードの繰り返しを避けるために、あなたはサブルーチンに推測コードを置くことができます:あなたはwhileループに到達する前に

sub guess { 
    print "Enter guess #$counter:"; 
    chomp($guess = <>); 
} 

はその後、一度このサブルーチンを呼び出す:

guess(); 

その後一度だけあなたの終了前にブロック中:あなたの無限ループのあなたを中断しますwhileループで次のパス、前に$の推測変数を再シードします

guess(); 

。私はあなたにコードサンプル全体を渡しましたが、これは "宿題"とタグ付けされているので、あなた自身でこれらの問題を解決するメリットを奪うでしょう。 :)

関連する問題