Научно-исследовательская работа на тему: «Цзяньшидзы. Игры

advertisement
I
Научноисследовательская
работа на тему:
«Цзяньшидзы. Игры с
камнями»
Выполнил:
Валиев Георгий РСО-Алания,
г. Владикавказ МБОУ-лицей, 7 класс
Руководитель: Константиниди В. В.,
учитель высшей квалификационной категории,
МБОУ-лицей, РЦДТТ
1
Оглавление
1.
Введение ................................................................................................................................................ 2
2.
Основная часть ..................................................................................................................................... 4
3.
Заключение .........................................................................................................................................14
СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ ..................................................................................16
Приложение А ............................................................................................................................................17
2
Аннотация
Теория игр – научная дисциплина, которая изучает отношения между людьми, которые
руководствуются несовпадающими (а иногда и противоположными) мотивами для достижения
своих целей. Наряду с традиционными играми, такими как покер, шахматы, футбол и многие
другие, теория игр изучает и такие серьезные отношения как рыночная конкуренция, гонка
вооружений, загрязнение окружающей среды. В теории игр все эти серьезные отношения
называют играми, поскольку в них, как и в играх, результат зависит от решений (стратегий) всех
участников.
Исследовательская работа была направлена на

изучение одного из современных и развивающихся разделов математики – теории игр;

установление закономерностей между игрой и математикой на примере китайской игры
Цзяньшидзы;

разобрать построение выигрышной стратегии для Цзяньшидзы;

разработать и реализовать алгоритм игры Цзяньшидзы.
С одной стороны теория игр — это математическая дисциплина, которая применяется во
многих областях человеческой деятельности (экономика, военное дело, биология и др.). С другой
стороны теория игр — это раздел современной экономической теории. Новизна работы состоит в
разработке программы, которая наглядно иллюстрирует основные понятия теории позиционных
игр, то есть игр, в которых двое участников, делая ходы по очереди в соответствии с правилами,
стремятся к определенной цели. Основным вопросом для указанных игр является вопрос о том,
кто достигает поставленной цели и как он это делает. Я представил различные идеи, используемые
для построения выигрышных стратегий на примере игры Цзяньшицзы.
В результате исследования, мною была разработана программа, реализующая алгоритм игры
Цзяньшидзы
3
1. Введение
Игра — форма деятельности в условных ситуациях, направленная на воссоздание и усвоение
общественного опыта, фиксированного в социально закрепленных способах осуществления
предметных действий, в предметах науки и культуры. Создание типичных для профессии
ситуаций и нахождение в них практических решений является стандартным для теории
управления (деловые игры — моделирование производственной ситуации в целях выработки
наиболее эффективных решений и профессиональных навыков) и военного дела (военные игры —
решение практических задач на местности и по топографическим картам).
Актуальность темы исследования подтверждается неослабевающим интересом к шарадам,
ребусам, головоломкам, которые служат для человека полигоном по испытанию своих
возможностей в решении проблем и задач любой сложности. Другими словами, развивая логику,
мы учимся выживать.
Готфрид-Вильгельм Лейбниц отмечал в письме к своему коллеге: «...даже игры, как
требующие ловкости, так и основанные на случайности, дают громадный материал для научных
занятий. Мало того, самые обыкновенные детские забавы могли бы остановить на себе внимание
величайшего математика»[3].
4
Объектом изучения являются математические задачи – «игры с камнями»
Цель работы:

изучение одного из современных и развивающихся разделов математики – теории игр;

проследить закономерность между игрой
и математикой на примере китайской игры
Цзяньшидзы;

разобрать построение выигрышной стратегии для Цзяньшидзы;

