Игра Ним
Процедура начинает свою работу с очистки экрана от имеющейся на нем информации. Это достигается обращением к стандартной процедуре без параметров CLRSCR. Затем выводятся три строчки с названием игры и кратким описанием ее правил. Кроме того, слева и справа на экране формируются заголовки для двух колонок цифр, в которых затем будут отображаться номер ряда (слева) и текущее количество фишек в ряду (справа). Эта информация поможет игроку сообщить программе свой ход. Для размещения информации на нужных участках экрана используется процедура GOTOXY(X,Y), с помощью которой курсор перемещается нужным образом. Параметры X и Y этой процедуры задают новые координаты курсора. Начало координат соответствует точке (1.1) и размещается в левом верхнем углу экрана, поэтому горизонтальная координата увеличивается слева направо, а вертикальная – сверху вниз.
Procedure Prepare; {Подготовка данных и экрана к игре} const Header0 = 'ИГРА НИМ'; Header1 = 'Вы можете взять любое число фишек из любого ряда.'; Header2 = 'Выигрывает тот, кто возьмет последнюю фишку.'; Header3 = 'Номер ряда'; Header4 = 'Количество фишек'; var i: Integer; begin {Prepare} ClrScr; {Очищаем экран} {Выводим строки заголовка:} GotoXY((80-Length(Header0)) div 2.1); Write(HeaderO); GotoXY((80-Length(Headerl)) div 2.2); Write(Headerl); GotoXY((80-Length(Header2)) div2.3); Writeln(Header2); Write(Header3); GotoXY(80-Length(Header4),4); Write(Header4); {Готовим начальную раскладку:} for i: = 1 to nrow do col [i]: = ncol[i] end; {Prepare}
Для вывода верхних строк строго посередине экрана используется задание горизонтальной координаты курсора для процедуры GotoXY как половины от разницы между полной длиной экрана (80 позиций) и длиной выводимой строки (определяется с помощью функции LENGTH).
В процедуре GetPlayerMove осуществляются ввод, контроль и отображение на экране очередного хода игрока. Предварительно нужно показать игроку текущее состояние игрового поля. Поскольку поле будет обновляться как минимум дважды (после хода игрока и после хода программы), действия, связанные с изображением поля на экране, следует вынести в отдельную процедуру. Назовем ее ShowField и займемся ее реализацией.
Судя по всему, нам понадобится организовать цикл; в ходе цикла для каждого ряда игрового поля будет выведена строка, в левой части которой указывается номер ряда, в правой – текущее количество фишек в нем, а посередине выводятся символы, имитирующие фишки. В принципе, можно выбрать любой символ ПК для обозначения фишки, например, X или О. Я предпочел воспользоваться символом псевдографики с кодом 220: этот символ представляет собой небольшой квадратик и легко ассоциируется с фишкой.
Procedure ShowField; { Отображает на экране текущее состояние игрового поля } const FISH = #220; { Символ-указатель фишки} Х0 = 4; {Левая колонка номеров рядов} X1 =72; {Правая колонка количества фишек} X = 20; {Левый край игрового поля} var i,j: Integer; begin {ShowField} for i: = 1 to nrow do begin GotoXY(X0,i+4); Write(i); {Номер ряда} GotoXY(X1,i+4); Write(col[i]:2); {Количество фишек в ряду} for j: = 1 to ncol[i] do {Вывод ряда фишек:} begin GotoXY(X+2*j,i+4); if j[i] then Write(FISH) else Write('.') end end end; {ShowField}
Символы FISH (квадратики) выводятся через одну позицию, чтобы не сливались на экране. В те позиции, в которых ранее стояли уже снятые с поля фишки, выводится точка.