Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 如何在我的代码中消除这个无限循环?(制作数字猜谜游戏程序)_Perl - Fatal编程技术网

Perl 如何在我的代码中消除这个无限循环?(制作数字猜谜游戏程序)

Perl 如何在我的代码中消除这个无限循环?(制作数字猜谜游戏程序),perl,Perl,我必须创建一个数字猜测游戏程序并编写代码,但在输入我的第一个数字猜测后,输出变成无限循环并不断重复,因此我被迫关闭我的程序。这似乎是我的“{}”的一个错误,但我不知道错误在哪里。我不得不让用户猜测8次不同的时间,我被困在第一次猜测的结果上,因为它不断重复。这是我的密码: print "Welcome to the Perl Whole Number Guessing Game!\n Please enter a number between 1 and 100 and I will tell y

我必须创建一个数字猜测游戏程序并编写代码,但在输入我的第一个数字猜测后,输出变成无限循环并不断重复,因此我被迫关闭我的程序。这似乎是我的“{}”的一个错误,但我不知道错误在哪里。我不得不让用户猜测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 ++;
print“欢迎使用Perl整数猜测游戏!\n请输入一个介于1和100之间的数字,我将告诉您您试图猜测的数字是高于还是低于您的猜测。您最多有8次机会猜测该数字。\n”;
我的($guess,$target,$counter)#我的变量
$target=(国际兰特100)+1#必须介于1-100之间
$counter=1;
#第一猜测:
打印“输入猜测#$counter:”;
chomp($guess=);
而($guess!=$target)
{if($guess<$target)
{
打印“您的猜测,$guess太低。请重试。\n”;
}
其他的
{print“您的猜测$guess太高。请重试。\n”;
}}
直到($guess==$target)
{
打印“恭喜!您在$counter尝试中猜到了密码($target)!\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"; 
}
#第八个也是最后一个猜测:
打印“输入猜测#$counter:”;
chomp($guess=);
而($guess!=$target)
{if($guess<$target)
{print“对不起,您没有猜到密码,它是$target。\n”;
}
其他的
{print“对不起,您没有猜到密码,它是$target。\n”;
}}
直到($guess==$target)
{print“祝贺您!您在$counter尝试中猜到了密码($target)!\n”;
}
我只想让代码让我再猜8次,而不是让第一次的猜测进入无限循环

注意:我刚刚开始学习Perl编程课程,不能使用任何花哨、困难的代码,基本上最简单的解决方案是最好的,而且是我唯一能理解的


谢谢你的帮助

首先,你需要把你的增量放在你的while中

重复代码是制作程序的可怕方式。这就是循环的用途。 你只需要在第八次尝试后打破循环

PERL不是我的首选语言,但在大多数语言中,这样的语法都可以:

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

意思是当用户的猜测不是计算机“想到”的随机数时。。。 做括号内的事

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

现在,想一想……假设我们玩这个游戏……我是那个猜你的数字的人……让我们模拟一下

  • 你想到一个数字(比如:target=34)
  • 我在猜测(假设:45)
  • 虽然我的猜测不正确,但告诉我“太高了”
所以,你明白我的意思了:剩下的代码永远不会被执行。因为你会一直告诉我我错了,而不会让我再猜一次


那么,你为什么不做一些…邪恶的事情…

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

While(猜测!=目标和错误答案<8) {

}


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

重复代码基本上是不应该做的事情,除非是在非常简单的情况下。因为您有一个特定的计数,所以只需使用带有计数器的
for
循环即可

您还应该始终使用
使用警告;使用严格;
,因为它将帮助您避免简单错误,并为您提供信息性错误

此外,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";
    }
}
my$guesses=8;
对于我的$计数器(1..$猜测){
打印“输入猜测#$counter:”;
chomp(我的$guess=);
如果($guess<$target){
打印“您的猜测,$guess太低。请重试。\n”;
}elsif($guess>$target){
打印“您的猜测,$guess太高。请重试。\n”;
}否则{
打印“恭喜!您在$counter尝试中猜到了密码($target)!\n”;
}
}

正如其他海报所指出的,您需要在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变量的种子,这将使您脱离无限循环。我本来会给您一个完整的代码示例,但由于这被标记为“家庭作业”,这将剥夺您独自解决这些问题的好处。:)

首先,你的意思是你已经复制粘贴了代码的第一部分,比如7次,一次又一次?它在重复什么?“你的猜测太低了”?(或“高”)多亏了@Dr.Kameleon,我才意识到,你需要我发布的代码,也需要在循环中移动你的问题。仅供参考,语言是Perl而不是Perl。如果可以的话,你可以做
If($guess==$target){print“恭喜”;last;}
guess();