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

Игра Ним

{------------------}
begin {ChooseMove}
{Найти двоичное представление количества фишек во всех рядах:}
for i: = 1 to nrow do BitForm(col [i],ncbit [i]);
{Найти сумму разрядов по модулю 2:}
for i: = 1 to BIT do
begin
nbitti]: = 0;
for j: = 1 to nrow do nbitti]: = nbitti] xor ncbit [j / i]
end;
{Найти i = старший ненулевой разряд суммы}
i: = 1;
while nbitti] =0 do inc(i);
if i >BIT then
{Опасный вариант}
begin j: = 1;
while col[j]=0 do inc(j); {найти ненулевой ряд}
k: = 1 {взять из него 1 фишку}
end
else
{Безопасный вариант}
begin j: = 1;
while ncbit [j,i]=0 do inc(j); {найти нужный ряд}
for i: = i to BIT do
if nbit[i] =1 then
ncbit [j,i]: = ord (ncbit [j, i] =0); {инверсия разрядов}
k: = 0;
for i: = 1 to BIT do
begin
if ncbit [j,i]=1 then inc(k);
if i<BIT then k: = k shl 1
end;
k: = col [j] – k
end;
GotoXY(1.23);
write('Мой ход: ');
GotoXY(WhereX-8,WhereY);
delay (.1000);
write (j, ' ',k);
col[j]: = col[j] – k
end; {ChooseMove}
{-------------------}
begin {SetOwnerMove}
case CheckField of {проверить количество непустых рядов}
0: PlayerVictory; {все ряды пусты – Победа игрока}
1: OwnVictory; {один непустой ряд – победа машины}
else
ChooseMove; {выбрать очередной ход}
end; {case}
end; {SetOwnerMove}
{--------------}
begin {Главная программа}
nrow: = 3; { Подготовить игру }
ncol [1]: = 3; { на поле из трех }
ncol [2]: = 4; { рядов фишек }
ncol [3]: = 5;
repeat { Цикл изменения условий игры }
Prepare; { Подготовить экран }
repeat { Игровой цикл }
GetPlayerMove; { Получить ход пользователя }
if not (exit or change) then
SetOwnerMove { Определить собственный ход }
until exit or change
until exit
end.
Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.