Анимация
JavaScript


Главная  Библионтека 

0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 [ 65 ] 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122

Лист13.2. диалога с оглой

Вы можете пойти на восток (в) Куда адем? в Вы нокете пойти на юг Куда идем? в Вы можете пойти Куда идем? в

Вы можете пойти на юг запад ( Куда идем? ю Вы можете пойти Куда идем? » Вы можете пойти на Куда идем? в Поздравляем! вн вышли из лабиринта

запад восток {юзв} на север восток запад (свз)

(D3)

на север юг (со) север восток (ев)

анализ программы.

Строки 1-2. С этих двух строк начинается практически любая программа на Perl. Ключ -w активизирует режим вывода предупреждений, а оператор use strict используется для ужесточения контроля интерпретатора Perl над ошибками в программе и выявления плохого стиля программирования.

Строки 4-9. Здесь определяется структура toze, которая описывает лабиринт. Она представляет собой двумерный массив размером 4x4, реализованный в виде списка списков. Каждый элемент этого массива определяет положение

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

один выход. В данном случае структура лабиринта выглядит так:

Начальная точка


Конечная точка

В одну из комнат (2,1) попасть невозможно, поэтому она отмечена знаком -в структуре На самом деле для этих целей можно использовать любой

символ, кроме с, п, з, в.



• Строки 10-11. При движении игрока в одном из четырех направлений соответствующим образом должны изменяться его текущие координаты. Поэтому для вычисления нового положения игрока, в зависимости от его текущих координат и направления движения, используется хэш direction. Например, при перемещении на "север" необходимо вычесть 1 из координаты х игрока, а его координату у оставить без изменений. При движении на "восток" координата х остается без а координата у увеличивается на 1. (Начало координат находится в левом верхнем углу лабиринта. Ось х направлена вниз, а ось у - вправо.) Изменение координат выполняется в строках 33 и 34 программы.

• Строка 5. В этих строках с помощью оператору описываются переменные, используемые в программе. Явного описания переменных требует оператор use strict. Текущее положение игрока хранится в переменных и а его начальная позиция равна (0,0). Конечное положение игрока (3,3) хранится в переменных $х и $у.

• Строка 17. Эта подпрограмма отображает возможные направления движения игрока в зависимости от его положения (координат х и у).

• Строка 20 Из массива описания лабиринта gmaze выбираются коды разрешенных направлений движения для текущей комнаты (Sinaze[$cx] [Scy]).

Затем из кода направления в цикле в]деляются буквы, соответствующие сторонам света (с, о, з, в), полное описание которых хранится в хэше

Этот хэш используется только для преобразования кодов направлений (с) в

название стороны света (север) и отображения его на экране монитора.

• Строка 25. Функции moveto передаются код направления (он сохраняется в переменной $new) и ссылки на текущие координаты игрока.

• Строка 28. Код направления преобразовывается к нижнему регистру с помощью функции 1с, а функция substr выделяет первый символ из введенного пользователем кода направления. Результат снова присваивается переменной Snew. Например, если пользователь введет Восток, переменной 5new присваивается значение в. Запад - з и т.д.

Строка 29. Введенный пользователем код сравнивается с кодами возможного направления движения из текущей комнаты

При несовпадении выводится сообщение об ошибке.

• Строка 34. Выполняется изменение текущих координат х и у пользователя. Например, если был введен код направления в, из элемента хэша $direction{B} выбирается ссьшка на двухэлементный массив (О, 1). В результате к текущей координате х прибавляется значение О - Sdirection{B}(0], а значение координаты у увеличивается на 1 - $direction{B}[l]

• Строка 37. В этой строке начинается тело основной программы. Цикл продолжается до тех пор, пока текущие координаты пользователя (Scurrjc и $curr y) не сравняются с координатами $х и $у секретной комнаты.

• Строка 38. Отображается "план" текущей комнаты.

• Строка 41. Введенный пользователем код направления движения считывается в переменную $move, после чего с помощью функции chomp



из нее удаляется символ перевода строки. Если пользователь введет символ q, игра завершается.

• Строка 42. Вызывается подпрограмма to, которой передаются код направления движения и ссылки на текущие координаты игрока. Эта подпрограмма выполняет пересчет текущих координат игрока "$curr x и $curr y в зависимости от введенного кода направления.

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

лабиринта. Однако в комнатах не должно существовать дверей, ведущих наружу лабиринта. Учтите, что в программе не проверяется правильность построения лабиринта, хотя Perl выводит предупреждения, если вы неправильно зададите значения элементов массива @maze. Координаты секретной комнаты хранятся в переменных $х и $у Измените их, если хотите переместить конечную точку лабиринта в другое место.

Резюме

На этом занятии речь шла об основных приемах работы со ссылками. Сначала вы познакомились с процессом создания ссылок на основные структуры данных Perl: скаляры, массивы и хэши, а затем рассмотрели способы работы с данными, определяемыми ссылками. Вы узнали также, как создавать ссылки на хэши и массивы, которым не назначены имена. В Perl подобные данные называются анонимными. И в конце занятия были рассмотрены способы создания сложных структур данных с помощью ссылок и приведены соответствующие примеры.

Вопросы и ответы

При попггке распечатать список списков с помощью оператора prin OL" выводятся , значения тип ARRAY(0x101400) и т.д. Почему это происходит?

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

Я пьггаюсь создать ссылку на список с помощью оператора $ref=\($a, $Ь, $с). Почему в результате в переменное ef оказывается ссылка на скаляр, а не на список?

... В Perl конструкции $Ь, $с) является сокращенной записью списка (\$а, \$Ь,

\$с)! Поэтому в переменной $ref окажется ссылка на последний элемент списка, находящийся в круглых скобках, т.е. $с. А чтобы создать ссылку на анонимный массив, воспользуйтесь оператором $b, $c].



0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 [ 65 ] 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122