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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.12.2010, 18:44   #1
Arm!n
 
Регистрация: 09.12.2010
Сообщений: 7
По умолчанию Добавление препятствия в игру или закраска столбца в StringGrid

Имеется программа, моделирующая игру "жизнь". Смысл игры в том, что на игровом поле отмечаются "живые" клетки. Затем, следуя 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;
Вложения
Тип файла: rar Жизнь.rar (226.3 Кб, 8 просмотров)
Arm!n вне форума Ответить с цитированием
Старый 29.12.2010, 21:23   #2
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

Код:
procedure TForm1.StringGrid1DrawCell(Sender: TObject; ACol, ARow: Integer;
  Rect: TRect; State: TGridDrawState);
begin
  with stringgrid1, canvas do begin
    if ACol = boardsize div 2 then
      brush.color := clGreen
    else
      if cells[acol, arow] <> '' then
        brush.color := clblack
      else
        brush.color := clwhite;
    fillrect(rect);
  end;
end;
Прик вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
сравнение ячеек и добавление нового столбца к таблице robbe Microsoft Office Excel 7 22.01.2010 10:30
добавление столбца Chugun БД в Delphi 1 13.01.2010 00:22
Добавление столбца в таблицу с помощью SQL andirock2112 БД в Delphi 15 11.04.2009 09:15
добавление столбца в массив DeFace Общие вопросы C/C++ 3 09.01.2009 19:29
Вставка столбца в StringGrid artemavd Общие вопросы Delphi 8 29.07.2008 17:48