Вторник, 30.04.2024
Королевство Delphi
Главное меню
Статьи
Наш опрос
Нравится раздел статьи?
Всего ответов: 68
Статистика
Онлайн всего: 1
Гостей: 1
Пользователей: 0
Форма входа
Главная » Статьи » Графика » Игры

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

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

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

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. Можно так-же сделать так что бы при удалении блока одинакового цвета, квадраты которые находились на верху падали вниз, тем самым заполняли пустое пространство. Но об это я уже рассказывать не буду... думаю вы справитесь сами!

 

Скачать исходник.

Получить ссылку на материал

Категория: Игры | Добавил: Барон (15.12.2011)
Просмотров: 1963 | Теги: игра | Рейтинг: 0.0/0
[ Пожертвования для сайта ] [ Пожаловаться на материал ]

Если вам помог материал сайта кликните по оплаченной рекламе размещенной в центре

Поиск
Категории раздела
DirectX [17]
OpenGL [2]
Игры [15]
Разные [28]
Королевство Delphi © 2010-2024
Яндекс цитирования