Форум: "Начинающим";
Текущий архив: 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.003 c