Консультация № 191562
27.10.2017, 22:31
0.00 руб.
01.11.2017, 10:00
0 11 0
Здравствуйте! У меня возникли сложности с таким вопросом:
Есть задание:
Имеется поле A x A. Максимальное значение a = 20. Есть T - такты времени. В поле взаимодействуют 2 вида элементов. Данные задаются через интерфейс программы(клацается по клеточке и выбирается). 1 вид - активные элементы(поисковая группа). 2 вид - пассивные объекты. На экране должна быть индикация: количество активных и количество пассивных.
В текущий такт времени происходят следующие события:
1) текущий активный элемент генерирует случайную пару координат - это точка, в которой в следующий такт времени приземлится этот текущий активный элемент(точка конца прыжка).
2) Если в 8 соседних клетках вокруг точки конца прыжка и в самой точке конца прыжка нет пассивных элементов, то текущему активному элементу присваивается -1 (промах).
3) Если в 8 соседних клетках точки приземления или в самой точке конца прыжка есть один или несколько пассивных элементов, то этот активный получает +1 за всех, при этом алгебраически суммируется предыдущее значение и этот + 1. Все пассивные в этих 9 клетках исчезают (т.е. он их "съедает"). В следующем такте времени их нет.
4) Если в 8 соседних клетках текущего активного есть 3 или более активных, то он погибает от перенаселения.
5) Текущий активный переходит в точку конца прыжка в следующем такте времени.
6) Если у активного элемента 2 минуса, то в следующем такте времени он исчезает(умирает от голода) и не участвует в дальнейшем рассмотрении.
7) Если у активного элемента 2 плюса, то он генерирует случайное место на поле(рождает) другого нового активного. При этом 2 плюса обнуляются.
8) Если у любой пустой клетки есть 3 активных соседа, то в ней в следующем такте времени рождается новый активный.
9) Если в точке конца прыжка уже находится активный элемент, то прыжок просто повторяется.


есть программа готовая:

