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



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

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

a 31 May 2020 в 01:50 #
Подскажите как сделать чтобы они падали в низ очень нужно =)
Andry 08 Jun 2013 в 00:00 #
Подскажите как сделать чтобы они падали в низ очень нужно =)
Олег 13 Oct 2011 в 00:00 #
ВОПРОС, как сделать так чтобы закрашенные ячейки опускались в низ и слаживались там при убирании отдельных блоков с одинаковыми цветаим, тчобы допутсим игру было релаьно пройти =)

Если возможно свяжитесь со мной по email: dj.psybaks@gmail.com
Или ICQ: 6016416

ОЧень хочется доделать до конца полноценную игру =)
Zudoariri 10 Aug 2011 в 00:00 #
Урок довольно отличный: все понятно и доступно описано.
Если не хватает знаний для чего-то, то лучше почитать соответствующую литературу, например об объекте DrowGrid.
Простой копи-паст кода здесь не уместен, тк как тогда сложно понять некоторые моменты, например рекурсия в процедуре RemoveBricks.
Evgen 21 Jul 2011 в 00:00 #
Вот если бы они еще падали было бы совсем замечательно, а так это даже игрой назвать сложно... не выиграть, не проиграть.
PS: комментариев мало!!! Если пишешь код, поясняй! А так можно было вообще сразу исходник выложить и все...

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