Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.03.27;
Скачать: CL | DM;

Вниз

Добавление препятствия в игру или закраска столбца в StringGrid   Найти похожие ветки 

 
Qiwi   (2010-12-29 18:52) [0]

Имеется программа, моделирующая игру "жизнь". Смысл игры в том, что на игровом поле отмечаются "живые" клетки. Затем, следуя 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;


 
Ega23 ©   (2010-12-30 02:04) [1]


> Текст оригинальной программы следующий:

Не надо оригинальной текст, ты давай текст своей.


 
Германн ©   (2010-12-30 02:12) [2]


> ты давай текст своей

А своей пока нет, ИМХО :)


 
RWolf ©   (2010-12-30 10:16) [3]

для начала надо определиться с термином «препятствие».
в этой игре, вообще говоря, ничего никуда не двигается, просто появляются и исчезают клетки — чему препятствовать будем?


 
12 ©   (2010-12-30 11:37) [4]


> 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;

if УСЛОВИЕ_ПРЕПЯТСТВИЯ then brush.color:=clRed

>     fillrect(rect);
>   end;
> end;


 
Curse ©   (2010-12-31 19:11) [5]

Очевидно, нужно хранить карту препятствий в стрингриде. Допустим, если в ячейке будет записано "С", то она свободна, если "П", - то она будет занята препятствием. Когда карта будет набрана, нужно будет обрабатывать событие OnDrawCell, где в зависимости от буквы в ячейке изменять свойства кисти канвы стрингрида.
Почитайте , что такое канва, кисть, перо.
И еще , прежде чем писать код в делфи, напишите на бумажке и оттрассируйте его. Сразу выявятся все логические ошибки.


 
KilkennyCat ©   (2010-12-31 21:31) [6]


> Допустим, если в ячейке будет записано "С", то она свободна,
>  если "П"

достаточно закрашивать. цвет - та же информация.


 
Anatoly Podgoretsky ©   (2010-12-31 21:42) [7]

> KilkennyCat  (31.12.2010 21:31:06)  [6]

С - Свободна
П - Песец


 
Leonid Troyanovsky ©   (2010-12-31 21:51) [8]


> Anatoly Podgoretsky ©   (31.12.10 21:42) [7]

> С - Свободна
> П - Песец

Вот она какая, жизнь по Конвею.

--
Regards, LVT.


 
KilkennyCat ©   (2010-12-31 22:03) [9]

надо две п и П. Большой Песец, когда вокруг не то количество малых песецов


 
Leonid Troyanovsky ©   (2010-12-31 22:23) [10]


> KilkennyCat ©   (31.12.10 22:03) [9]

> надо две п

И пару с.

--
Regards, LVT.


 
Германн ©   (2011-01-01 04:26) [11]


> достаточно закрашивать. цвет - та же информация.

Но не очень удобная для чтения.


 
KilkennyCat ©   (2011-01-01 11:52) [12]


> Германн ©   (01.01.11 04:26) [11]

это же "Жизнь", здесь не чтение, а смотрение.


 
antonn ©   (2011-01-01 17:44) [13]

Закраска на основе текстовых данных в гриде, будет и смотрение.
ЗЫ делал так же в первых крестиках-ноликах, когда знаний было мало для работы с динамическими массивами :)


 
Германн ©   (2011-01-02 02:10) [14]


> KilkennyCat ©   (01.01.11 11:52) [12]
>
>
> > Германн ©   (01.01.11 04:26) [11]
>
> это же "Жизнь", здесь не чтение, а смотрение.
>

Это же "Начинающим". Закрасить ячейку грида мы их научим легко, да и статей на эту тему много. А вот по какому условию их закрашивать в событии "рисование ячейки"?


 
12 ©   (2011-01-02 12:11) [15]


> Не зная что делать, разделил игровое поле пополам, т.е.
> один из столбиков игрового поля, который посередине, теперь
> не реагирует ни на что.


> 12 ©   (30.12.10 11:37) [4]
>
>
> > 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;
>
> if УСЛОВИЕ_ПРЕПЯТСТВИЯ then brush.color:=clRed
>
> >     fillrect(rect);
> >   end;
> > end;
> <Цитата>
>
>


УСЛОВИЕ_ПРЕПЯТСТВИЯ
ACol = > один из столбиков игрового поля



Страницы: 1 вся ветка

Текущий архив: 2011.03.27;
Скачать: CL | DM;

Наверх




Память: 0.52 MB
Время: 0.011 c
2-1293463778
Mitroshin
2010-12-27 18:29
2011.03.27
Возможно ли использовать строку STFilter в TDBGridEh как Edit-ы?


15-1292001237
картман
2010-12-10 20:13
2011.03.27
преобразование длины волны


2-1293532259
NanoTek
2010-12-28 13:30
2011.03.27
Delphi 7


2-1294129298
cross
2011-01-04 11:21
2011.03.27
освобождение памяти под интерфейс


1-1249304962
StriderMan
2009-08-03 17:09
2011.03.27
Plug-in для Delphi