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 RemoveBricks(cl, ACol+1, ARow);
    if ARow > 0 then
    RemoveBricks(cl, ACol, ARow-1);
    if ARow 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 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 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. Можно так-же сделать так что бы при удалении блока одинакового цвета, квадраты которые находились на верху падали вниз, тем самым заполняли пустое пространство. Но об это я уже рассказывать не буду... думаю вы справитесь сами!

     

    Скачать 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: [email protected]
    Или ICQ: 6016416

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

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