Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2011.03.27;
Скачать: [xml.tar.bz2];

Вниз

Добавление препятствия в игру или закраска столбца в 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.004 c
15-1292331262
sosed47
2010-12-14 15:54
2011.03.27
Ошибка пакета компонентов


1-1250980688
Ruzzz
2009-08-23 02:38
2011.03.27
Класс настроек и сохранение/загрузка XML


15-1290889921
set
2010-11-27 23:32
2011.03.27
Атрибуты на папках


3-1255678695
Lanu
2009-10-16 11:38
2011.03.27
Подключение ODAC


15-1291975147
zlobniy
2010-12-10 12:59
2011.03.27
свой borderstyle окна





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский