м (→Прога для общего случая) |
(Отмена правки 122349, сделанной участником Гроссмейстер Проф (обс.)) |
||
(не показано 16 промежуточных версий этого же участника) | |||
Строка 17: | Строка 17: | ||
Program WisestProf; | Program WisestProf; | ||
var N, i, k, l, ww, diff, fs, first, h, S, ii, c: integer; | var N, i, k, l, ww, diff, fs, first, h, S, ii, c: integer; | ||
− | W: array[1.. | + | W: array[1..10000] of integer; |
label Net, No; | label Net, No; | ||
BEGIN | BEGIN | ||
writeln('Добро пожаловать в "Просто добавь квадрат"! Прибавлять можно только квадраты натуральных чисел и писать сразу сумму (на первом ходу это просто квадрат). Выиграет тот, кто составит сумму, равную победному числу. Составлять сумму, превышающую это число, запрещено.'); | writeln('Добро пожаловать в "Просто добавь квадрат"! Прибавлять можно только квадраты натуральных чисел и писать сразу сумму (на первом ходу это просто квадрат). Выиграет тот, кто составит сумму, равную победному числу. Составлять сумму, превышающую это число, запрещено.'); | ||
− | |||
Net: | Net: | ||
write('Назови победное число (НЕ квадрат натурального): '); | write('Назови победное число (НЕ квадрат натурального): '); | ||
Строка 31: | Строка 30: | ||
goto Net; | goto Net; | ||
end; | end; | ||
− | |||
S:=0; | S:=0; | ||
i:=1; | i:=1; | ||
+ | ww:=N; | ||
for k:=1 to N-1 do | for k:=1 to N-1 do | ||
begin | begin | ||
diff:=0; | diff:=0; | ||
− | ww:= | + | ww:=ww-1; |
− | l:=1 | + | l:=1; |
repeat | repeat | ||
if round(sqrt(W[l]-ww))=sqrt(W[l]-ww) then diff:=1; | if round(sqrt(W[l]-ww))=sqrt(W[l]-ww) then diff:=1; | ||
Строка 54: | Строка 53: | ||
fs:=1; | fs:=1; | ||
+ | first:=0; | ||
repeat | repeat | ||
Строка 61: | Строка 61: | ||
S:=W[fs]; | S:=W[fs]; | ||
writeln('Ход компьютера: ', S); | writeln('Ход компьютера: ', S); | ||
− | first | + | first:=1; |
− | + | ||
end; | end; | ||
+ | fs:=fs+1; | ||
until (first=1) or (fs>i); | until (first=1) or (fs>i); | ||
Строка 84: | Строка 84: | ||
end; | end; | ||
ii:=ii+1; | ii:=ii+1; | ||
− | until S=W[ii]; | + | until S=W[ii-1]; |
+ | until S=N; | ||
+ | writeln('Сасай, лалка!'); | ||
+ | readln; | ||
+ | END. | ||
+ | </poem> | ||
+ | |||
+ | == Прога для варианта игры с добавлением 1 или 2 квадратов с лимитом сверху == | ||
+ | <poem> | ||
+ | Program WisestProf; | ||
+ | var lim, N, x, y, i, k, l, ww, diff, fs, first, h, S, ii, hod: integer; | ||
+ | W: array[1..10000] of integer; | ||
+ | label Ni, Net, No, Nicht; | ||
+ | |||
+ | BEGIN | ||
+ | writeln('Добро пожаловать в "Просто добавь 1 или 2 квадрата"! Вводить можно только квадраты натуральных чисел. Выиграет тот, кто составит сумму, равную победному числу. Составлять сумму, превышающую это число, запрещено.'); | ||
+ | |||
+ | Ni: | ||
+ | write('Выбери максимальный допустимый квадрат натурального числа: '); | ||
+ | readln(lim); | ||
+ | if (round(sqrt(lim))<>sqrt(lim)) or (lim=0) then | ||
+ | begin | ||
+ | writeln('Это не квадрат натурального, придурок!'); | ||
+ | goto Ni; | ||
+ | end; | ||
+ | |||
+ | Net: | ||
+ | write('Назови победное число (которого нельзя достичь за 1 ход): '); | ||
+ | readln(N); | ||
+ | for x:=1 to round(sqrt(lim)) do | ||
+ | for y:=0 to x do if (x*x+y*y=N) or (N<lim) then | ||
+ | begin | ||
+ | writeln('Давай по новой, Миша, число хуйня'); | ||
+ | goto Net; | ||
+ | end; | ||
+ | |||
+ | W[1]:=N; | ||
+ | S:=0; | ||
+ | i:=1; | ||
+ | ww:=N; | ||
+ | |||
+ | for k:=1 to N-1 do | ||
+ | begin | ||
+ | diff:=0; | ||
+ | ww:=ww-1; | ||
+ | l:=1; | ||
+ | repeat | ||
+ | for x:=1 to round(sqrt(lim)) do | ||
+ | for y:=0 to x do if x*x+y*y=W[l]-ww then diff:=1; | ||
+ | l:=l+1; | ||
+ | until (diff=1) or (l>i); | ||
+ | |||
+ | If diff=0 then | ||
+ | begin | ||
+ | i:=i+1; | ||
+ | W[i]:=ww; | ||
+ | end; | ||
+ | end; | ||
+ | |||
+ | fs:=1; | ||
+ | first:=0; | ||
+ | |||
+ | repeat | ||
+ | for x:=1 to round(sqrt(lim)) do | ||
+ | for y:=0 to x do if x*x+y*y=W[fs] then if first=0 then | ||
+ | begin | ||
+ | writeln('Компьютер ходит первым.'); | ||
+ | S:=W[fs]; | ||
+ | writeln( 'Ход компьютера: ', x*x, '+', y*y, '=', S); | ||
+ | first:=1; | ||
+ | end; | ||
+ | fs:=fs+1; | ||
+ | until (first=1) or (fs>i); | ||
+ | |||
+ | repeat | ||
+ | No: | ||
+ | write('Твой ход, первый квадрат: '); | ||
+ | readln(h); | ||
+ | if (h>0) and (h<=lim) and (round(sqrt(h))=sqrt(h)) and (S+h<N) then S:=S+h else | ||
+ | begin | ||
+ | writeln('Ты неправильно походил, мудила!'); | ||
+ | goto No; | ||
+ | end; | ||
+ | |||
+ | Nicht: | ||
+ | write ('Твой ход, второй квадрат или 0: '); | ||
+ | readln(h); | ||
+ | if (h<=lim) and (round(sqrt(h))=sqrt(h)) and (S+h<N) then S:=S+h else | ||
+ | begin | ||
+ | writeln('Ты неправильно походил, мудила!'); | ||
+ | goto Nicht; | ||
+ | end; | ||
+ | |||
+ | writeln('Сумма после твоего хода: ', S); | ||
+ | |||
+ | ii:=1; | ||
+ | hod:=0; | ||
+ | |||
+ | repeat | ||
+ | for x:=1 to round(sqrt(lim)) do | ||
+ | for y:=0 to x do if S+x*x+y*y=W[ii] then if hod=0 then | ||
+ | begin | ||
+ | writeln( 'Ход компьютера: ', S, '+', x*x, '+', y*y, '=', W[ii]); | ||
+ | S:=W[ii]; | ||
+ | hod:=1; | ||
+ | end; | ||
+ | ii:=ii+1; | ||
+ | until S=W[ii-1]; | ||
until S=N; | until S=N; | ||
writeln('Сасай, лалка!'); | writeln('Сасай, лалка!'); |
Текущая версия на 19:08, 3 ноября 2023
ты голову то пожалей такое шедевр писать --пидарасина 16:00, 15 марта 2016 (UTC)
Проф, вам надо придумать математический анализ игр, однозначно
Отличная игра, в нее имеет смысл играть как можно больше. Komandante (обсуждение) 17:56, 18 марта 2016 (UTC)
- Спасибо, постараюсь придумать ещё подобные игры. А матан и у Логика из Самары неплохо получается. Проф (обсуждение) 07:00, 19 марта 2016 (UTC)
- Отлично! Кстати, вы там писали, что считаете очень профоугодной игру Hearthstone, а что вы думаете об игре, от которой это все пошло - то есть magic the gathering? Играли? Komandante (обсуждение) 10:27, 19 марта 2016 (UTC)
- Не, у меня в этом плане синдром утёнка. Проф (обсуждение) 07:35, 20 марта 2016 (UTC)
- Отлично! Кстати, вы там писали, что считаете очень профоугодной игру Hearthstone, а что вы думаете об игре, от которой это все пошло - то есть magic the gathering? Играли? Komandante (обсуждение) 10:27, 19 марта 2016 (UTC)
Кстати, в вашей программе компьютер всегда выигрывает... Вот ведь подлый робот. Komandante (обсуждение) 10:28, 19 марта 2016 (UTC)
- Ну не зря же я вручную просчитал все 50 млрд. возможных вариантов для этого. Проф (обсуждение) 07:35, 20 марта 2016 (UTC)
Великая игра от великого автора. -- ஞ (обсуждение) 18:22, 20 марта 2016 (UTC)
Прога для общего случая
Program WisestProf;
var N, i, k, l, ww, diff, fs, first, h, S, ii, c: integer;
W: array[1..10000] of integer;
label Net, No;
BEGIN
writeln('Добро пожаловать в "Просто добавь квадрат"! Прибавлять можно только квадраты натуральных чисел и писать сразу сумму (на первом ходу это просто квадрат). Выиграет тот, кто составит сумму, равную победному числу. Составлять сумму, превышающую это число, запрещено.');
Net:
write('Назови победное число (НЕ квадрат натурального): ');
readln(N);
if round(sqrt(N))<>sqrt(N) then W[1]:=N else
begin
writeln('Давай по новой, Миша, число хуйня');
goto Net;
end;
S:=0;
i:=1;
ww:=N;
for k:=1 to N-1 do
begin
diff:=0;
ww:=ww-1;
l:=1;
repeat
if round(sqrt(W[l]-ww))=sqrt(W[l]-ww) then diff:=1;
l:=l+1;
until (diff=1) or (l>i);
If diff=0 then
begin
i:=i+1;
W[i]:=ww;
end;
end;
fs:=1;
first:=0;
repeat
if round(sqrt(W[fs]))=sqrt(W[fs]) then
begin
writeln('Компьютер ходит первым.');
S:=W[fs];
writeln('Ход компьютера: ', S);
first:=1;
end;
fs:=fs+1;
until (first=1) or (fs>i);
repeat
No:
write('Твой ход: ');
readln(h);
if (h>S) and (round(sqrt(abs(h-S)))=sqrt(abs(h-S))) and (h<N) then S:=h else
begin
writeln('Ты неправильно походил, мудила!');
goto No;
end;
ii:=1;
repeat
for c:=1 to round(sqrt((N))) do if S+c*c=W[ii] then
begin
S:=W[ii];
writeln('Ход компьютера: ', S);
end;
ii:=ii+1;
until S=W[ii-1];
until S=N;
writeln('Сасай, лалка!');
readln;
END.
Прога для варианта игры с добавлением 1 или 2 квадратов с лимитом сверху
Program WisestProf;
var lim, N, x, y, i, k, l, ww, diff, fs, first, h, S, ii, hod: integer;
W: array[1..10000] of integer;
label Ni, Net, No, Nicht;
BEGIN
writeln('Добро пожаловать в "Просто добавь 1 или 2 квадрата"! Вводить можно только квадраты натуральных чисел. Выиграет тот, кто составит сумму, равную победному числу. Составлять сумму, превышающую это число, запрещено.');
Ni:
write('Выбери максимальный допустимый квадрат натурального числа: ');
readln(lim);
if (round(sqrt(lim))<>sqrt(lim)) or (lim=0) then
begin
writeln('Это не квадрат натурального, придурок!');
goto Ni;
end;
Net:
write('Назови победное число (которого нельзя достичь за 1 ход): ');
readln(N);
for x:=1 to round(sqrt(lim)) do
for y:=0 to x do if (x*x+y*y=N) or (N<lim) then
begin
writeln('Давай по новой, Миша, число хуйня');
goto Net;
end;
W[1]:=N;
S:=0;
i:=1;
ww:=N;
for k:=1 to N-1 do
begin
diff:=0;
ww:=ww-1;
l:=1;
repeat
for x:=1 to round(sqrt(lim)) do
for y:=0 to x do if x*x+y*y=W[l]-ww then diff:=1;
l:=l+1;
until (diff=1) or (l>i);
If diff=0 then
begin
i:=i+1;
W[i]:=ww;
end;
end;
fs:=1;
first:=0;
repeat
for x:=1 to round(sqrt(lim)) do
for y:=0 to x do if x*x+y*y=W[fs] then if first=0 then
begin
writeln('Компьютер ходит первым.');
S:=W[fs];
writeln( 'Ход компьютера: ', x*x, '+', y*y, '=', S);
first:=1;
end;
fs:=fs+1;
until (first=1) or (fs>i);
repeat
No:
write('Твой ход, первый квадрат: ');
readln(h);
if (h>0) and (h<=lim) and (round(sqrt(h))=sqrt(h)) and (S+h<N) then S:=S+h else
begin
writeln('Ты неправильно походил, мудила!');
goto No;
end;
Nicht:
write ('Твой ход, второй квадрат или 0: ');
readln(h);
if (h<=lim) and (round(sqrt(h))=sqrt(h)) and (S+h<N) then S:=S+h else
begin
writeln('Ты неправильно походил, мудила!');
goto Nicht;
end;
writeln('Сумма после твоего хода: ', S);
ii:=1;
hod:=0;
repeat
for x:=1 to round(sqrt(lim)) do
for y:=0 to x do if S+x*x+y*y=W[ii] then if hod=0 then
begin
writeln( 'Ход компьютера: ', S, '+', x*x, '+', y*y, '=', W[ii]);
S:=W[ii];
hod:=1;
end;
ii:=ii+1;
until S=W[ii-1];
until S=N;
writeln('Сасай, лалка!');
readln;
END.