2

誰かがループで私を助けてくれませんか。私は、1 から 10 までの数字を推測するだけのプログラムを作成するつもりです。それが正しくない場合は、別のチャンスが与えられます。

スクリプトで正しい/正しくない印刷を一度に行うことはできますが、このスクリプトに、ユーザーが (正しい数字を推測するまで) 再試行できるようにするにはどうすればよいですか?

これが私の基本的なスクリプトです。これは非常に単純化されており、おそらくエラーでいっぱいです。誰かがこの単純な問題を解決するのを手伝ってくれませんか?

悪いレイアウトで申し訳ありませんが、このサイトにスクリプトを配置する方法がわかりません。申し訳ありません!

use strict;
use warnings;

print "Hello, I've thought of a number, do you know what number it is?\n";
sleep (1);
print "Try and guess, type in a number between 1 and 10!\n";
my $div = <STDIN>;
my $i = 0;
my $int = int(rand (10)) + 1;
chomp $div;
if  ($div < $int) {
    print ("The number I though of is higher than $div, try again?\n");
}

if ($div > $int) {
    print ("The number I though of is lower that $div, try again?\n");
}

if ($div == $int) {
    print ("Amazing, you've guessed mt number\n");
}
4

2 に答える 2

2

until ループを使用する

my $guessed = 0; 
do {
    print "Try and guess, type in a number between 1 and 10!\n";

    my $div = <STDIN>;

    ...;

    if ($div == $int) {

        print ("Amazing, you've guessed mt number\n");
        $guessed = 1;

    }
} until ($guessed)
于 2013-03-16T12:27:42.247 に答える
2

より直接的なアプローチはwhileloopです。

use strict;
use warnings;

print "Hello, I've thought of a number, do you know what number it is?\n";
sleep (1);
my $int = int(rand (10)) + 1;
print "Try and guess, type in a number between 1 and 10!\n";

while (my $div = <STDIN>) {
  chomp $div;
  if  ($div < $int) {
      print "The number I though of is higher than $div, try again?\n";
  } 
  elsif ($div > $int) {
    print "The number I though of is lower that $div, try again?\n";
  }
  else {
    print "Amazing, you've guessed mt number\n";
    last;
  }
}

(しゃれを意図した) あなたのコードはすでに非常に優れています (あなたは and を使用してstrictおりwarnings、構文エラーはありません!) 私が変更した点と、改善を提案したい点がいくつかあります。

しかし、最初に、ループを見てみましょう。while条件が真である限り、プログラムはループにとどまります。ユーザーが入力できるものはすべて (空行であっても) Perl によって true と見なされるため、これは永遠に続きます。ループを終了する条件があるため、これは問題ありません。のelse部分にありifます。このlastステートメントは、Perl にループを終了するように指示します。が実行されない場合、ブロックelseの先頭に戻り、ユーザーは再試行する必要があります。while永遠に。

$i私が行った変更: -使用していないので必要ありません- 3 つの別々のifステートメントを使用しました。この場合、3 つの条件のうち 1 つだけが true になる可能性があるため、それらを 1 つにマージしました()print

提案: - 変数の名前ではなく、変数の機能に合わせて名前を付ける必要があります。$intは良い名前ではありません。$random、または$random_number. 後でコードに戻る必要がある場合、冗長性は重要です。- で有効にできるという機能sayuse feature 'say';があります。say "stuff"に相当するものとして追加されprint "stuff\n"ます。


編集:

ユーザーが入力した番号に直接関係しない他の条件を追加する場合は、別の を追加できますif

while (my $div = <STDIN>) {
  chomp $div;

  if ($div eq 'quit') {
    print "You're a sissy... the number was $int. Goodbye.\n";
    last;
  }

  if ($div < $int) {
      print "The number I though of is higher than $div, try again?\n";
  } 
  elsif ($div > $int) {
    print "The number I though of is lower that $div, try again?\n";
  }
  else {
    print "Amazing, you've guessed mt number\n";
    last;
  }
}

チェックを追加して、ユーザーが番号を入力したことを確認することもできます。単語または文字が入力された場合、現在のコードは警告を生成します。そのためには、正規表現が必要です。perlreでそれらを読んでください。はm//、と一緒に機能する一致演算子=~です。は、数字 (0 ~ 9) 以外の\D任意の文字に一致します。nextブロックの残りをステップオーバーしwhile、条件のチェックから開始しwhileます。

while (my $div = <STDIN>) {
  chomp $div;

  if ($div =~ m/\D/) {
    print "You may only guess numbers. Please try again.\n";
    next;
  }

  # ...
}

したがって、完全なチェックとは、「ユーザーが入力したものを見て、数字以外のものが含まれている場合は、文句を言って再試行させる」ことを意味します。

于 2013-03-16T13:35:29.807 に答える