2013-03-16 2 views
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"); 
} 
+1

У вас нет петли, хотя вы, похоже, знаете, что вам нужен цикл. Что именно вы хотите знать? Синтаксис циклов? – Ingo

+0

Я собираюсь опробовать цикл до конца и посмотреть, что мне нужно. Наверное, это так. – joesh

+1

Недавно я представил полнофункциональную реализацию «угадать мой номер» на [codereview] (http://codereview.stackexchange.com/a/23556/21609). Возможно, вам захочется посмотреть на вдохновение. – amon

ответ

2

Более простой подход не будет while loop.

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; 
    } 
} 

While (каламбур) код уже очень хорошо (вы используете strict и warnings и нет никаких синтаксических ошибок, яй для этого!) Есть некоторые вещи, которые я изменилась, и еще некоторые, где я бы предполагают улучшение.

Но сначала посмотрим на цикл. Программа останется в цикле while, пока условие истинно. Поскольку все, что пользователь может ввести (даже пустую строку), считается Perl истинным, это навсегда. Это нормально, так как есть условие выхода из цикла. Он находится в else части if. Оператор last указывает Perl выйти из цикла. Если else не выполнен, он вернется к началу блока while, и пользователь должен повторить попытку. Навсегда.

Изменения, которые я сделал: - Вам не нужно $i как вы не использовали его - Вы использовали три отдельных if заявления. Так как только один из трех условий может быть верно в данном случае, я слил их в один - Нет необходимости для скобок () с print

Предложения: - Вы должны назвать ваши переменные для того, что они делают, а не то, что они находятся. $int - нехорошее имя. Я бы пошел с $random, или даже $random_number. Многословность важна, если вам нужно вернуться к вашему коду в более позднем пункте. - Существует function called say, который вы можете включить с помощью use feature 'say';. Он добавляет say "stuff" в качестве эквивалента print "stuff\n".


Edit:

Если вы хотите добавить другие условия, которые непосредственно не относятся к числу которых пользователь вошел, вы можете добавить еще 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// - match operator, который работает вместе с =~. \D соответствует любому символу, который не является числом (от 0 до 9). next шагов над остальной частью блока while и начинается с проверки состояния while.

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

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

    # ... 
} 

Таким образом, полная проверка означает "взгляд на вещи пользователь вошел, и если есть что-нибудь еще, чем число в нем вообще, жаловаться, и пусть он снова попробовать.

+0

Это фантастика, я был - не зная об этом - ближе, чем я понял. Большое спасибо. Мне нужно изучать Perl в своем университетском классе, и иногда это немного расстраивает, так как вы понимаете, что вам нужно делать, но не знаете, какую команду вам нужно выполнить. Вы помогли мне решить мою проблему совершенно, очень благодарен. Я снова перечитаю ваши комментарии, чтобы быть в курсе этого цикла. – joesh

+0

Всего несколько комментариев и вопросов. a) «int» был тем, что я собирался использовать, а затем забыл вынуть - ошибка с моей стороны. б) можете ли вы использовать «если» или «elsif» более одного раза? Как вы объясните, я замечаю, что мне не нужны все эти команды «если». Однако, скажем, я хотел добавить еще один фактор, например, «если» игрок не догадался после 10 попыток, а затем выйти из цикла. Могу ли я добавить еще один «if» или «elsif»? c) Да, вы совершенно правы, добавляя, что я должен правильно указывать свои переменные. Программа изначально была на французском языке, следовательно, это было неправильное (или запутанное) обозначение переменных. – joesh

+0

Какой университет вы идете к тому, что предлагает Perl? Я бы посоветовал вам получить книгу * [Learning Perl] (http://shop.oreilly.com/product/0636920018452.do) * Рэндала Л. Шварца. Это лучший для начинающих. Какую бы книгу вы ни получили, убедитесь, что это новейшая версия. Там много старых, устаревших вещей. Кроме того, не обращайте внимания на какой-либо учебник, который вы найдете, который не имеет «строгих» и «предупреждений», или не объявляет vars с помощью 'my'. Они старые, и их лучше игнорировать. См. Http://perl-tutorial.org/ для получения списка высококачественных руководств. – simbabque

2

Используйте до цикла

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) 
+0

Отлично, я попробую это и посмотрю, что я могу сделать. Если я правильно понимаю, я отказываюсь от своего оригинального сценария, который, вероятно, неуклюжий? – joesh

+0

Хорошо, я вернулся. Не могли бы вы объяснить, «где» я помещаю этот цикл, пожалуйста. Огромное спасибо. – joesh

Смежные вопросы