«...даже игры, как требующие ловкости,
так и основанные на случайности,
дают громадный материал для научных занятий.
Мало того, самые обыкновенные детские забавы
могли бы остановить на себе внимание
величайшего математика» .
Готфрид-Вильгельм Лейбниц
Объектом изучения являются математические задачи – «игры с камнями»
Цель работы:
- изучение одного из современных и развивающихся разделов математики – теории игр;
- проследить закономерность между игрой и математикой на примере китайской игры Цзяньшидзы;
- разобрать построение выигрышной стратегии для Цзяньшидзы;
- разработать и реализовать алгоритм игры Цзяньшидзы.
Цзяньшицзы
Правила игры
- из одной кучки можно брать любое количество камней (даже сразу всю кучку)
- можно брать камни одновременно из двух кучек, непременно по одинаковому количеству из каждой кучки.
Выигрывает тот, кто, соблюдая эти правила, сможет взять последний камень.
Пусть в двух кучах соответственно лежат a и b камней, где ; пара чисел (a; b) – это положение или позиция в данный момент игры. Проигрышны для начинающего
- взять 1 камень из первой кучи
- 1 камень из второй кучи
- 2 камень из второй кучи
- по 1 камню из обеих куч
положение (1; 2)
a
b
Положения выигрышные для начинающего
либо
a
b
Пусть в двух кучах соответственно лежат a и b камень, где ; пара чисел (a; b) – это положение или позиция в данный момент игры. Проигрышны для начинающего
- после каждого хода начинающего противник или сразу выигрывает
или
- сводит игру к положению (1; 2)
положение (3; 5)
a
b
Положения выигрышные для начинающего
либо
a
b
Таблица проигрышных для начинающего позиций
№
а
1
1
2
b
3
3
2
5
4
5
6
7
5
8
6
10
13
7
9
11
15
8
18
12
9
14
10
20
23
11
16
17
12
26
19
28
13
21
31
14
34
15
22
24
36
39
Арнольд Игорь Владимирович (06.03.1900 - 20.10.1948)
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 := 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 (c20))or((c2=0)and (c10))) 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 := 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 (c20))or((c2=0)and (c10))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; " width="640"
//игра с игроком
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+b0 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 := 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 (c20))or((c2=0)and (c10))) 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 := 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 (c20))or((c2=0)and (c10))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;
Выводы
- Проведено исследование методов построения выигрышной стратегии игры
- Выведена закономерность, на основании которой можно говорить о позиции игрока: выигрышной или проигрышной
- В результате исследования, мною была разработана программа, реализующая алгоритм игры Цзяньшидзы
- Усовершенствованы навыки написания программ под Windows