Техника - молодёжи 1987-07, страница 45мый регистр изображаются в наших публикациях буквой П, после которой следует номер регистра (например, ПС; на клавиатуре МК-54, 56, 61, 52 букве П соответствует х-П). Команды вызова обозначены ИП (например, ИП8; этому соответствует П—х8). Команда обмена содержимым регистров X и Y записывается как XY (на клавиатуре новых ПМК ей соответствует горизонтальная «обоюдоострая» стрелка); ввод в стек обозначается стрелкой вверх (на МК-54 и т. д.— В!). Наконец, обратные тригонометрические функции изображаются двумя способами: либо приставкой «агс» (БЗ-34), либо показателем «—1» (остальные ПМК); в наших программах встречается как то, так и другое обозначение (математически они совершенно равноправны). В прошлом выпуске было обещано доработать программу Б. Грекова (игра «Волки и козлик» на поле 9X9) как со стороны сервиса, так и в стратегическом смысле. Выполняя это обещание, публикуем программу «Победитель»: 00.КБПС 17. Кх»о9 31. 59 51 FLO 68. ИПА 85.2 01.Кх*о918. FBx 35.ИП6 52.47 69.ИП6 86.x 02.5 19.КП8 36. ИП С 53. FBx 70.КППА 87.КППВ 03.- С-20ИПС 57.КППА 54. ПО 71,Fx=o 88.Fx-o 04.П7 21.ИП6 3&.Кх=оД 55.ВП 72.ИПС 89.26 05.ИП8 22.Fx»o 39.ИП6 fl:56.Vo 73.КПП& 90.МП7 06.П6 23.57 А-40.- 57.+ 74.Кх-оС «.Fx2 07.ИП0 24.КППАВ-41.П8 58.П6 75.ИП6 92.П0 08.П5 25.Кх=оД 42. ИП5 59.ИП7 76.2 93.FL0 9:09. с/п 26.ИП6 43.+ 60Fx-o 77.x 94.31 10. па 27.КППВ 44.F10* 61.64 78.КППВ 95.F10* 11. ПП 28.Кх-оД45.5 62.КППА 79. Fx=o 96. ИП7 12.44 29.ИП7 46.П0 63.Кх=оД 80.26 97.КБПА 13. Кх*9 30. Fx1 47. КИГ11 64. Fx2 81.ИПС 14.КИП8 51.4 48.FBx 65.П0 82. ИПб 15. FBx 32,- 40,- 66.FLO 83,16,- 35.Fx*o 50.Кх#оД 67. 72 84. П6 Система координат та же, что и в прошлом выпуске, только «волки» в начале игры располагаются на 9-й горизонтали (на полях 91, 93, 97, 99); туда-то и стремится «козлик». Перед игрой в некоторые регистры вводятся адреса переходов: 20 ПС 9 П9 40 ПА 41 ПВ 56 ПД; числа в регистрах С и А служат вдобавок счетными коэффициентами. Каждый «волк» имеет собственный номер (от 1 до 4), его координаты хранятся в соответствующем регистре. В начале игры задаем 91 П1 93 П2 97 ПЗ 99 П4. «Козлик» имеет номер 5 и располагается на поле 55: 55 П5 (можно задать и любую другую клетку в пределах трех центральных вертикалей). В регистре 6 во время игры откладывается направление предыдущего хода «козлика» (разность между его новыми и старыми координатами), то есть одно из чисел 11,—11,9,—9. Вначале можно задать любое из них, допустим, 11 П6. В регистре 7 хранится отклонение «козлика» от центральной вертикали; вначале содержимое этого регистра может быть произвольным. Игра начинается командой В/О С/П (она же отдается и в том случае, если вы хотите пропустить ход — программа «Победитель» такую возможность допускает). В ответ ПМК выдает новые координаты «козлика» (в стандартной начальной ситуации число 64 или 66; если же «козлик» не знает, куда пойти, ПМК выбрасывает «белый флаг» — на индикаторе появляется ноль). Ход игрока задается стандартно: (номер «волка») ПП (номер поля) С/П. Программой предусмотрены блокировки: если «волк» идет на занятое поле или за границу доски, на индикаторе тут же появляется ноль; если «волк» попытался сходить назад, что запрещено правилами, на индикаторе зажигается отрицательное число. В обоих случаях ход следует повторить. Если «козлик» выполнил свою задачу (достиг 9-й горизонтали), а человек пытается продолжать игру, на индикаторе появляется сообщение ЕГГОГ. Этот останов происходит в подпрограмме; чтобы не засорять стек возврата, надо скомандовать 1 С/П, на индикаторе появятся новые координаты «козлика», уже за пределами доски. Теперь можно заново расставлять шашки и начинать новую игру. Давайте посмотрим, как работают основные блоки программы. На первом ходу команда ОО.КБПС (она эквивалентна БП 20) передает управление на адрес 20. Кстати, в программах, в которых используется косвенная адресация, удобно отмечать соответствующие адреса перехода, как сделано у нас — это упрощает анализ алгоритма (по многочисленным просьбам читателей введено и еще одно новшество — программы этого выпуска расписаны в столбик). Команды 20—23 исследуют предыдущий ход «козлика». Если он шел вперед, число в регистре 6 положительно (9 или 11), и ПМК проводит в жизнь «стратегию наступления» (блок 24—56). Сразу же следует обращение к подпрограмме проверки возможности хода, располагающейся на адресах 40—56; у нее два начальных адреса — 40 (помечен буквой А) и 41 (В). Сейчас отправляемся на адрес 40; содержимое регистра 6 (9 или 11) вычитается из двадцати, результат (11 или 9) записывается в рабочий регистр 8 и складывается с координатой «козлика» (40—43). ПМК, как видим, намерен идти зигзагом. Вычисление показательной функции от полученного числа (44) несет двойную нагрузку. Во-первых, оно записывается в регистр предыдущего результата Xi (оно нам еще пригодится). Во-вторых, если «козлик» уже достиг 9-й горизонтали, результатом операции будет сообщение ЕГГОГ. В нормальной же ситуации в рабочий регистр 0 записывается число 5 и цикл 47—52 проверяет, не занято ли намеченное поле одной из шашек (собственная клеточка ПМК проверяется потому, что этот же фрагмент используется и для блокировки неправильного хода человека). По возвращении из подпрограммы, если намеченное поле не занято и не лежит за нижней либо за одной из боковых границ доски, в регистре X оказывается номер занятой «козликом» вертикали, команда условного косвенного перехода (25) передает управление на адрес 56, команда В/О передает его на адрес 01, после чего вычисляется и записывается в регистр 7 отклонение «козлика» от центральной вертикали, в регистры 6 и 5 переписываются соответственно направление сделанного хода и новая координата «козлика». Программа останавливается в ожидании ответа соперника. А что произойдет, если намеченный ход невозможен (поле занято либо лежит за пределами доски)? После возвращения из подпрограммы в регистре X оказывается ноль, и ПМК делает попытку хода вперед в прежнем направлении (26—27). Если и туда пойти не удастся, проверяются ходы назад (28—56), причем с 3-й и 7-й вертикалей попытка хода назад к ближайшему борту не производится. Если ходов нет, программа после всех проверок возвращается на адрес 01 с нулем в регистре X и команда условного перехода передает управление на 09.С/П — ПМК признал себя побежденным. Если в «атаке» ПМК практически не отступает от алгоритма Б. Грекова, то в «обороне» (предыдущий ход был сделан назад) действует более изобретательно. Соответствующая ветвь начинается с адреса 57, проанализируйте ее самостоятельно. Любителям нестандартных приемов рекомендуем обратить внимание на кодово-адресную связку 71—72. Если входное число не равно нулю, управление передается на адрес, совпадающий с кодом команды 72.ИПС, то есть 6С. А этому «тайному» адресу соответствует «явный» 72, поэтому исполняется команда ИПС. Когда же входное число равно нулю, сразу исполняется 73.КППВ, по возвращении из ПП, как нетрудно проверить, в регистре X остается 0, поэтому фактически (хотя и с некоторой задержкой) в этом случае происходит переход на адрес 75. Операторы цикла, расположенные по адресам 66—67 и 93—94, также используются нестандартно — в качестве команд условных переходов. Для перевода программы «Победитель» на язык МК-61 надо заменить команду по адресу 47 фрагментом 47.ИПО 48.ПЕ 49.КИПЕ (то есть ввести искусственную связь регистров 0—Е), сдвинуть в фрагментах 22—23 и 60—61 адреса переходов на два (теперь они будут выглядеть так: 22,Fx>0 23.59 и 62.Fx=0 63.66), адрес перехода на участке 66—67 сдвинуть на три (получится 68.FL0 69.75), две старые команды 71—72 заменить тремя новыми: 73.Fx^0 74.78 75.ИПС — и записать другое число в регистр Д: 58 ПД. Таким образом, программа стала немного длиннее, но это не страшно — резервы в новых ПМК есть. Михаил ПУХОВ |