разработать и реализовать алгоритм игры Цзяньшидзы.
Данная исследовательская работа направлена на изучение одного из современных и
развивающихся разделов математики – теории игр. В ней я применил метод варьирования,
который состоит в проигрывании (прохождении, продумывании) различных вариантов какой-либо
ситуации. Варьирование и есть работа логического мышления.
Новизна работы состоит в разработке программы, которая наглядно иллюстрирует
основные понятия теории позиционных игр, то есть игр, в которых двое участников, делая ходы
по очереди в соответствии с правилами, стремятся к определенной цели. Основным вопросом для
указанных игр является вопрос о том, кто достигает поставленной цели и как он это делает. Я
представил различные идеи, используемые для построения выигрышных стратегий на примере
игры Цзяньшицзы. Аналога данному приложению пока нет.
2. Основная часть
Цзяньшицзы — китайская национальная игра. Буквальный перевод слова Цзяньшицзы —
выбирание камней.
Играют двое. Положив на землю две кучки камней, играющие поочередно берут камни из
этих кучек, соблюдая следующие правила:
а) из одной кучки можно брать любое количество камней (даже сразу всю кучку),
б) можно брать камни одновременно из двух кучек, непременно по одинаковому количеству
из каждой кучки.
Выигрывает тот, кто, соблюдая эти правила, сможет взять последний камень.
Камни, разумеется, можно заменить любыми другими предметами.
5
В Цзяньшицзы не ограничивается первоначальное количество предметов, раскладываются
они на две кучки, и игроку разрешается брать количество предметов, не предопределяемое
заранее.
В этой игре можно брать сразу из нескольких кучек камни. Эта возможность существенно
осложняет поиск выигрышной стратегии.
Математический интерес игры — в построении ее теории, то есть в отыскании и
обосновании такого способа ведения игры, который обеспечивал бы выигрыш партии
определенному игроку.
Пусть в наших двух кучах соответственно лежат a и b камень, где
; пара чисел (a; b) –
это положение или позиция в данный момент игры. Будем искать те положения, которые
проигрышны для начинающего.
Первое такое положение (1; 2).
Возможных ходов свсего четыре:
1. Взять 1 камень из первой кучи
2. 1 камень из второй кучи
3. 2 камень из второй кучи
4. По 1 камню из обеих куч.
Очевидно, что при любом ходе начинающего противник любым ходом заканчивает игру, т.е.
выигрывает [4].
Продолжаем исследование. Если в первой кучке 1 камень, а во второй не меньше трех
камней, то игрок А, начинающий игру, обязательно выиграет: он возьмет из второй кучки все
камни за исключением двух; это приведет к положению (1, 2), то есть к такому соотношению
камней, при котором игрок Б, делающий очередной «ход», проигрывает.
Рассматривая всевозможные положения, я заметил, что выигрышными для начинающего
будут те, где в кучах будет 1 или 2 или где разность
.
Если в этом положении нельзя окончить игру одним ходом, то можно свести к положению
(1; 2).
Игрок, желающий выиграть игру, должен руководствоваться таким принципом: своим ходом
свести соотношение камней в кучках к сочетанию начинающий проигрывает.
Какие же еще соотношения камней, кроме (1, 2), будут сочетаниями «начинающий
проигрывает»?
Рассмотрев подробно все случаи продолжения игры в положении (2, n) для n>1, затем в
положении (3, n) и т. д., я нашел еще целый ряд сочетаний «начинающий проигрывает», знание
которых обязательно для достижения победы в игре Цзяньшицзы.
Следующей проигрышной позицией для начинающего является (3; 5).
6
Здесь после каждого хода начинающего противник или сразу выигрывает или сводит игру к
положению (1; 2).
Так же я заметил, что все остальные позиции
или где
, где одно из чисел a или b равно 3 или 5
, выигрышны для начинающего.
В положении (1, 2) игрок, делающий очередной ход, проигрывает. В этом легко убедиться и
просмотрев таблицу, которую я составил для всех случаев продолжения игры от положения (1, 2):
№
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
а
1
3
5
6
8
9
11
12
14 16
17
19
21
22
24
b
2
5
7
10 13
15
18
20
23 26
28
31
34
36
39
В первом столбце таблицы указано число камней в каждой кучке. Цифры под a и b
указывают, сколько камней осталось в кучках после очередного хода (игрок А делает «ход»
первым). Внимательно рассмотрев таблицу, видим, что в ней часто встречаются числа Фиббоначи
(1, 2, 5, 13 столбец). Попробуем переписать все числа в таблице в «фиббоначиевой системе
счисления». В этой системе все числа представляются в виде суммы чисел Фиббоначи.
Например, число 13 в этой системе запишется:
13 = 1000000
13 = 1*13+0*8+0*5+0*3+0*2+0*1+0*1
№
1
2
3
4
5
6
7
8
а
1
100
101
1001
10000
10001
10100
10101
b
10
1000
1010
10010
100000
100010
101000
10101
0
9
10
11
12
13
14
15
a
100001
100100
100101
101001
1000000
1000001
1000100
b
1000010
1001000 1010010 1010010 10000000
10000010
10001000
Теперь легко увидеть, что проигрышная пара пара получается приписыванием к b одного
нуля в конце.
Изучая литературу по теме, я заметил, что, попадая в поле зрения математиков, любой факт,
зависимость, явление сразу же измеряется, обсчитывается и так далее.
7
Обстоятельное решение игры Цзяньшицзы впервые было найдено лишь в 1930 г. московским
профессором
Игорем
Владимировичем
Арнольдом.
Но
продолжая
исследование,
меня
заинтересовал тот факт, что, несмотря на то, что математическая теория игры исследовалась,
программы-игры нет (или я плохо искал). Я попытался восполнить сей пробел.
Данная научно-исследовательская работа выполнена в среде Delphi на языке Object Pascal.
Delphi — это среда быстрой разработки, в которой в качестве языка программирования
используется
язык
Object
Pascal.
Система
визуального
объективно-ориентированного
проектирования Delphi позволяет:
 быстро создавать профессионально выглядящий оконный интерфейс; интерфейс
