Поиск

Упражнение: небольшая игра

На этом занятии вы получили большое количество новой, зачастую неожиданной, информации. Оказалось, что знакомые операторы ведут себя совершенно по-разному в зависимости от контекста. Вы познакомились с новыми операторами и функциями, а также изучили несколько новых синтаксических правил. Чтобы вы не впали в депрессию от такого обилия информации, я придумал игру, способную нейтрализовать ваши негативные эмоции.

Наберите в текстовом редакторе программу, приведенную в листинге 4.1, и сохраните ее в файле Hangman. Сделайте файл выполняемым, согласно инструкциям, приведенным на 1-м занятии.

После этого попытайтесь запустить программу, набрав в командной строке

perl Hangman

В листинге 4.2 приведен пример диалога с программой Hangman.

Проведем анализ протраммы.

  • Строка 1. В этой строке находится путь к интерпретатору (измените его в соответствии с конфигурацией вашей системы) и ключ -w. Всегда включайте режим выдачи предупреждений!
  • Строка 3. Массив Swords инициализируется списком допустимых в этой игре слов.
  • Строки 4-5. Инициализируются некоторые переменные. Массив @guesses служит для хранения ранее введенных букв. Переменная $wrong содержит количество неудачных ответов.
  • Строка 7. Из массива @words случайным образом выбирается слово и присваивается переменной $choice. Функции rand{) должен передаваться скалярный аргумент, поэтому конструкция Swords воспринимается как скаляр. Значение Swords в скалярном контексте — количество элементов массива Swords, в данномслучае 4. Функция rand возвращает случайное число в диапазоне от 0 до 4, не включая крайние значения. При использовании числа с плавающей точкой в качестве индекса массива знаки после запятой отбрасываются.
  • Строка 8. Формируется фигурка.
  • Строка 10. Загаданное слово разбивается на буквы, которые помещаются в массив dletters.
  • Строка 11. Фигурка разбивается на части, которые помещаются в массив {(hangman. Причем $hangman[0]'— голова, $hangman[l] — шея и т.д.
  • Строка 12. Массив Gblankword предназначен для отображения положения правильно угаданных букв. Вначале в Gblankword находится список {0} х scalar(Ghangman), длина которого равна количеству элементов Ghangman. Затем постепенно нули заменяются на угаданные буквы. Это делает строка 35 кода.
  • Строки 13—14. Это основной цикл программы. У него есть метка OUTER позволяющая использовать специальные операторы управления циклом. Этот цикл выполняется, пока количество неправильных ответов не сравняется с длиной фигурки.

  • Строки 15—21. Цикл foreach проверяет элементы массива Gblankword, и все угаданные буквы распечатываются, а еше не угаданные заменяются дефисами.

  • Строки 23—25. Переменная $wrong содержит количество неправильных ответов. Если имеется хотя бы один неправильный ответ, печатаются $wrong начальных элементов массива £ hangman.

  • Строки 26—27. Эти строки вводят ответ игрока. Функция chomp удаляет завершающий символ новой строки.

  • Строки 28-30. Эти строки проверяют, не вводился ли символ ранее. Если да, цикл снова начинается со строки 13. Игрок не наказывается за повторение неправильного ответа. . ......

  • Строка 31. Введенная пользователем буква помешается в массив Gguesses.

  • Строки 32—38. Это сердцевина программы. В массиве в letters, содержащем загаданное слово, ищется буква ответа. Если буква найдена, она присваивается соответствующему элементу массива (iblankwords. Все элементы массива Sblankwords — это или угаданные буквы, или нули. Флаг $right получает значение 1, если хотя бы одна буква правильно угадана.

  • Строка 39. Переменная $wrong увеличивается на единицу при каждом неправильном ответе пользователя.

  • Строки 40—43. Элементы массива §blankwords объединяются в строку, которая сравнивается с исходным словом. Если они совпадут — это означает, что пользователь полностью угадал слово.

  • Строка 45. Основной цикл программы завершается, посколькуигрок исчерпал все свои попытки. Программа выводит сочувственное сообщение и выходит из игры.

    В этой небольшой программе я постарался продемонстрировать весь изученный в этом часе материал — списки литералов, массивы, функции split и join, контекст и циклы foreach. Подобную игру можно было бы запрограммировать массой различных способов, наша же программа предназначена для иллюстрации основных возможностей массивов.