Иллюстрированный самоучитель по Turbo Pascal

Игра Ним

Можно несколько модифицировать главную программу, чтобы предусмотреть эту возможность:

Uses CRT; {Подключение библиотеки дополнительных процедур и функций для управления экраном}
var
exit: Boolean; {Признак окончания работы}
change: Boolean; {Признак изменения условий игры}
{----------------------}
Procedure Prepare; {Готовит экран к игре}
begin {Prepare}
end; {Prepare}
{----------------------}
Procedure GetPlayerMove;
{Получает, контролирует и отображает ход игрока}
begin {GetPlayerMove}
end; {GetPlayerMove}
{----------------------}
Procedure SetOwnerMove;
{Находит и отображает очередной ход программы}
begin {SetOwnerMove}
end; {SetOwnerMove}
{----------------------}
begin {Главная программа}
{Подготовить начальную расстановку фишек}
repeat {Цикл изменения условий игры}
Prepare; {Подготовить экран}
repeat {Игровой цикл}
GetPlayerMove; {Получить ход пользователя}
if not (exit or change) then
SetOwnerMove {Определить собственный ход} until exit or change
until exit
end.

В этом варианте главная программа содержит два вложенных друг в друга цикла Repeat…Until: внутренний цикл управляет игрой, внешний отвечает за изменение условий игры. Оба цикла управляются двумя логическими переменными, которые являются глобальными для трех основных процедур PREPARE, GETPLAYERMOVE, SETOWNERMOVE и, следовательно, могут изменяться внутри этих процедур.

Теперь настал момент подумать о том, каким способом в программе будет храниться и использоваться информация о текущем состоянии игры. Судя по всему, нам понадобятся хотя бы две переменные: в одной, назовем ее NROW, будет содержаться число рядов фишек, в другой (NCOL) – количество фишек в каждом ряду. Переменная NROW содержит одно целое положительное число, поэтому ее тип должен быть INTEGER. В переменной NCOL должно быть не менее NROW целых чисел, т.е. ее тип – это массив целых чисел.

Поскольку в программе предусмотрена возможность изменения условий игры самим игроком, переменная NROW может меняться от партии к партии. В соответствии с этим должна была бы меняться и длина массива NCOL. Однако в Турбо Паскале нельзя использовать массивы, длина которых меняется динамически, т.е. в процессе работы программы. Эта длина должна определяться статически (на этапе компиляции) и не может меняться в работающей программе. Значит, понадобится массив достаточно большой длины, чтобы его хватило на все случаи.

На экране одновременно можно отобразить максимум 25 строк по 80 символов в каждой строке. Однако использовать все строчки экрана как возможные ряды фишек вряд ли целесообразно: во-первых, сама игра при большом количестве рядов становится неинтересной, так как игрок не сможет проанализировать в уме все варианты ходов; во-вторых, на экране не останется места для вывода другой информации. Будем считать, что максимальное количество рядов фишек не должно превышать 14. Укажем это константой MAXROW – теперь, если Вы захотите назначить другое максимальное количество рядов, понадобится изменить значение этой константы и перекомпилировать программу.

Именно таким способом программам придается дополнительная гибкость: Вы сосредоточиваете в нескольких константах параметры, которые выбраны Вами произвольно и которые Вы или кто-то другой, возможно, захочет изменить. Все размерности массивов или другие особенности программной реализации следует определять через эти константы, тогда процедура переделки программы предельно упростится.

С учетом сказанного назначим следующие глобальные константы и переменные:

const
MAXROW = 14; {Максимальное количество рядов}
MAXCOL = 20; {Максимальное количество фишек в ряду}
type
ColType= array [I..MAXROW] of Integer;
var
exit:Boolean; {Признак окончания работы}
change:Boolean; {Признак изменения условий игры}
nrow:Integer; {Количество рядов}
ncol:ColType; {Максимальное колич-во фишек по рядам}
col:ColType; {Текущее количество фишек по рядам}

Константа MAXCOL не участвует в формировании массивов, она будет использоваться для контроля горизонтальных размеров игрового поля. Поэтому она, а также пять переменных сделаны глобальными.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.