Имеется программа, моделирующая игру "жизнь". Смысл игры в том, что на игровом поле отмечаются "живые" клетки. Затем, следуя 2-м игровым правилам, они размножаются и погибают. Нужна помощь в следующем: необходимо добавить по центру игрового поля небольшое препятствие, например в виде линии или прямоугольника. Собственно, не пойму, как его туда добавить.
Не зная что делать, разделил игровое поле пополам, т.е. один из столбиков игрового поля, который посередине, теперь не реагирует ни на что. Но теперь проблема в том, как этот столбик закрасить в какой-нибудь цвет, кроме черного и белого.
Пожалуйста, помогите или с добавлением нормального препятствия, или с закраской имеющегося!
Текст оригинальной программы следующий:
Код:
unit U_ConwaysLife1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
Grids, StdCtrls, ExtCtrls, shellAPI, Buttons, DBCtrls;
const boardsize=25;
type
TForm1 = class(TForm)
StringGrid1: TStringGrid;
StartBtn: TButton;
SpeedButton2: TSpeedButton;
CheckBox1: TCheckBox;
procedure StringGrid1Click(Sender: TObject);
procedure StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
procedure StartBtnClick(Sender: TObject);
procedure FormActivate(Sender: TObject);
procedure CheckBox1Click(Sender: TObject);
procedure SpeedButton2Click(Sender: TObject);
public
{CurrentGrid и NextGrid – 2-мерные матрицы, определяющие 2 поля – нынешнее и следующее поколение}
Currentgrid,NextGrid:array [0..boardsize-1, 0..boardsize-1] of boolean;
mass_1, mass_2 : Array [1..boardsize, 1..boardsize] of String;
Procedure makestep;
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
procedure TForm1.StringGrid1Click(Sender: TObject);
begin
with stringgrid1 do
if cells[col,row]='' then
begin
cells[col,row]:='1';
currentgrid[col,row]:=true;
end
else
begin
cells[col,row]:='';
currentgrid[col,row]:=false;
end;
end;
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
Rect: TRect; State: TGridDrawState);
begin
with stringgrid1,canvas do
begin
if cells[acol,arow]<>'' then brush.color:=clblack else brush.color:=clwhite;
fillrect(rect);
end;
end;
Procedure TForm1.makestep;
function CountPrevNeighbors(const i,j:integer):integer;
var
L,R,U,D:integer;
begin
result:=0;
if i>0 then L:=i-1 else L:=boardsize-1;
if j>0 then U:=j-1 else U:=boardsize-1;
if i<boardsize-1 then R:=i+1 else R:=0;
if j<boardsize-1 then D:=j+1 else D:=0;
if Currentgrid[L,j] then inc(result);
if Currentgrid[i,U] then inc(result);
if Currentgrid[R,j] then inc(result);
if Currentgrid[i,D] then inc(result);
if Currentgrid[L,U] then inc(result);
if Currentgrid[R,U] then inc(result);
if Currentgrid[L,D] then inc(result);
if Currentgrid[R,D] then inc(result);
end;
var
i,j:integer;
n:integer;{число соседей}
livecell:boolean;
begin
for i:=0 to boardsize-1 do
for j:=0 to boardsize-1 do
begin
Nextgrid[i,j]:=Currentgrid[i,j];
Livecell:=Currentgrid[i,j];
n:=countprevNeighbors(i,j);
{правила: 1.Любая живая клетка умирает, если соседей меньше двух или больше трех.
2.Мертвая клетка, рядом с которой ровно три живые, оживает. }
if Livecell then
begin
if ((n<2) or (n>3)) then
begin
nextgrid[i,j]:=false;
stringgrid1.cells[i,j]:='';
end;
end
else
if n=3 then
begin
Nextgrid[i,j]:=true;
stringgrid1.cells[i,j]:='1';
end;
end;
for i:=0 to boardsize-1 do
for j:= 0 to boardsize-1 do
Currentgrid[i,j]:=NextGrid[i,j];
end;
procedure TForm1.FormActivate(Sender: TObject);
var
i,j:integer;
begin
for i:=0 to high(Currentgrid) do
for j:=0 to high(Currentgrid) do Currentgrid[i,j]:=false;
end;
procedure TForm1.StartBtnClick(Sender: TObject);
begin
makestep;
end;
end.
Для разделения внес следующие изменения в имеющихся процедурах:
Код:
procedure TForm1.StringGrid1Click(Sender: TObject);
begin
with stringgrid1 do
if (cells[col,row]='')and(col<>boardsize div 2) then
..........
end;
Procedure TForm1.makestep;
{Создание нового потомства, возвращает true если модель изменена}
function CountPrevNeighbors(const i,j:integer):integer;
{Функция определения количества соседей}
var
L,R,U,D:integer;
begin
result:=0;
if (i>0)and(i<>boardsize div 2) then L:=i-1 else L:=boardsize-1;
if j>0 then U:=j-1 else U:=boardsize-1;
...........................
end;