29 декабря 2009. Игры в лабиринте

Важные предупреждения

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

Убедительная просьба все программы писать и запускать в Turbo Pascal'е (иначе возможны проблемы с кодировкой).
В тексте программы вам разрешается писать программу только в той части, которая указана, и не менять остальную часть программы.
Вам категорически запрещается в вашей части программы менять переменные, которые заведены не вами.


Общая постановка задачи

Сегодня вам предстоит писать программу, управляющую поведением игрока в лабиринте.

Имеется прямоугольный лабиринт. Каждая его клетка либо пустая, либо там стена.
В этом лабиринте разрешается перемещаться в соседнюю по вертикали или горизонтали клетку, если в ней нет стены. Лабиринт по периметру ограничен стенами.

В лабиринте есть два участника — игрок, которым управляете вы (вернее, ваша программа). И тот, кого вам нужно поймать — будем называть его "бонус".

Лабиринт имеет размеры xsize, ysize. Эти размеры не включают стены, которыми огорожен лабиринт.
Система координат лабиринта устроена так, что левая верхняя клетка лабиринта имеет координаты (1,1), правая верхняя — (xsize,1), правая нижняя — (xsize, ysize).
Карта лабиринта доступна в массиве map. map[i,j]=0 для пустой клетки и равно 1 для стенки.
Ваши координаты хранятся в переменных xhero, yhero, а координаты бонуса — в переменных xbonus, ybonus.
Подробнее о том, как задается лабиринт можно почитать в описании после второй задачи.

Ваша задача в программе написать процедуру heromove(x,y,xnew,ynew). Этой процедуре передаются ваши текущие координаты. Вы имеете право смотреть карту лабиринта, использовать переменные xbonus, ybonus для того, чтобы определить, куда вы хотите совершить ход. Новые ваши координаты нужно записать в переменные xnew, ynew, после чего процедура должна завершить работу.

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


Задача 1

В лабиринте нет стен (не считая тех, что ограничивают лабиринт). Где-то в этом лабиринте есть бонус. Ваша задача этот бонус найти.


Задача 2

Та же задача, только теперь в лабиринте есть стены.

Подсказка: это уже задача на волновой алгоритм.


Как делать свои лабиринты

В начале программы есть строчка вроде mapfile='map21.txt'. Она задает имя файла, в котором содержится описание лабиринта. Вы можете как менять указанный файл, так и скопировать этот файл в другой, изменив имя файла в этой строке программы: так вы можете создать целую коллекцию своих лабиринтов.
При этом сначала задаются размеры лабиринта (по x и по y), а затемсам лабиринт. 0 обозначает пустую клетку, 1 — стену.
В лабиринте может также встречаться одно число 2 — это начальная позиция бонуса, и одно число 3 — это начальная позиция игрока. Если 2 и 3 заданы, то бонус и игрок соотвественно всегда будут начинать строго с этой клетки. А если не заданы, то програма сама выбирает и распологает случайным образом на поле бонус и игрока.

Еще карты:


Задача 3

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