Показать сообщение отдельно
  #5  
Старый 30.09.2009, 22:49
RayOfLight RayOfLight вне форума
Прохожий
 
Регистрация: 27.09.2009
Сообщения: 11
Репутация: 10
По умолчанию

Спасибо
Дело в том, что мне надо написать игру "Жизнь" Джона Конвея. Программа работает правильно только первый ход, а дальше идут какие-то ошибки (клетки расставляются не так, элементарный 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.
Ответить с цитированием