Главная Промышленная автоматика. На машине АТЛАС данная программа решила задачу на мат в два хода за 45 с-После переписывания программы в безик-код * это время сократилось до 5 с. Программа может также проверять единственность решения. Исключения Приведенная здесь программа не даст решения в двух случаях, когда возможны* 1) рокировка или 2) взятие пешки на проходе. Эти случаи не были включены в про- УРОВЕНЬ Б1 f 41 f W 2 ЧНр-hl J /7-4- Последние ходы черных исчерпаны, следовательно, решением является Последний ход объявлен ли теперь тх черных был цернвну королю ?Да. (Л: Кр) незаконным, ь м и/ пробуем другой ЧКр-Ы *J уХ П: ЧКр Последний ход черных был незаконным. Следовательно, последний ход белых (С:.П) не возвращается, а лробг/ется другой ход черных Рис. 5. Блок-схема решения задачи, приведенной на рис. 4. грамму, потому что они замедляют ее работу, а встречаются в таких задачах редко;-Однако, если требуется, то их можно включить в программу следующими способами.. Рокировка Для любой заданной позиции, в которой возможны четыре варианта рокировки,, в программе должны быть предусмотрены четыре логические переменные. Оператор КОРОТКАЯ РОКИРОВКА БЕЛЫХ: = ДЛИННАЯ РОКИРОВКА БЕЛЫХ:=КОРОТ-КАЯ РОКИРОВКА ЧЕРНЫХ: = ДЛИННАЯ РОКИРОВКА ЧЕРНЫХ: =true; будет использоваться тогда, когда программа предназначается для позиции, в которой все-еще возможны все рокировки (рис. 6). Для упрощения задачи позиции короля, королевской ладьи и ферзевой ладьи в массиве СВОИ ПОЛЯ должны быть фиксированы для обеих сторон (например, 1, 2 в 3, как это дано на рис. 6,6 и е) **. Для выполнения короткой рокировки белых нужно только дополнить массив- * basic code. {Прим. ред.) ** Этого можно достичь, если выписывать входные данные, подлежащие вводу в память машины, в соответствующем порядке: первым вводится король, второй - королевская ладья (если она имеется, или другая фигура в противном случае), третьей- ферзевая ладья и лишь после этого все остальные фигуры. Например, для получения начала массива ПОЛЯ БЕЛЫХ такого, как это показано яа рис. 6,6 (для позиции 6,а), нужно начинать входные данные следующими числами: и; 6;5; 4;8; 4;1;... где п - количество белых фигур, участвующих в задаче. {Прим. ред.) список следующей последовательностью чисел: 1 6 5-7 2 4 8 6 -8 1 6 7-5 Кр el-gl Л hi-fl Возврат рокировки Тогда процедура ВЫПОЛНЕНИЕ ХОДА будет работать правильно. Для длинной рокировки белых необходим следующий список; 1 6 5-3 3 4 1 4 -1 1 6 3-5 Кр el-с1 Л al-dl Возврат рокировки Рис. 6. Рокировка: а - положение фнгур. участвующих в рокировке: б - ПОЛЯ БЕЛЫХ; е-поля ЧЕРНЫХ. 57 58 59 ВО Б1 61 63 64 Кр Л Л 1 1 3 4 5 а 6 7 \61\Б4 57 Кр Л Л Для короткой рокировки черных - список . 1 6 61-63 2 4 64 62 -64 1 6 63-61 Кр е8-g8 Л 1(8-f8 Возврат рокировки Для длинной рокировки черных - список 1 6 61-59 3 4 57 60 -57 1 6 59-61 Кр е8--с8 Л а8-d8 Возврат рокировки Затруднение состоит в том, что необходимо выяснить, можно ли соответствующий список добавлять к массиву СПИСОК на законном основании. Необходимо поставить-три вопроса. 1. Делались ли ходы королем или ладьями? (четыре логические переменные помогают ответить на этот вопрос). 2. Имеются ли фигуры между королем и ладьей? 3. Не находится ли под боем неприятельских фигур какое-нибудь из трех полей (на котором он находится, на которое или через которое он пойдет). Для того чтобы точно определить подлежащие проверке условия, этот отрывок программы выписан полностью в дополнении 2 к данному алгоритму. Процедура ХОДЫ РОКИРОВКИ подставляется в программу вместо пустой процедуры того же названия. Взятие пешки на проходе Для реализации взятия пешки на проходе требуется использование массива НА ПРОХОДЕ, в котором запоминается позиция «фиктивной» пешки, когда пешка делает ход на два поля вперед. Необходимо проделать четыре следующие операции и вставить в программу указанные в них операторы с метками ер\, ер2, ерЗ и ер4 * (последний в двух местах) соответственно. 1. Проверить, делается ли данной пешкой ход на два поля вперед, и, если да, то запсмнить позицию фиктивной пешки. * ер - сокращение от en passant - на проходе. {Прим. ред.) epl: НА ПРОХОДЕ [УРОВЕНЬ]: = if q[yPOBEHb] = l Л abs (ОБРАТНО К{УРОВЕНЬ]-НА)>10 then (ОБРАТНО Ki[yPOBEHb]-fHA)-f-2 else 0; 2. При составлении списка ходов проверить, может ли рассматриваемая пешка взять возможную фиктивную пешку, и, если да, то внести этот ход в СПИСОК. ер2: if ЧУЖАЯ ДОСКА[ТАБЛИЦА ПЕШЕЩЩфОХ/ ТАБЛИЦА ПЕШЕК[1] = НА ПРОХОДЕ{УР0ВЕНЬ-1] then 3. После .выполнения хода пешкой проверить, не является ли он взятием на проходе, я, если да, то взять формально фигуру с отрицательным значением и убрать с доски фактическую пешку *. ерЗ: if q[yPOBEHb]=lA НА = НА ПРОХОДВ[УРОВЕНЬ-1] then begin ДОСКА ЧУЖИХ[Н.31]: =-1; ДОСКА ЧУЖИXIif НА<32 then НА+8 else НА-8]: = О end; 4. При выполнении возврата хода проверить, ие отрицательно ли значение с[УРО-ВЕНЬ], т. е. не был ли выполненный ход взятием на юходе. Если да, то восстановить фактическую пешку (это нужно сделать в двух местахпрограммы). ер4: if с[УРОВЕНЬ]=-1 then ДОСКА ЧУЖИX{if НА<32 then НА+8 else НА-8]:=0 else ДОСКА ЧУЖИХ{ОТ]:=с[УРОВЕНЬ]; Ввод и вывод Рекомендуется таблицы и позиции вводить так, как это показано в дополнении 3. Процедура ПЕЧАТЬ ПОЗИЦИИ, приведенная в дополнении 4, полезна во время отладки программы. В обоих приложениях используются операторы ввода - вывода, принятые в системе АТЛАС (ICT, 1966) и являющиеся самоочевидными **. Резюме и приложения Данная работа посвящена главным образом описанию методов генерации списка всех законных ходов в любой шахматной позиции. Здесь не находят разрешения следующие вопросы: сколько раз уже повторялась данная позиция, сколько ходов было сдела.но, пачтшая с последнего взятия фигуры или с последнего хода пешкой. Если бы эти вопросы были включены в рассмотрение, то задача значительно усложнилась бы, но нет ничего незаконного в том, чтобы их игнорировать. Кроме того, представляется невероятным, что такая ситуация .может встретиться в реальной задаче. Автор надеется, что данная работа будет полезна всем, кто захочет написать программу игры в шахматы. Разумеется, методы данной работы (особенно содержание таблиц) не догма и должны быть приспособлены к машине и используемому языку. Главную ценность представляют следующие моменты. 1. Табличное управление программой. 2. Проверка законности хода при его фактическом выполнении и вызове для противника процедуры ОБЗОР ХОДОВ. Это исключает проблемы связки и хода под шах, на решение которых некоторые программы теряют время. Если все законно, то данная программа сразу же готова к выполнению ответного хода противника. 3. Превращение пешки в фигуру, рокировка и взятие пешки на проходе. Ни одна из ранее опубликованных программ не включала в себя рассмотрение этих операций. * Нижеследующие операторы с меткой «ерЗ:» (так же как и следующие далее операторы с меткой «ер4:») были опубликованы в алгоритме 50 неправильно. Правильные их варианты .см. ияже в «Свидетельстве .к алгоритму 50CJ». [Прим. ред.) ** В ажоритме 50CJ операторы ввода - вывода системы АТЛАС заменены операторами ввода - вы1воиа системы БЭСМ - АЛГОЛ [29, 45]. {Прим. ред.) 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 0.0017 |