Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 27.06.2021, 12:05   #1
shkolnik45
Пользователь
 
Регистрация: 16.04.2021
Сообщений: 19
По умолчанию игра "жизнь". проблема с крайними клетками

Всем добрый день. Подскажите пожалуйста, мне нужно реализовать по сути игру "жизнь", но у меня проблема с крайними клетками, в них неправильно считается значение. В чем может быть проблема?(все что находится не с краю считается правильно)
1 скрин - пример
2 скрин - что выдает программа после 1 шага
3 скрин - что должно быть
Код:
var
  Form1: TForm1;
  time,n,m:integer;


implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var i,j:integer;
begin
for i:=0 to n-1 do
 for j:=0 to m-1 do
   StringGrid1.Cells[j,i]:='0';

end;

procedure TForm1.Button2Click(Sender: TObject);
var i,j:integer;
begin
randomize;
 for i:=0 to n-1 do
 for j:=0 to m-1 do
   StringGrid1.Cells[j,i]:=inttostr(random(2));
end;

procedure TForm1.Button3Click(Sender: TObject);
var i,j,s:integer; A:array [-1..50,-1..50] of integer;
begin
  for i:=0 to n-1 do
    for j:=0 to m-1 do
      A[i,j]:=strtoint(StringGrid1.Cells[j,i]);
   for i:=0 to n-1 do
    for j:=0 to m-1 do
    begin
    s:=A[i-1,j-1]+A[i-1,j]+A[i-1,j+1]+A[i,j-1]+A[i,j+1]+A[i+1,j-1]+A[i+1,j]+A[i+1,j+1];
    if (A[i,j]=0) and (s=3) then StringGrid1.Cells[j,i]:='1'
    else if (A[i,j]=1) and ((s=2) or (s=3)) then  StringGrid1.Cells[j,i]:='1'
    else StringGrid1.Cells[j,i]:='0';
    end;
end;

procedure TForm1.Button4Click(Sender: TObject);
begin
Timer1.Enabled:=true;
Button5.Visible:=true;
end;

procedure TForm1.Button5Click(Sender: TObject);
begin
Timer1.Enabled:=false;
Button5.Visible:=false;
end;

procedure TForm1.Button6Click(Sender: TObject);
begin
stringGrid1.ColCount:=n;
stringGrid1.RowCount:=m;
n:=50;
m:=50;
end;

procedure TForm1.Button7Click(Sender: TObject);
var i,j:integer;
begin
n:=strtoint(edit1.text);
m:=strtoint(edit2.text);
stringGrid1.ColCount:=n;
stringGrid1.RowCount:=m;
for i:=0 to n-1 do
 for j:=0 to m-1 do
   StringGrid1.Cells[j,i]:='0';
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var i,j,s:integer; A:array [-1..50,-1..50] of integer;
begin
time:=time-1;
  for i:=0 to n-1 do
    for j:=0 to m-1 do
      A[i,j]:=strtoint(StringGrid1.Cells[j,i]);
   for i:=0 to n-1 do
    for j:=0 to m-1 do
    begin
    s:=A[i-1,j-1]+A[i-1,j]+A[i-1,j+1]+A[i,j-1]+A[i,j+1]+A[i+1,j-1]+A[i+1,j]+A[i+1,j+1];
    if (A[i,j]=0) and (s=3) then StringGrid1.Cells[j,i]:='1'
    else if (A[i,j]=1) and ((s=2) or (s=3)) then  StringGrid1.Cells[j,i]:='1'
    else StringGrid1.Cells[j,i]:='0';
    end;
end;

procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
 if StringGrid1.Cells[ACol,ARow]='1' then  begin
                                     StringGrid1.Canvas.Brush.Color:=clgreen;
                                     StringGrid1.Canvas.FillRect(Rect);
                                     end
 else  begin
       StringGrid1.Canvas.Brush.Color:=clred;
       StringGrid1.Canvas.FillRect(Rect);
       end;
 end;



procedure TForm1.StringGrid1Enter(Sender: TObject);
var i,j:integer;
begin
for i:=0 to n-1 do
 for j:=0 to m-1 do
   StringGrid1.Cells[j,i]:='0';
end;

procedure TForm1.StringGrid1SelectCell(Sender: TObject; ACol, ARow: Integer;
var CanSelect: Boolean);
begin
if StringGrid1.Cells[ACol,ARow]='1' then StringGrid1.Cells[ACol,ARow]:='0'
else StringGrid1.Cells[ACol,ARow]:='1';
end;

end.
Изображения
Тип файла: png ь1.png (615 байт, 33 просмотров)
Тип файла: png ь2.png (438 байт, 32 просмотров)
Тип файла: png ь3.png (469 байт, 32 просмотров)
shkolnik45 вне форума Ответить с цитированием
Старый 28.06.2021, 02:51   #2
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

В граничных элементах локального массива A будет мусор, а не нули. Поэтому при подсчете s получится белиберда.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 28.06.2021, 16:20   #3
shkolnik45
Пользователь
 
Регистрация: 16.04.2021
Сообщений: 19
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
В граничных элементах локального массива A будет мусор, а не нули. Поэтому при подсчете s получится белиберда.
Ну я так и подумал, а как исправить не понимаю.
shkolnik45 вне форума Ответить с цитированием
Старый 28.06.2021, 17:34   #4
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,537
По умолчанию

Сделать в StringGrid1 по 1 строке и столбцу по краям, заполнив их нулями, и не менять их в игре (константная нулевая "ограда" ).
digitalis вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Игра "жизнь". Клеточный автомат. _human_ Python 1 17.03.2021 04:03
Игра "Жизнь". Проблема с границами DrawGrid KateTr Помощь студентам 0 02.04.2017 18:33
Игра "Жизнь" на Assembler kolo6awka Помощь студентам 0 22.12.2013 21:21
Игра "Жизнь" на C++, console application zoluxa Общие вопросы C/C++ 11 16.11.2012 17:47
игра "Жизнь" Lucky777 Помощь студентам 0 14.11.2011 17:38