удовлетворяет всем требованиям Windows и автоматически настраивается на ту систему,
которая установлена на компьютере пользователя, поскольку использует функции,
процедуры и библиотеки Windows;
 создавать свои динамически присоединяемые библиотеки (Dll) компонентов, форм,
функций, которые затем можно использовать из других языков программирования;
 создавать мощные системы работы с локальными и удаленными базами данных любых
типов;
 формировать и печатать сложные отчеты, включающие таблицы, графики и т.п.;
 создавать справочные системы (файлы.hlp), как для своих приложений, так и для любых
других, с которыми можно работать не только из приложений, но и просто из Windows;
 создавать
профессиональные
программы
установки
для
приложений
Windows,
учитывающие всю специфику и все требования операционной системы [1].
Язык Object Pascal – это основной инструмент программирования в среде разработки Delphi.
Любая программа в Delphi состоит из файла проекта и одного или нескольких модулей. И моя
программа разбита на них[1].
8
После запуска программы пользователю предоставляется интерфейс игры (рис. 1, рис. 2),
который предлагает один из режимов: игра на двоих и игра с ботом.
Рисунок 1
Рисунок 2
Первый режим реализован с помощью алгоритма, представленного на рис.3.
9
Рисунок 3. Блок-схема алгоритма игры с двумя игроками
Листинг данного алгоритма:
//игра с игроком
begin
a := StrToInt(InputBox('В первой куче','','0'));
b := StrToInt(InputBox('Во второй куче','','0'));
label1.Caption:=IntToStr(a);
label2.Caption:=IntToStr(b);
Memo2.Lines.Add('I ('+IntToStr(a)+';'+IntToStr(b)+')');
while a+b>0 do
begin
c1 := StrToInt(InputBox('I','В первой куче','0'));
10
c2 := StrToInt(InputBox('I','Во второй куче','0'));
Memo1.Lines.Add('I ('+IntToStr(c1)+';'+IntToStr(c2)+')');
if (c1=c2) and(c1=0)or (a<c1)or (b<c2) then begin
c1 := StrToInt(InputBox('I','В первой куче','0'));
c2 := StrToInt(InputBox('I','Во второй куче','0'));
Memo1.Lines.Add('I ('+IntToStr(c1)+';'+IntToStr(c2)+')');
end;
if ((c1=c2)or ((c1=0)and (c2<>0))or((c2=0)and (c1<>0))) then
begin
a:=a-c1;
b:=b-c2;
label1.Caption:=IntToStr(a);
label2.Caption:=IntToStr(b);
if (a=0) and (b=0) then label4.Caption:='Первый выиграл'
else begin
c1 := StrToInt(InputBox('II','В первой куче','0'));
c2 := StrToInt(InputBox('II','Во второй куче','0'));
Memo1.Lines.Add('II ('+IntToStr(c1)+';'+IntToStr(c2)+')');
if (c1=c2) and(c1=0)or (a<c1)or (b<c2) then begin
c1 := StrToInt(InputBox('II','В первой куче','0'));
c2 := StrToInt(InputBox('II','Во второй куче','0'));
Memo1.Lines.Add('II ('+IntToStr(c1)+';'+IntToStr(c2)+')');
a:=a-c1;
b:=b-c2;
end
else
11
if (c1=c2)or ((c1=0)and (c2<>0))or((c2=0)and (c1<>0))then
begin
a:=a-c1;
b:=b-c2;
end;
label1.Caption:=IntToStr(a);
label2.Caption:=IntToStr(b);
if (a=0) and (b=0) then label4.Caption:='выйграл второй '
end;
end;
end; end;
Гораздо интереснее было реализовывать игру с компьютером. Весь алгоритм сводится, к
тому, чтобы создать ситуацию, когда игрок проигрывает. Для этого постоянно просчитывались
все возможные ходы компьютера, выбирался оптимальный ход для сложившейся ситуации.
//1 ход компьютера
begin
k1 := StrToInt(InputBox('В первой куче','','0'));
k2:= StrToInt(InputBox('Во второй куче','','0'));
Label1.Caption:=IntToStr(k1);
Label2.Caption:=IntToStr(k2);
while k1+k2>=3 do
begin
// ходит первый игрок
if ((k1=4)and(k2=3))or((k1=3)and(k2=4)) then begin
k1:=k1-2;
k2:=k2-2;
12
Memo1.Lines.Add('II ('+IntToStr(2)+';'+IntToStr(2)+')');
end
else
begin
if (k1*k2<>2) then
begin
fa:=0;fb:=0;
if k2>=k1 then
begin
min:=k1; f_min_k:=1;
max:=k2; f_max_k:=2
end
else
begin
min:=k2; f_min_k:=2;
max:=k1; f_max_k:=1;
end;
for i := 1 to 15 do
if (min=a1[i])and(b1[i]< max)then begin j:=i; fa:=1; end
else if (min=b1[i])and(a1[i]< max) then begin j:=i; fb:=1; end;
if fa =1 then
rez:=max-b1[j];
if fb=1 then
rez:=max-a1[j];
if (f_max_k=2) and (rez<>0)then begin k2:=k2-rez;
Memo1.Lines.Add('II ('+IntToStr(0)+';'+IntToStr(rez)+')');
13
end;
if
(f_max_k=1)
and
(rez<>0)then
begin
Memo1.Lines.Add('II
('+IntToStr(rez)+';'+IntToStr(0)+')');
k1:=k1-rez;
end;
if (rez=0)and (k1<>k2) then begin
if f_max_k=2 then k2:=k2-k1;
if f_max_k=1 then k1:=k1-k2;
end ;
// Memo2.Lines.Add('II ('+IntToStr(k1)+';'+IntToStr(k2)+')');
Label1.Caption:=IntToStr(k1);
Label2.Caption:=IntToStr(k2);
if (rez=0)and (k1=k2) then begin
k:=k2;k2:=k2-k1;
k1:=k1-k;
end;
end; rez:=0;
end;
//end; //ot enterevskogo ifa na verhu
if (k1=0)or(k2=0) then begin Label4.Caption:='vigral 2!!!!'; break; end ;
Label1.Caption:=IntToStr(k1);
Label2.Caption:=IntToStr(k2);
c1 := StrToInt(InputBox('I','из первой кучи','0'));
c2 := StrToInt(InputBox('I','из второй кучи','0'));
if (k1-c1<0)or(k2-c2<0) then begin
c1 := StrToInt(InputBox('I','из первой кучи','0'));
14
c2 := StrToInt(InputBox('I','из второй кучи','0'));
end;
if (c1=c2)or (c1*c2=0) then
begin
k1:=k1-c1;
k2:=k2-c2;
// количество камней после первого игрока
Memo1.Lines.Add('I ('+IntToStr(c1)+';'+IntToStr(c2)+')');
Memo2.Lines.Add('I ('+IntToStr(k1)+';'+IntToStr(k2)+')');
Label1.Caption:=IntToStr(k1);
Label2.Caption:=IntToStr(k2);
if (k1*k2=2) then begin Label4.Caption:='vigrk1l 1 !!!!!'; break
end;
end;
end;
end;
Исследуя алгоритм построения выигрышной стратегии, стало понятно, что игра, в
определенном смысле, выгодна для начинающего. Листинг программы представляю в приложении
А.
3. Заключение
Данная исследовательская работа помогла мне приобрести знания, далеко выходящие за курс
школьной математики. Кроме того, до сих пор я не задумывался, что игра – это так серьезно.
 Что существует математический метод изучения оптимальных стратегий в играх.
 Что игра – это процесс, в которых участвуют две и более сторон, ведущих борьбу за
реализацию своих интересов, каждая из сторон имеет свою цель и использует
некоторую стратегию, которая может вести к выигрышу или проигрышу — в
зависимости от поведения других игроков; указывает лучшие стратегии с учѐтом
представлений обо всех участниках игры, их ресурсах и их возможных поступках.
15
 Что
теория
игр
чаще
всего
находит
применение
в экономике, социологии, политике, психологии, этике и других.
Меня заинтересовала теория игр как научная дисциплина, которая изучает отношения между
людьми, которые руководствуются несовпадающими (а иногда и противоположными) мотивами.
Наряду с традиционными играми, такими как покер, шахматы, футбол и многие другие, теория
игр изучает и такие серьезные отношения как рыночная конкуренция, гонка вооружений,
загрязнение окружающей среды. В теории игр все эти серьезные отношения называют играми,
поскольку в них, как и в играх, результат зависит от решений (стратегий) всех участников.
С одной стороны теория игр — это математическая дисциплина, которая применяется во
многих областях человеческой деятельности (экономика, военное дело, биология и др.). С другой
стороны теория игр — это раздел современной экономической теории, что подтверждается
большим количеством Нобелевских премий в области экономики, присужденных самым
выдающимся представителям данной науки.
Выводы:

изучение одного из современных и развивающихся разделов математики – теории
игр;

проследить закономерность между игрой и математикой на примере китайской игры
Цзяньшидзы;

разобрать построение выигрышной стратегии для Цзяньшидзы;

разработать и реализовать алгоритм игры Цзяньшидзы.
16
СПИСОК ИСПОЛЬЗОВАННОЙ ЛИТЕРАТУРЫ
1. Культин Н. Б.Самоучитель. Основы программирования в Delphi 2010, БХВ-Петербург
2010 г.
2.
Боровский А., Программирование в Delphi 2005, БХВ-Петербург, 2005
3. Соболевский Р.Ф.; Логические и математические игры. Мн., «Нар. асвета», 1977. – 96 с.
4. Яглом И.; Две игры со спичками. Журнал Квант, 1992 г. № 1
5. Х. Деулофеу - Дилемма заключенного и доминантные стратегии. Теория игр (Мир
математики Т. 8) – 201
Приложение А
unit Unit2;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Buttons, jpeg, ExtCtrls, unit1, XPMan;
type
TForm2 = class(TForm)
Image1: TImage;
Image2: TImage;
Image3: TImage;
Label1: TLabel;
Label2: TLabel;
BitBtn1: TBitBtn;
Memo1: TMemo;
Memo2: TMemo;
Label4: TLabel;
BitBtn2: TBitBtn;
XPManifest1: TXPManifest;
procedure BitBtn2Click(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form2: TForm2;
const
a1:array[1..15] of integer=(1,3,4,6,8,9,11,12,14,16,17,19,21,22,24);
b1:array[1..15] of integer=(2,5,7,10,13,15,18,20,23,26,28,31,34,36,39);
var a,b,n,c1,c2,k:integer;
d1,d2:integer;
i,j,fa,fb,rez,max,min,h1,h2,f_min_k,f_max_k,k1,k2:integer;
var r_i_1, r_i_2:integer; //индексы радиогрупп
implementation
//uses Unit1;
{$R *.dfm}
procedure TForm2.BitBtn1Click(Sender: TObject);
begin
form1.show;
end;
procedure TForm2.BitBtn2Click(Sender: TObject);
begin
label4.Caption:='';
Memo1.Clear ; Memo2.Clear ;
case form1.RadioGroup1.ItemIndex of
0://игра с игроком
begin
a := StrToInt(InputBox('В первой куче','','0'));
b := StrToInt(InputBox('Во второй куче','','0'));
label1.Caption:=IntToStr(a);
label2.Caption:=IntToStr(b); Memo2.Lines.Add('I ('+IntToStr(a)+';'+IntToStr(b)+')');
while a+b>0 do
begin
c1 := StrToInt(InputBox('I','В первой куче','0'));
c2 := StrToInt(InputBox('I','Во второй куче','0'));
Memo1.Lines.Add('I ('+IntToStr(c1)+';'+IntToStr(c2)+')');
if (c1=c2) and(c1=0)or (a<c1)or (b<c2) then begin
c1 := StrToInt(InputBox('I','В первой куче','0'));
c2 := StrToInt(InputBox('I','Во второй куче','0'));
Memo1.Lines.Add('I ('+IntToStr(c1)+';'+IntToStr(c2)+')');
end;
if ((c1=c2)or ((c1=0)and (c2<>0))or((c2=0)and (c1<>0))) then
begin
a:=a-c1;
b:=b-c2;
label1.Caption:=IntToStr(a);
label2.Caption:=IntToStr(b);
if (a=0) and (b=0) then label4.Caption:='Первый выиграл'
else begin
c1 := StrToInt(InputBox('II','В первой куче','0'));
c2 := StrToInt(InputBox('II','Во второй куче','0'));
Memo1.Lines.Add('II ('+IntToStr(c1)+';'+IntToStr(c2)+')');
if (c1=c2) and(c1=0)or (a<c1)or (b<c2) then begin
c1 := StrToInt(InputBox('II','В первой куче','0'));
c2 := StrToInt(InputBox('II','Во второй куче','0'));
Memo1.Lines.Add('II ('+IntToStr(c1)+';'+IntToStr(c2)+')');
a:=a-c1;
b:=b-c2;
end
else
if (c1=c2)or ((c1=0)and (c2<>0))or((c2=0)and (c1<>0))then
begin
a:=a-c1;
b:=b-c2;
end;
label1.Caption:=IntToStr(a);
label2.Caption:=IntToStr(b);
if (a=0) and (b=0) then label4.Caption:='выйграл второй '
end;
end;
end; end;
// игрок с компьютером
1: case form1.RadioGroup2.ItemIndex of
0://1 ход игрока
begin
k1 := StrToInt(InputBox('В первой куче','','0'));
k2:= StrToInt(InputBox('Во второй куче','','0'));
Label1.Caption:=IntToStr(k1);
Label2.Caption:=IntToStr(k2);
while k1+k2>=3 do
begin
// ходит первый игрок
//writeln('
',1);
c1 := StrToInt(InputBox('I','из первой кучи','0'));
c2 := StrToInt(InputBox('I','из второй кучи','0'));
if (k1-c1<0)or(k2-c2<0) then begin
{if (c1=c2) and(c1=0)or (a<c1)or (b<c2) then begin }
c1 := StrToInt(InputBox('I','из первой кучи','0'));
c2 := StrToInt(InputBox('I','из второй кучи','0'));
end;
{if (c1=c2) and(c1=0)or (a<c1)or (b<c2) then begin
c1 := StrToInt(InputBox('I','В первой куче','0'));
c2 := StrToInt(InputBox('I','Во второй куче','0')); }
{if ((k1=3) and (k2=4)) or ((k1=4) and (k2=3)) then label1.Caption:=k1;
label2}
if (c1=c2)or (c1*c2=0) then
begin
k1:=k1-c1;
k2:=k2-c2;
// количество камней после первого игрока
//writeln(' 1 gamer stone ',k1,' ',k2);
Memo1.Lines.Add('I ('+IntToStr(c1)+';'+IntToStr(c2)+')');
Memo2.Lines.Add('I ('+IntToStr(k1)+';'+IntToStr(k2)+')');
Label1.Caption:=IntToStr(k1);
Label2.Caption:=IntToStr(k2);
if (k1*k2=2) then begin Label4.Caption:='выйграл игрок'; break
end;
if ((k1=4)and(k2=3))or((k1=3)and(k2=4)) then begin
k1:=k1-2;
k2:=k2-2;
Memo1.Lines.Add('II ('+IntToStr(2)+';'+IntToStr(2)+')');
end
else
begin
if (k1*k2<>2) then
begin
fa:=0;fb:=0;
if k2>=k1 then
begin
min:=k1; f_min_k:=1;
max:=k2; f_max_k:=2
end
else
begin
min:=k2; f_min_k:=2;
max:=k1; f_max_k:=1;
end;
for i := 1 to 15 do
if (min=a1[i])and(b1[i]< max)then begin j:=i; fa:=1; end
else if (min=b1[i])and(a1[i]< max) then begin j:=i; fb:=1; end;
if fa =1 then
rez:=max-b1[j];
if fb=1 then
rez:=max-a1[j];
//writeln('
rez
',rez);
if (f_max_k=2) and (rez<>0)then begin k2:=k2-rez;
Memo1.Lines.Add('II ('+IntToStr(0)+';'+IntToStr(rez)+')');
end;
if (f_max_k=1) and (rez<>0)then begin Memo1.Lines.Add('II ('+IntToStr(rez)+';'+IntToStr(0)+')');
k1:=k1-rez;
end;
if (rez=0)and (k1<>k2) then begin
if f_max_k=2 then k2:=k2-k1;
if f_max_k=1 then k1:=k1-k2;
end ;
// Memo2.Lines.Add('II ('+IntToStr(k1)+';'+IntToStr(k2)+')');
Label1.Caption:=IntToStr(k1);
Label2.Caption:=IntToStr(k2);
// writeln(' k1
',k1,' k2
',k2);
if (rez=0)and (k1=k2) then begin
k:=k2;k2:=k2-k1;
k1:=k1-k;
end;
end; rez:=0;
// writeln(' bot
',k1,' ',k2);
end;
end; //ot enterevskogo ifa na verhu
if (k1=0)or(k2=0) then begin Label4.Caption:='выйграл компьютер!!!!'; break; end;
Label1.Caption:=IntToStr(k1);
Label2.Caption:=IntToStr(k2);
end;
end;
1 ://1 ход компьютера
begin
k1 := StrToInt(InputBox('В первой куче','','0'));
k2:= StrToInt(InputBox('Во второй куче','','0'));
Label1.Caption:=IntToStr(k1);
Label2.Caption:=IntToStr(k2);
while k1+k2>=3 do
begin
// ходит первый игрок
if ((k1=4)and(k2=3))or((k1=3)and(k2=4)) then begin
k1:=k1-2;
k2:=k2-2;
Memo1.Lines.Add('II ('+IntToStr(2)+';'+IntToStr(2)+')');
end
else
begin
if (k1*k2<>2) then
begin
fa:=0;fb:=0;
if k2>=k1 then
begin
min:=k1; f_min_k:=1;
max:=k2; f_max_k:=2
end
else
begin
min:=k2; f_min_k:=2;
max:=k1; f_max_k:=1;
end;
for i := 1 to 15 do
if (min=a1[i])and(b1[i]< max)then begin j:=i; fa:=1; end
else if (min=b1[i])and(a1[i]< max) then begin j:=i; fb:=1; end;
if fa =1 then
rez:=max-b1[j];
if fb=1 then
rez:=max-a1[j];
if (f_max_k=2) and (rez<>0)then begin k2:=k2-rez;
Memo1.Lines.Add('II ('+IntToStr(0)+';'+IntToStr(rez)+')');
end;
if (f_max_k=1) and (rez<>0)then begin Memo1.Lines.Add('II ('+IntToStr(rez)+';'+IntToStr(0)+')');
k1:=k1-rez;
end;
if (rez=0)and (k1<>k2) then begin
if f_max_k=2 then k2:=k2-k1;
if f_max_k=1 then k1:=k1-k2;
end ;
// Memo2.Lines.Add('II ('+IntToStr(k1)+';'+IntToStr(k2)+')');
Label1.Caption:=IntToStr(k1);
Label2.Caption:=IntToStr(k2);
if (rez=0)and (k1=k2) then begin
k:=k2;k2:=k2-k1;
k1:=k1-k;
end;
end; rez:=0;
end;
//end; //ot enterevskogo ifa na verhu
if (k1=0)or(k2=0) then begin Label4.Caption:='vigral 2!!!!'; break; end ;
Label1.Caption:=IntToStr(k1);
Label2.Caption:=IntToStr(k2);
c1 := StrToInt(InputBox('I','из первой кучи','0'));
c2 := StrToInt(InputBox('I','из второй кучи','0'));
if (k1-c1<0)or(k2-c2<0) then begin
c1 := StrToInt(InputBox('I','из первой кучи','0'));
c2 := StrToInt(InputBox('I','из второй кучи','0'));
end;
if (c1=c2)or (c1*c2=0) then
begin
k1:=k1-c1;
k2:=k2-c2;
// количество камней после первого игрока
Memo1.Lines.Add('I ('+IntToStr(c1)+';'+IntToStr(c2)+')');
Memo2.Lines.Add('I ('+IntToStr(k1)+';'+IntToStr(k2)+')');
Label1.Caption:=IntToStr(k1);
Label2.Caption:=IntToStr(k2);
if (k1*k2=2) then begin Label4.Caption:='vigrk1l 1 !!!!!'; break
end;
end;
end;
end;
end;
end; BitBtn2.Enabled:=false;
end;
end.
Download