Delphi уроки - создаём простую игру.Часть 2

Опубиковано: 07.01.2009 г., автор: , просмотров: 34592

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

Создадим небольшую процедуру (о том как создавать процедуры я объяснял выше):

procedure RedrawCells;

Полный код этой процедуры будет такой:

procedure TForm1.RedrawCells;
var
i, j : integer;
begin
for i := 0 to Form1.DrawGrid1.ColCount-1 do
for j := 0 to Form1.DrawGrid1.RowCount-1 do
Form1.DrawGrid1DrawCell(Form1, i, j, Form1.DrawGrid1.CellRect(i,j), [])
end;

После этого в OnClicke на кнопке допишите

RedrawCells;

Удаляем блоки квадратов, которые имеют одинаковые цвета:

для этого нужно вернуться в начало и до ключевого слова var написать вот такую строчку:

Const
WALL_COLOR: TColor = clWhite;

Алгоритм следующий: пользователь кликнул по квадрату он удалился (окрасился в белый цвет).

Но что бы удалялся не отдельный квадрат, а сразу блок квадратов имеющие одинаковые цвета нужно создать еще одну процедуру. Логика у неё следующая:

Если квадрат на который мы нажали имеет по крайней мере одного соседа того-же цвета (сосед может быть одним из четырех
кирпичей вокруг него именно: вверх, вниз, влево и вправо. Не по диагонали), то Удалить этот квадрат и Применить этот тоже самое к его соседям того же цвета.

Итак создаем процедуру:

procedure RemoveBricks (cl : TColor; ACol, ARow : integer);

Её полный вид будет такой:

procedure TForm1.RemoveBricks(cl: TColor; ACol, ARow: integer);
begin
if ColorOfBrick[ACol, ARow] <> cl then
exit;
ColorOfBrick[ACol, ARow] := WALL_COLOR;
if ACol > 0 then
RemoveBricks(cl, ACol-1, ARow);
if ACol < Form1.DrawGrid1.ColCount-1 then
RemoveBricks(cl, ACol+1, ARow);
if ARow > 0 then
RemoveBricks(cl, ACol, ARow-1);
if ARow < Form1.DrawGrid1.RowCount-1 then
RemoveBricks(cl, ACol, ARow+1);
end;

После этого создадим вот такую функцию:

function IsBrickAlone(ACol, ARow : integer) : Boolean;

Полностью она выглядит вот так:

function TForm1.IsBrickAlone(ACol, ARow: integer): Boolean;
begin
Result := True;
if ColorOfBrick[ACol, ARow] = WALL_COLOR then
exit;
if ACol > 0 then
if ColorOfBrick[ACol-1, ARow] = ColorOfBrick[ACol, ARow] then
Result := False;
if ACol < Form1.DrawGrid1.ColCount-1 then
if ColorOfBrick[ACol+1, ARow] = ColorOfBrick[ACol, ARow] then
Result := False;
if ARow > 0 then
if ColorOfBrick[ACol, ARow-1] = ColorOfBrick[ACol, ARow] then
Result := False;
if ARow < Form1.DrawGrid1.RowCount-1 then
if ColorOfBrick[ACol, ARow+1] = ColorOfBrick[ACol, ARow] then
Result := False
end;

Вот практически и всё, все дополнительные функции и процедуры мы уже создали, теперь осталось только применить их в нужном месте программы. Для этого создадим событие OnSelectCell на компоненте DrawGrid. между begin end напишите:

if not IsBrickAlone(ACol, ARow) then
begin
RemoveBricks(ColorOfBrick[ACol, ARow], ACol, ARow);
RedrawCells
end

delphi game

Вот теперь точно все, осталось только добавить таймер, который будет вести обратный отчет, если игрок не успел найти все квадраты за указанное время то Game Over. Можно так-же сделать так что бы при удалении блока одинакового цвета, квадраты которые находились на верху падали вниз, тем самым заполняли пустое пространство. Но об это я уже рассказывать не буду... думаю вы справитесь сами!

 

Скачать delphi исходник игры Скачать исходник.

Источник/перевод: http://www.delphi-central.com/tutorials/Bricks_Game.aspx

Спонсором данного урока является сайт: на котором вы можете узнать можно ли мыть голову каждый день

До встречи DelphiExpert.ru !!!



Похожие материалы

Последние из рубрики

дмитрий 20 Jan 2010 в 00:00 #
обьясни мне строчку
Form1.DrawGrid1DrawCell(Form1, i, j, Form1.DrawGrid1.CellRect(i,j), [])
DrawGrid1DrawCell-вот это процедура или после DrawGrid1
точка пропущена
Дмитрий 28 May 2009 в 00:00 #
Ну и что? Подумаешь, опечатка... Что тут такого смешного?
CRASH 28 Mar 2009 в 00:00 #
ха, ха, вы посмотрите там где написано "Автор:" там написано имя не правильно "Владмир"...)))
Михаил 16 Mar 2009 в 00:00 #
Прикольно!

ОтменитьДобавить комментарий