[code lang=pascal h=300]{-2,-1,0,1,2 - значения масссива для актива
{-2,-1,0,1,2 - значения масссива для актива
5 - пассив
7- пусто}
program laba3;

uses GraphABC;
const
step = 30; //ширина клетки игрового поля
width = 800; //ширина игрового поля
height = 600; //высота игрового поля


var
n: integer;//размер игрового поля
active_input: integer;//количество активов уже внесенных на поле
passive_input: integer;//количество пассивов уже внесенных на поле
active: integer;//количество активных объектов
passive: integer;//количество пассивных объектов
takt_input:integer;
takt: integer; //количество тактов
//count_redrow:integer;

game_field: array [1..20, 1..20] of integer;//игровое поле
prev_field: array [1..20, 1..20] of integer;//копия поля, для прорисовки предыдущего шага

//копирование игрового поля для прорисвки предыдущего шага
procedure CopyOfArray();
begin
for var i := 1 to n do
for var j := 1 to n do
prev_field[i, j] := game_field[i, j];
end;

//прорисовка игрового поля
procedure Field();
var
x, y: integer;
x1, y1: integer;
begin
x := 10;
y := 10;
x1 := 30 + step * n;
y1 := 10;
SetBrushColor(clBlack);
SetPenColor(clBlack);
for var i := 1 to n + 1 do
begin
Line(x, y, x + step * (n), y);
y += step;
Line(x1, y1, x1 + step * (n), y1);
y1 += step;
end;
y := 10;
y1 := 10;
for var i := 1 to n + 1 do
begin
Line(x, y, x, y + step * (n));
x += step;
Line(x1, y1, x1, y1 + step * (n));
x1 += step;
end;
SetFontSize(12);
SetBrushColor(Color.White);
TextOut(10, 70 + step * n, 'Мафия');
TextOut(150, 70 + step * n, active.ToString);
SetFontSize(12);
TextOut(10, 100 + step * n, 'Мирные жители');
TextOut(150, 100 + step * n, passive.ToString);
SetFontSize(12);
TextOut(10, 130 + step * n, 'Осталось тактов');
TextOut(150, 130 + step * n, takt.ToString);

SetFontSize(12);
TextOut(100+ step * n, 20 + step * n, 'Такт');
if(takt_input-takt-1)>=0 then
TextOut(150+ step * n, 20 + step * n, (takt_input-takt-1).ToString);
SetFontSize(12);
TextOut(100, 20 + step * n, 'Такт');
TextOut(150, 20 + step * n, (takt_input-takt).ToString);

end;

procedure Draw(flag: boolean);
begin
ClearWindow();
Field();

LockDrawing;
if (flag) then
begin
for var i := 1 to n do
for var j := 1 to n do
begin
if ((prev_field[i, j] = 7) or (prev_field[i, j] = -10)) then
begin
SetPenColor(clWhite);
SetBrushColor(clWhite);
rectangle(step * i - 18, step * j - 18, step * i + 9, step * j + 9);
SetPenColor(clBlack);
SetBrushColor(clBlack);
continue;
end;
if (prev_field[i, j] = 5) then
begin
SetPenColor(clLime);
SetBrushColor(clLime);
rectangle(step * i + 2 + step * n, step * j - 18, step * i + 29 + step * n, step * j + 9);
SetPenColor(clBlack);
SetBrushColor(clBlack);
continue;
end;
//

if (prev_field[i, j] = -2) then
begin
game_field[i, j] := 7;
SetPenColor(clGray);
SetBrushColor(clGray);
rectangle(step * i + 2 + step * n, step * j - 18, step * i + 29 + step * n, step * j + 9);
SetFontSize(8);
TextOut(30 + step * n + round(step / 2 + (i - 1) * step), 10 + round(step / 2 + (j - 1) * step), prev_field[i, j].ToString());
SetPenColor(clBlack);
SetBrushColor(clBlack);

continue;
end;


SetPenColor(clCyan);
SetBrushColor(clCyan);
rectangle(step * i + 2 + step * n, step * j - 18, step * i + 29 + step * n, step * j + 9);
SetPenColor(clBlack);
SetBrushColor(clCyan);
SetFontSize(8);
if ((prev_field[i, j] = -2) or (prev_field[i, j] = -1) or (prev_field[i, j] = 0) or (prev_field[i, j] = 1) or (prev_field[i, j] = 2)) then
TextOut(30 + step * n + round(step / 2 + (i - 1) * step), 10 + round(step / 2 + (j - 1) * step), prev_field[i, j].ToString());
end;
end;
for var i := 1 to n do
for var j := 1 to n do
begin
if ((game_field[i, j] = 7) or (game_field[i, j] = -3)) then
begin
//
game_field[i, j]:=7;
SetPenColor(clWhite);
SetBrushColor(clWhite);
rectangle(step * i - 18, step * j - 18, step * i + 9, step * j + 9);
SetPenColor(clBlack);
SetBrushColor(clBlack);
continue;
end;
if (game_field[i, j] = 5) then
begin
SetPenColor(clLime);
SetBrushColor(clLime);
rectangle(step * i - 18, step * j - 18, step * i + 9, step * j + 9);
SetPenColor(clBlack);
SetBrushColor(clBlack);
continue;
end;
SetPenColor(clCyan);
SetBrushColor(clCyan);
rectangle(step * i - 18, step * j - 18, step * i + 9, step * j + 9);
SetPenColor(clBlack);
SetBrushColor(clCyan);
SetFontSize(8);
if ((game_field[i, j] = -2) or (game_field[i, j] = -1) or (game_field[i, j] = 0) or (game_field[i, j] = 1) or (game_field[i, j] = 2)) then
TextOut(10 + round(step / 2 + (i - 1) * step), 10 + round(step / 2 + (j - 1) * step), game_field[i, j].ToString());
end;
SetPenColor(clBlack);
SetBrushColor(clGray);
Rectangle(width - 298, height - 8, width - 448, height - 58);
SetPenColor(clBlack);
SetBrushColor(clWhite);
Rectangle(width - 300, height - 10, width - 450, height - 60);
SetFontSize(20);
TextOut(width - 400, height - 50, 'ШАГ');
Redraw;

end;

procedure CreateNewActive();
var
x, y: integer;
begin
while(true) do
begin
x := random(n) + 1;
y := random(n) + 1;
if ((game_field[x, y] = 5) or (game_field[x, y] = 7)) then
begin
game_field[x, y] := 0;
inc(active);
break;
end;
end;
end;

procedure CreateNewActive(i, j: integer);
begin
game_field[i, j] := -10;
inc(active);
end;

//вводится ключ key-ключ проверки
//1 проверка на i+1
//2 проверка на i-1
//3 проверка на j+1
//4 проверка на j-1
function Check(i, j, key: integer): boolean;
var
res: boolean;
begin
res := false;
case key of
1:
if (i < n) then
res := true;
2:
if (i > 1) then
res := true;
3:
if (j < n) then
res := true;
4:
if (j > 1) then
res := true;
end;
result := res;
end;

//поиск места для прыжка
procedure CheckFree();
var
count: integer;
begin
count := 0;
for var i := 1 to n do
begin
for var j := 1 to n do
begin
count := 0;
if (game_field[i, j] <> 7) then continue;
if (Check(i, j, 1)) then
if ((game_field[i + 1, j] = -1) or (game_field[i + 1, j] = 0) or (game_field[i + 1, j] = 1)) then
inc(count);
if (Check(i, j, 2)) then
if ((game_field[i - 1, j] = -1) or (game_field[i - 1, j] = 0) or (game_field[i - 1, j] = 1)) then
inc(count);
if (Check(i, j, 3)) then
if ((game_field[i, j + 1] = -1) or (game_field[i, j + 1] = 0) or (game_field[i, j + 1] = -1)) then
begin
inc(count);
if (count = 3) then
begin
CreateNewActive(i, j);
continue;
end;
end;
if (Check(i, j, 4)) then
if ((game_field[i, j - 1] = -1) or (game_field[i, j - 1] = 0) or (game_field[i, j - 1] = 1)) then
begin
inc(count);
if (count = 3) then
begin
CreateNewActive(i, j);
continue;
end;
end;
if ((Check(i, j, 3)) and (Check(i, j, 1))) then
if ((game_field[i + 1, j + 1] = -1) or (game_field[i + 1, j + 1] = 0) or (game_field[i + 1, j + 1] = 1)) then
begin
inc(count);
if (count = 3) then
begin
CreateNewActive(i, j);
continue;
end;
end;
if ((Check(i, j, 4)) and (Check(i, j, 1))) then
if ((game_field[i + 1, j - 1] = -1) or (game_field[i + 1, j - 1] = 0) or (game_field[i + 1, j - 1] = 1)) then
begin
inc(count);
if (count = 3) then
begin
CreateNewActive(i, j);
continue;
end;
end;
if ((Check(i, j, 3)) and (Check(i, j, 2))) then
if ((game_field[i - 1, j + 1] = -1) or (game_field[i - 1, j + 1] = 0) or (game_field[i - 1, j + 1] = 1)) then
begin
inc(count);
if (count = 3) then
begin
CreateNewActive(i, j);
continue;
end;
end;
if ((Check(i, j, 4)) and (Check(i, j, 2))) then
if ((game_field[i - 1, j - 1] = -1) or (game_field[i - 1, j - 1] = 0) or (game_field[i - 1, j - 1] = 0)) then
begin
inc(count);
if (count = 3) then
begin
CreateNewActive(i, j);
continue;
end;
end;
end;
end;
end;

function ChengeStepActive(i, j: integer): boolean;
var
res: boolean;
begin
if (game_field[i, j] = 5) then
begin
game_field[i, j] := 7;
res := true;
dec(passive);
end;
if (Check(i, j, 1)) then
if (game_field[i + 1, j] = 5) then
begin
game_field[i + 1, j] := 7;
res := true;
dec(passive);
end;
if (Check(i, j, 2)) then
if (game_field[i - 1, j] = 5) then
begin
game_field[i - 1, j] := 7;
res := true;
dec(passive);
end;
if (Check(i, j, 3)) then
if (game_field[i, j + 1] = 5) then
begin
game_field[i, j + 1] := 7;
res := true;
dec(passive);
end;
if (Check(i, j, 4)) then
if (game_field[i, j - 1] = 5) then
begin
game_field[i, j - 1] := 7;
res := true;
dec(passive);
end;
if ((Check(i, j, 3)) and (Check(i, j, 1))) then
if (game_field[i + 1, j + 1] = 5) then
begin
game_field[i + 1, j + 1] := 7;
res := true;
dec(passive);
end;
if ((Check(i, j, 4)) and (Check(i, j, 1))) then
if (game_field[i + 1, j - 1] = 5) then
begin
game_field[i + 1, j - 1] := 7;
res := true;
dec(passive);
end;
if ((Check(i, j, 2)) and (Check(i, j, 3))) then
if (game_field[i - 1, j + 1] = 5) then
begin
game_field[i - 1, j + 1] := 7;
res := true;
dec(passive);
end;
if ((Check(i, j, 4)) and (Check(i, j, 2))) then
if (game_field[i - 1, j - 1] = 5) then
begin
game_field[i - 1, j - 1] := 7;
res := true;
dec(passive);
end;
result := res;
end;

//вводятся дополнительные значение 8 9 10 11 12, которые используются чтобы не было повторного использования точки
procedure p_takt();
var
x, y: integer;
begin




CheckFree;
for var i := 1 to n do
for var j := 1 to n do
if (prev_field[i, j] = -10) then
begin
game_field[i, j] := prev_field[i, j]+10;
prev_field[i, j]:=7;

end;
Draw(false);
CopyOfArray();


LockDrawing;
Draw(false);
Redraw;
for var i := 1 to n do
for var j := 1 to n do
begin
if ((game_field[i, j] = -1) or (game_field[i, j] = 0) or (game_field[i, j] = 1) or (game_field[i, j] = 2)) then//(game_field[i, j] = -2) or
begin
while (true) do
begin
x := random(n) + 1;
y := random(n) + 1;
if ((game_field[x, y] = 5) or (game_field[x, y] = 7)) then
break;
end;
if (ChengeStepActive(x, y)) then
game_field[x, y] := game_field[i, j] + 11
else
game_field[x, y] := game_field[i, j] - 11;
game_field[i, j] := 7;
LockDrawing;
SetPenColor(Color.Red);
//
//Line(10+step*n + round(step / 2 + (i - 1) * step), 10 + round(step / 2 + (j - 1) * step),10+step*n + round(step / 2 + (x - 1) * step), 10 + round(step / 2 + (y - 1) * step));
Line(10+round(step / 2 + (i - 1) * step), 10 + round(step / 2 + (j - 1) * step),10+ round(step / 2 + (x - 1) * step), 10 + round(step / 2 + (y - 1) * step));Line(10 + round(step / 2 + (i - 1) * step), 10 + round(step / 2 + (j - 1) * step),10+ round(step / 2 + (x - 1) * step), 10 + round(step / 2 + (y - 1) * step));
Redraw();
Sleep(2000);
end;
end;


for var i := 1 to n do
for var j := 1 to n do
begin
if (game_field[i, j] > 7) then
game_field[i, j] -= 10;
if (game_field[i, j] < -5) then
game_field[i, j] += 10;
end;

///////////////
Draw(true);
for var i := 1 to n do
for var j := 1 to n do
begin
if (game_field[i, j] = -2) then
begin
//

LockDrawing;
SetPenColor(clGray);
SetBrushColor(clGray);
rectangle(step * i - 18, step * j - 18, step * i + 9, step * j + 9);
SetFontSize(8);
TextOut(10 + round(step / 2 + (i - 1) * step), 10 + round(step / 2 + (j - 1) * step), game_field[i, j].ToString());
//game_field[i, j] := 7;
Redraw();
dec(active);
end;

if (game_field[i, j] = 2) then
begin
LockDrawing;
SetPenColor(clLightCyan);
SetBrushColor(clLightCyan);
rectangle(step * i - 18, step * j - 18, step * i + 9, step * j + 9);
SetFontSize(8);
TextOut(10 + round(step / 2 + (i - 1) * step), 10 + round(step / 2 + (j - 1) * step), game_field[i, j].ToString());
CreateNewActive();
game_field[i, j] := 0;
Redraw;
end;
end;


end;

procedure MouseDown(x, y, mb: integer);
var
i, j: integer;
begin
if (x <width - 300) and (y < height - 10) and (x > width - 450) and (y > height - 60) and (takt<>0) then
begin
takt-=1;
p_takt();
end;
if (x <width - 300) and (y < height - 10) and (x > width - 450) and (y > height - 60) and(takt=0) then
begin

SetPenColor(clWhite);
SetBrushColor(clWhite);
Rectangle(width - 298, height - 8, width - 448, height - 58);
SetPenColor(clWhite);
SetBrushColor(clWhite);
Rectangle(width - 300, height - 10, width - 450, height - 60);
SetFontSize(20);
TextOut(width - 400, height - 50, 'КОНЕЦ ИГРЫ');
Redraw;
end;




if (x < 10) or (y < 10) or (x > n * step + 10) or (y > n * step + 10) then exit;
LockDrawing;
i := (x - 10) div step + 1;
j := (y - 10) div step + 1;
if (active_input < active) then
begin
game_field[i, j] := 0;
inc(active_input);
Draw(false);
Redraw();
exit;
end;
if (passive_input < passive) then
begin
game_field[i, j] := 5;
inc(passive_input);
Draw(false);
Redraw();
exit;
end;


Redraw;
end;


//основная программа
begin
SetWindowCaption('Action игра');
SetWindowPos(400, 50);
SetWindowWidth(width);
SetWindowHeight(height);
active_input := 0;
passive_input := 0;
write('Введите размер поля ');
readln(n);
writeln(n);
for var i := 1 to n do
for var j := 1 to n do game_field[i, j] := 7;
CopyOfArray();
Write('Количество активных объектов ');
ReadLN(active);
writeln(active);
Write('Количество пассивных объектов ');
ReadLN(passive);
writeln(passive);
write('Количество тактов ');
readln(takt_input);
writeln(takt_input);
takt:=takt_input;
ClearWindow();
Draw(false);
OnMouseDown := MouseDown;
end.[/code]

вы можете подсказать и объяснить, что вообще от меня хотят, т.к. я не понял ничего. ну или как хотябы пользоваться программой. что за красные линии там?

Обсуждение

давно
Посетитель
399158
228
29.10.2017, 18:53
общий
может помочь кто-то?
давно
Мастер-Эксперт
425
4118
30.10.2017, 09:47
общий
Цитата: Посетитель - 399158
вы можете подсказать и объяснить, что вообще от меня хотят,

Судя по приведённому Вами описанию, от Вас хотят именно текст программы.
Цитата: Посетитель - 399158
т.к. я не понял ничего.

Многабукв? У Вас там есть нумерация пунктов, попробуйте делать попунктно. Вообще, из Вашего вопроса совершенно непонятно, а чего же Вы сами хотите.
Цитата: Посетитель - 399158
что за красные линии там?

Возможно Вы каким-то совершенно волшебным образом вилите красные линии, а вот эксперты их не видят.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Посетитель
399158
228
30.10.2017, 09:49
общий
вы можете запустить программу эту? п.с. она готова уже))
давно
Мастер-Эксперт
425
4118
30.10.2017, 10:25
общий
Адресаты:
Не могу, к сожалению. Судя по коду - это PascalABC, а у меня не Windows, а Linux, там эта штука не работает.
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
давно
Старший Модератор
31795
6196
30.10.2017, 10:26
общий
30.10.2017, 10:29
Адресаты:
Цитата: Посетитель - 399158
вы можете запустить программу эту

