Мы научились заполнять игровое поле квадратами разного цвета, осталось только научиться удалять квадраты одинакового цвета, этим сейчас и займемся.
Создадим небольшую процедуру (о том как создавать процедуры я объяснял выше):
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
Вот теперь точно все, осталось только добавить таймер, который будет вести обратный отчет, если игрок не успел найти все квадраты за указанное время то Game Over. Можно так-же сделать так что бы при удалении блока одинакового цвета, квадраты которые находились на верху падали вниз, тем самым заполняли пустое пространство. Но об это я уже рассказывать не буду... думаю вы справитесь сами!
Источник/перевод: http://www.delphi-central.com/tutorials/Bricks_Game.aspx
Спонсором данного урока является сайт: на котором вы можете узнать можно ли мыть голову каждый день
До встречи DelphiExpert.ru !!!
Похожие материалы
- Delphi уроки - создаём простую игру.Часть 1
- Сохраняем StringGrid в файл
- Исходник электронной анкеты
- PSD Delphi String Protect - защити свою программу!
- Непонятные файлы. Откуда ?
Последние из рубрики
- Delphi уроки - Запрещаем форме уезжать за пределы экрана
- Ураааа 2009 !!!
- Delphi уроки - создаём простую игру.Часть 1