Игра Ним
{------------------} 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.