Спасибо
Дело в том, что мне надо написать игру "Жизнь" Джона Конвея. Программа работает правильно только первый ход, а дальше идут какие-то ошибки (клетки расставляются не так, элементарный glider не получается).
Может, подскажете мне, что у меня не так? Алгоритм сыроват, правда
Привожу код всей программы:
Код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, Buttons, StdCtrls, Menus;
type
TForm1 = class(TForm)
Field: TImage;
Panel1: TPanel;
StartButton: TButton;
StopButton: TButton;
ClearButton: TButton;
ExitButton: TButton;
MainTimer: TTimer;
Label1: TLabel;
Label2: TLabel;
procedure FormCreate(Sender: TObject);
procedure FieldClick(Sender: TObject);
procedure ExitButtonClick(Sender: TObject);
procedure StartButtonClick(Sender: TObject);
procedure MainTimerTimer(Sender: TObject);
procedure StopButtonClick(Sender: TObject);
procedure ClearButtonClick(Sender: TObject);
private
{ Private declarations }
public
fa:array[0..11,0..11] of byte;
fanew:array[0..11,0..11] of byte;
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
var i,j:integer;
begin
{Рисование клеток}
for i:=0 to 11 do begin
for j:=0 to 11 do begin
fa[i,j]:=0;
fanew[i,j]:=0;
Field.Canvas.Rectangle(i*20, j*20, i*20+20, j*20+20);
end;
end;
end;
procedure TForm1.FieldClick(Sender: TObject);
var x, y, z1, z2:integer;
begin
{Определяем координаты курсора над изображением}
x:=Mouse.CursorPos.X;
y:=Mouse.CursorPos.Y;
z1 := trunc((x - Form1.Left - Field.Left) / 20);
z2 := trunc((y - Form1.Top - Field.Top) / 20);
{Закрашиваем клетки}
case fa[z1,z2] of
1:begin
fa[z1,z2]:= 0;
Field.Canvas.Brush.Color := clWhite;
Field.Canvas.FloodFill(z1*20+1, z2*20+1, clRed, fsSurface);
Field.Refresh;
end;
0: begin
fa[z1,z2] := 1;
Field.Canvas.Brush.Color := clRed;
Field.Canvas.FloodFill(z1*20+1,z2*20+1,clWhite,fsSurface);
Field.Refresh;
end;
end;
end;
{Выход}
procedure TForm1.ExitButtonClick(Sender: TObject);
begin
Form1.Close;
end;
procedure TForm1.StartButtonClick(Sender: TObject);
var i,j,k:integer;
begin
{Считаем количество поставленных фишек на поле}
{Если на поле нет фишек, выводим сообщение}
{Если фишки расставлены, запускаем таймер}
k:=0;
for i:=0 to 11 do for j:=0 to 11 do k := k + fa[i,j];
if k = 0 then begin
MessageBox(0,'На поле нет ни одной фишки.','Ошибка!',MB_OK);
end
else begin
MainTimer.Enabled := true;
StopButton.Enabled := true;
ClearButton.Enabled := false;
end;
end;
procedure TForm1.MainTimerTimer(Sender: TObject);
var i,j,n:integer;
begin
{Проверяем кол-во соседей вокруг каждой клетки и заполняем второй массив}
for i:=1 to 10 do begin
for j:=1 to 10 do begin
if (fa[i,j]=2) then fa[i,j]:=1;
n:= fa[i-1,j-1] + fa[i-1,j] + fa[i-1,j+1] + fa[i,j-1] + fa[i,j+1] + fa[i+1,j-1] + fa[i+1,j] + fa[i+1,j+1];
if (fa[i,j]=1) and ((n<>2) and (n<>3)) then fanew[i,j]:=0;
if (fa[i,j]=1) and ((n=2) or (n=3)) then fanew[i,j]:=2;
if (fa[i,j]=0) and (n=3) then fanew[i,j]:=1;
end;
end;
for i:=1 to 10 do begin
for j:=1 to 10 do begin
fa[i,j] := 0;
end;
end;
Field.Canvas.Brush.Color := clWhite;
for i:= 0 to 11 do begin
for j:= 0 to 11 do begin
Field.Canvas.FloodFill(i*20+1, j*20+1, clRed, fsSurface);
end;
end;
for i:=1 to 10 do begin
for j:=1 to 10 do begin
fa[i,j] := fanew[i,j];
fanew[i,j]:=0;
case fa[i,j] of
0: begin
Field.Refresh;
end;
1: begin
Field.Canvas.Brush.Color := clRed;
Field.Canvas.FloodFill(i*20+1,j*20+1,clWhite,fsSurface);
Field.Refresh;
end;
2: begin
Field.Canvas.Brush.Color := clRed;
Field.Canvas.FloodFill(i*20+1,j*20+1,clWhite,fsSurface);
Field.Refresh;
end;
end;
end;
end;
end;
procedure TForm1.StopButtonClick(Sender: TObject);
begin
MainTimer.Enabled := false;
StartButton.Enabled := true;
ClearButton.Enabled := true;
end;
procedure TForm1.ClearButtonClick(Sender: TObject);
var i,j:byte;
begin
Field.Canvas.Brush.Color := clWhite;
for i:= 0 to 11 do begin
for j:= 0 to 11 do begin
Field.Canvas.FloodFill(i*20+1, j*20+1, clRed, fsSurface);
fa[i,j] := 0;
fanew[i,j] := 0;
end;
end;
Field.Refresh;
end;
end.
|