А проблема в чем?
Качаете PascalABC.Net(это его код) и запускаете.
После ввода информации программа работает в два этапа:

Красными линиями показаны ходы мафии.

После всех ходов показывается сам результат хода:


Цитата: Посетитель - 399158
вы можете подсказать и объяснить, что вообще от меня хотят

Если бы Вы знали, как эксперты не понимают, что Вы от них хотите.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
399158
228
30.10.2017, 21:46
общий
она правильно вообще работает?)) я не понимаю что от меня хотят
давно
Старший Модератор
31795
6196
31.10.2017, 18:57
общий
Адресаты:
Вроде правильно работает, все условия в голове удержать трудно, чтобы наблюдать за ходом игры.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
399158
228
31.10.2017, 19:04
общий
а как линию красную эту убрать, которая во время игры появляется?
давно
Старший Модератор
31795
6196
31.10.2017, 19:11
общий
Адресаты:
поставьте комментарии на строки 428 и 431
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Посетитель
399158
228
05.11.2017, 09:18
общий
я когда закоментил, справа в поле ничего не отображается. а должно быть предыдущее состояние. как быть?
давно
Посетитель
399158
228
05.11.2017, 15:30
общий
у меня когда нажимаю 1 такт, иногда показывается три полоски шага мафии, потом тормозит и ничего не происходит, пока не нажму следующий такт. поможете исправить?
Форма ответа