如何在我的代码中摆脱这个无限循环? (做一个数字猜谜游戏程序)

时间:2012-03-20 02:07:58

标签: perl

我必须创建一个数字猜谜游戏程序并编写代码,但在输入我的第一个数字猜测后,输出变成无限循环并不断重复,所以我被迫关闭我的程序。我的“{}”似乎是一个错误,但我无法弄清楚错误在哪里。我必须让用户猜测8次不同的时间,并且我坚持第一次猜测结果,因为它不断重复。这是我的代码:

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编程类,并且不能使用任何花哨,困难的代码,基本上最简单的解决方案是最好的,也是我唯一能理解的东西。

感谢您的帮助!

5 个答案:

答案 0 :(得分:2)

重复代码是你基本上不应该做的事情,除非在非常简单的情况下。由于您有特定的计数,因此只需使用带计数器的for循环。

您还应始终使用use warnings; use strict;,因为它可以帮助您避免简单的错误并为您提供信息性错误。

此外,您的if语句将无法检测到正确的猜测。您需要使用elsif(是,否“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";
    }
}

答案 1 :(得分:0)

首先,您需要将增量放在最佳状态。

重复代码是制作程序的一种可怕方式。那是什么循环。 你只需要在第8次尝试后突破循环。

PERL不是我的选择,但在大多数语言中,这样的语法都有效:

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

答案 2 :(得分:0)

while ($guess != $target)

意味着用户的猜测不是计算机“想到”的随机数... 做括号内的内容......

是:打印消息(猜测是“低”,“高”还是正确)

现在,想一想......让我们说我们玩这个游戏......而且我是那个必须猜测你的数字......让我们模拟它...

  • 你想到一个数字(比方说:target = 34)
  • 我在猜测(让我们说:45)
  • 虽然我的猜测不正确,但请告诉我“它太高了”

所以,你明白我的观点:其余的代码永远不会被执行。因为你只是一直告诉我,我错了,不要再猜测......

所以,你为什么不做那些与邪恶有关的事情...... WHILE

答案 3 :(得分:0)

我不知道perl,但从逻辑上讲,你可以将整个事情放在一个循环中

while(guess!= target&amp;&amp; wrongAnswer&lt; 8) {

}

如果答案不等于目标,则增加wrongAnswer计数器。

答案 4 :(得分:0)

正如其他海报所指出的那样,你需要在while循环内的某处增加。另外,请记住,您不需要以下代码块:

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

如果你在代码中达到这一点,那么$ guess等于$ target的条件已经满足了。因此,再次检查是多余的。您可以跳过until块并在while循环后直接转到print语句。

最重要的问题是,你只需要在while块开始之前输入一次。因此,在while块期间,用户永远不会有机会再次猜测。猜测永远不会改变,循环将永远持续下去。为避免代码重复,您可以将猜测代码放入子例程中:

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

然后在进入while循环之前调用此子例程:

guess();

然后在你的while块结束前一次:

guess();

这会在while循环的下一次传递之前重新设置$ guess变量,这将使你摆脱无限循环。我本来会给你一个完整的代码示例,但由于这被标记为“家庭作业”,这会让你失去自己解决这些问题的好处。 :)