Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > разработка игр, графический дизайн и моделирование > Gamedev - cоздание игр: Unity, OpenGL, DirectX
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 02.02.2022, 21:54   #31
Timurkh77
Форумчанин
 
Регистрация: 16.02.2013
Сообщений: 149
По умолчанию

Здесь измененная программа.
Вложения
Тип файла: rar pacmana2.rar (441.9 Кб, 1 просмотров)
Timurkh77 вне форума Ответить с цитированием
Старый 02.02.2022, 21:58   #32
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Чего именно вы пытались добиться, добавляя k и l? Сейчас получается, например, если клетка сверху свободна, то снизу будет проверяться не соседняя клетка, а через одну.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 02.02.2022, 22:55   #33
Timurkh77
Форумчанин
 
Регистрация: 16.02.2013
Сообщений: 149
По умолчанию

Как же для первоначальной версии сделать Алгоритм Ли на C , чтобы идти по всему полю.В интернете
алгоритм написан математически,не на C.
Timurkh77 вне форума Ответить с цитированием
Старый 03.02.2022, 00:14   #34
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Цитата:
Сообщение от Timurkh77 Посмотреть сообщение
В интернете
алгоритм написан математически,не на C.
Вторая ссылка в поиске ведет на подходящий пример реализации - Реализации алгоритмов/Алгоритм Ли.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 03.02.2022, 16:23   #35
Timurkh77
Форумчанин
 
Регистрация: 16.02.2013
Сообщений: 149
По умолчанию

Непонял выбираем одну из клеток,если помечены все клетки , а если нам встретилась помеченная
клетка,то мы выбираем первую помеченную и выходим оператором break, а остальные пути не рассматриваем?
for(k= 0; k < 4; ++k)
{
int iy=y + dy[k], ix = x + dx[k];
if ( iy >= 0 && iy < H && ix >= 0 && ix < W &&
grid[iy][ix] == d)
{
x = x + dx[k];
y = y + dy[k]; // переходим в ячейку, которая на 1 ближе к старту
break;
}
}
Не совсем понял как помечаются массивы dx[4] и dy[4]

Предположим мы нашли путь в px[d] и py[d] и его длину в d , как это использовать в программе ,
чтобы двигаться по полю.
Timurkh77 вне форума Ответить с цитированием
Старый 03.02.2022, 20:14   #36
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Цитата:
Сообщение от Timurkh77 Посмотреть сообщение
мы выбираем первую помеченную и выходим оператором break, а остальные пути не рассматриваем?
Если существует несколько кратчайших путей, то алгоритм восстановит один из них случайным образом (а точнее, тот, чьи клетки раньше упоминаются в dx, dy).
Цитата:
Сообщение от Timurkh77 Посмотреть сообщение
Не совсем понял как помечаются массивы dx[4] и dy[4]
А они не помечаются. В них хранятся смещения, чтобы не делать 4 ифа, как в вашем текущем коде, а чтобы делать проверку соседних клеток в цикле.
Цитата:
Сообщение от Timurkh77 Посмотреть сообщение
Предположим мы нашли путь в px[d] и py[d] и его длину в d , как это использовать в программе ,
чтобы двигаться по полю.
Допустим, построить путь в начале работы программы и иметь счетчик шагов. Брать координаты клетки из px, py и изменять счетчик шагов на единицу. Когда достигли последней клетки в пути, то построить новый путь до другой клетки.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 05.02.2022, 20:37   #37
Timurkh77
Форумчанин
 
Регистрация: 16.02.2013
Сообщений: 149
По умолчанию

Как выбирать начальную и конечную точку в каждом проходе?Как их помечать ' ' или '.'.
Timurkh77 вне форума Ответить с цитированием
Старый 05.02.2022, 23:04   #38
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Цитата:
Сообщение от Timurkh77 Посмотреть сообщение
Как выбирать начальную и конечную точку в каждом проходе?
Самую первую начальную точку для противника можно задавать самому, как сейчас. А конечную как хотите: можно брать случайную точку с карты, проверяя, что координаты не совпали с начальной и клетка пустая; можно выбирать случайную точку, где есть звездочка. А когда маршрут пройден, то конечная точка становится начальной, а конечная выбирается заново.
Цитата:
Сообщение от Timurkh77 Посмотреть сообщение
Как их помечать ' ' или '.'.
А зачем их помечать? Координаты начальной и конечной точек нужно передать функции, которая построит маршрут. А для алгоритма Ли нужен отдельный массив, где для каждой клетки будет указан номер шага, на котором эта клетка достижима из изначальной клетки.

Как еще одна идея. Можно сначала строить волну на всё поле, а затем выбрать ту из зведочек, до которой путь короче, потом уже строить маршрут до неё и идти к ней.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 06.02.2022, 17:02   #39
Timurkh77
Форумчанин
 
Регистрация: 16.02.2013
Сообщений: 149
По умолчанию

Можно написать так?

Код:
void EvTimer(UINT)
{

static int i2=14;static int j2=19;
static int ax=i2;
static int ay=j2;

int bx,by;


bx=rand()%N;
by=rand()%M;

if((ax!=bx &&ay!=by)&&m[bx][by]==' ')
 {
   p=lee(ax,ay,bx,by);
 }

if(p)
{
  int s;
  s=0;
  px[s]=ax;
  py[s]=ay;
  
  while(s<d)
    {
      bitmapEnemy.x=j2*20+2;
      bitmapEnemy.y=i2*20+2;

       s++;

       i2=px[s];
       j2=py[s];
       
       Invalidate(FALSE);
      }
  }

ax=bx; ay=by;

}

Последний раз редактировалось BDA; 07.02.2022 в 00:00.
Timurkh77 вне форума Ответить с цитированием
Старый 07.02.2022, 00:08   #40
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Сейчас у вас проход по маршруту проходит целиком за один тик таймера. От цикла "while(s < d)" надо отказаться. А нужно примерно так: если маршрут есть, то сделать шаг по нему; если маршрута нет, то построить его и сделать шаг. Выбор координат bx и by нужно производить до тех пор, пока они не удовлетворят условию в вашем if, а сейчас получается, что туда переход все равно осуществится.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Проблема с загрузкой звука в игре типа Pacman Timurkh77 Gamedev - cоздание игр: Unity, OpenGL, DirectX 12 13.09.2018 05:23
Графическая ошибка в игре типа Pacman Timurkh77 Gamedev - cоздание игр: Unity, OpenGL, DirectX 2 18.08.2018 22:08
Какие знания по php и mysql нужно иметь, что бы в игре сделать такой бой в онлайн текстовой игре jonikster Общие вопросы Web 4 15.06.2016 18:10
Интеллект компьютера в игре покер на костях Pepsy Общие вопросы C/C++ 1 06.04.2013 21:17
Зависание игры после отбивания шара (TShape) противником (Delphi) alex 2000 Помощь студентам 0 06.02.2012 13:47