С3 игра в камни
20.12.2015, 21:59. Показов 747. Ответов 0
Здравствуйте. У меня есть программа для задания: Два игрока играют в следующую игру. Перед ними лежат кучка камней [NZ] . У каждого игрока неограниченно много камней. Игроки ходят по очереди. Ход состоит в том, что игрок или удваивает число камней в куче, или добавляет 2 камня в кучу. Выигрывает игрок, после хода которого общее число камней кучае становится не менее [MZ] камней. Кто выигрывает при безошибочной игре обоих игроков — игрок, делающий первый ход, или игрок, делающий второй ход? Каким должен быть первый ход выигрывающего игрока?
Написал программу, которая работает по следующей логике:
1) 1 игрок победит 1 ходом
Pascal | 1
2
3
4
5
| {1 xod pobedin +igr1}
function ys1a(const s, umn, slo, mz: integer): boolean;
begin
ys1a := fumn(s, umn) >= mz
end; |
|
2) 2 игрок победит 1 ходом
Pascal | 1
2
3
4
5
| {1 xod pobedin +igr2}
function ys1b(const s, umn, slo, mz: integer): boolean;
begin
ys1b := (fumn(s, umn) < mz) and ((fumn(fslo(s, slo), umn) > mz))
end; |
|
3) 2 ходом победит 1 игрок
Pascal | 1
2
3
4
5
6
| function ys2(const s, umn, slo, mz: integer): boolean;
begin
ys2 := ((fumn(fslo(s, slo), umn) < mz) and (fumn(fslo(fslo(s, slo), slo), umn) >= mz))
or
((fumn(fumn(s, umn), umn) < mz) and (fumn(fslo(fumn(s, umn), slo), umn) >= mz))
end; |
|
4) 1 или 2 ходом победит 2 игрок
Pascal | 1
2
3
4
5
6
| function ys3(const s, umn, slo, mz: integer): boolean;
begin
ys3 := ((fumn(fslo(fslo(s, slo), slo), umn) < mz) and (fumn(fslo(fslo(fslo(s, slo), slo), slo), umn) >= mz))
or
((fumn(fslo(fumn(s, umn), slo), umn) < mz) and (fumn(fslo(fslo(fumn(s, umn), slo), slo), umn) >= mz))
end; |
|
Вот сама программа:
Pascal | 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
| const
igr1 = 'Петя';
igr2 = 'Ваня';
var
s: integer;
function fumn(s, umn: integer): integer;
begin
fumn := s * umn;
end;
function fslo(s, slo: integer): integer;
begin
fslo := s + slo;
end;
{1 xod pobedin +igr1}
function ys1a(const s, umn, slo, mz: integer): boolean;
begin
ys1a := fumn(s, umn) >= mz
end;
{1 xod pobedin +igr2}
function ys1b(const s, umn, slo, mz: integer): boolean;
begin
ys1b := (fumn(s, umn) < mz) and ((fumn(fslo(s, slo), umn) > mz))
end;
{2 xod pobedin +igr1}
function ys2(const s, umn, slo, mz: integer): boolean;
begin
ys2 := ((fumn(fslo(s, slo), umn) < mz) and (fumn(fslo(fslo(s, slo), slo), umn) >= mz))
or
((fumn(fumn(s, umn), umn) < mz) and (fumn(fslo(fumn(s, umn), slo), umn) >= mz))
end;
{1 или 2 ходом победит 2 игрок}
function ys3(const s, umn, slo, mz: integer): boolean;
begin
ys3 := ((fumn(fslo(fslo(s, slo), slo), umn) < mz) and (fumn(fslo(fslo(fslo(s, slo), slo), slo), umn) >= mz))
or
((fumn(fslo(fumn(s, umn), slo), umn) < mz) and (fumn(fslo(fslo(fumn(s, umn), slo), slo), umn) >= mz))
end;
var
mz, nz,nz2, umn, slo: integer;
begin
write('Начальное значение: ');
readln(nz);
readln(nz2);
write('Максимально значение: ');
readln(mz);
write('Прибавить: ');
readln(umn);
write('Умножить: ');
readln(slo);
{min}
for s := (nz+nz2) to mz - 1 do
if ys1a(s, umn, slo, mz) then
begin
writeln('1 xod pobedit ' + igr1 + ' if s>= ', s);
break
end;
{all}
for s := (nz+nz2) to mz - 1 do
if ys1b(s, umn, slo, mz) then
writeln('1 xod pobedit ' + igr2 + ' if s= ', s);
for s := (nz+nz2) to mz - 1 do
if ys2(s, umn, slo, mz) then
writeln('2 xod pobedit ' + igr1 + ' if s= ', s);
for s := (nz+nz2) to mz - 1 do
if ys3(s, umn, slo, mz) then
writeln('1 xod pobedit ' + igr2 + ' if s= ', s);
end. |
|
Суть моей проблемы: Что нужно подредактировать в коде, чтобы он работал для 2 кучек. То есть у меня есть 2 начальных значения (x;y) и для каждой кучки я могу выполнить сложение и умножение. И если первая кучка + вторая кучка больше максимального значения, то игрок выиграл.
0
|