Меню сайта
Форма входа

Категории раздела
Уроки по созданию игр [38]
Программирование игр разной сложности
Игровые алгоритмы [24]
Алгоритмы, которые уже реализованы для разных жанров игр
Графика [5]
Учимся работать с графикой в Делфи
Мультимедиа [3]
Работа с мультимедийными возможностями Делфи
Другие статьи [18]
Статьи не вошедшие не в один из разделов
Ошибки [4]
Всевозможные ошибки и пути их решения
Четверг, 09.01.2025, 06:27
Приветствую Вас Гость

Статьи по программированию

Главная » Статьи » Игровые алгоритмы

Нумерация клеток для Волнового алгоритма для игры (Украина)

Нумерация клеток для Волнового алгоритма для игры от Виталия Соколова (Украина)

 

Все найденные мною в Интернете алгоритмы казались мне большими и сложными для понимания каждого шага. Поэтому я был вынужден изменить алгоритм, чтобы он был компактным, быстрым и надежным. Прошу свою критику оставлять в комментариях – буду учитывать ее обязательно.

 

Итак начнем с моего первого алгоритма на делфи. Написан для демонстрационной программы, в которой смайлик обходит препятствия и доходит до места, где мы кликаем мышкой:

 

//koordinati geroya

x:=strtoint(label1.Caption);

y:=strtoint(label2.Caption);

start.x:=x;

start.y:=y;

 

//rasstanovka vokrug 1

if (map[x-1,y]<>-1) and (x-1>1) then map[x-1,y]:=1;

if (map[x+1,y]<>-1)  and (x+1<8) then map[x+1,y]:=1;

if (map[x,y-1]<>-1)  and (y-1>1) then map[x,y-1]:=1;

if (map[x,y+1]<>-1)  and (y+1<8) then map[x,y+1]:=1;

 

//rasstanovka shagov

n:=1;

while n<=20 do

begin

   for i:=1 to 8 do

   begin

     for j:=1 to 8 do

     begin

        if map[i,j]=n then

        begin

        //esli sleva ne kray karti

        if (map[i-1,j]=0) and (i>1)  then map[i-1,j]:=n+1;

        //esli sprava ne kray karti

        if (map[i+1,j]=0)  and (i<8) then map[i+1,j]:=n+1;

        //esli sverhu ne kray karti

        if (map[i,j-1]=0)  and (j>1) then map[i,j-1]:=n+1;

        //esli snizu ne kray karti

        if (map[i,j+1]=0)  and (j<8) then map[i,j+1]:=n+1;

        end;

     end;

   end;

n:=n+1;

end;

 

Место героя отмечаем нулем

map[x,y]:=0;

 

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

 

procedure Put;

  var n,i,j,z,x:Integer;

  begin

 

    //начальное обнуление

    for i:=1 to 20 do

    for j:=1 to 20 do

    Begin

      //отмечаем непроходимы участки (деревья, другие человечки и тд)

      if map[i,j]<0 then Hmap[i,j]:=-1

      //отмечаем проходимые участки

      else Hmap[i,j]:=0;

    end;

 

    //Отмечаем место с человечком

    Hmap[Play.x,Play.y]:=99;

    //На соседних клетках ставим единицы потому что мы до них доберемся за один ход если они не заняты

          for i:=Play.x-1 to Play.x+1 do

          for j:=Play.y-1 to Play.y+1 do

          if (Hmap[i,j]>-1) and (Hmap[i,j]<>99) then Hmap[i,j]:=1;

 

 

    //Проставляем цифры (за сколько ходоа мы дойдем до точки)

    n:=1;

    while (n<=100) do

    begin

      for i:=1 to Xmap do

      for j:=1 to Ymap do

        if Hmap[i,j]=n then

        begin

          for z:=i-1 to i+1 do

          for x:=j-1 to j+1 do

          begin

          if (z>0) and (z<=Xmap) and (x>0) and (x<=Ymap) and (Hmap[z,x]=0) then

          Hmap[z,x]:=n+1;

          end;

        end;

    n:=n+1;

    end;

 

Останется сделать только алгоритм, который выберит кратчайший путь и все. Если Вы хотите запретить хождение по диагоналям героям или замедлить скорость движения по диагоналям, то алгоритм нужно будет немного изменить. Если кому-то это интерестно – пишите и я создам стать. Всем удачи!

 

Источник Delgame.at.ua

Категория: Игровые алгоритмы | Добавил: Armageddets (04.07.2013) | Автор: Нумерация клеток для Волнового алго
Просмотров: 1228 | Теги: нумерация, делфи, ячейки, клетки, волновой алгоритм, Delphi | Рейтинг: 0.0/0
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.
[ Регистрация | Вход ]
Наш опрос
Какие уроки по созданию игр Вам удобнее?
Всего ответов: 141
Мини-чат
Друзья сайта
  • Официальный блог
  • Сообщество uCoz
  • FAQ по системе
  • Инструкции для uCoz
  • Статистика

    Онлайн всего: 1
    Гостей: 1
    Пользователей: 0