DevBlog 002. SCP 2844. Карта и перемещение юнитов. Часть 1Собственно, так получилось что прогресс в / gamedev :: adminguide :: devblog :: 2844 :: Игры :: geek (Прикольные гаджеты. Научный, инженерный и айтишный юмор)

2844 geek devblog adminguide песочница gamedev Игры 

DevBlog 002. SCP 2844. Карта и перемещение юнитов. Часть 1

2844,geek,Прикольные гаджеты. Научный, инженерный и айтишный юмор,devblog,adminguide,песочница,gamedev,Игры


Собственно, так получилось что прогресс в разработке зашёл чуть дальше чем прогресс в освещении разработки, а задокументировать достигнутые результаты всё же хочется, потому пока есть время перед работой, я катаю второй пост за день :). Пока писал, совсем неожиданно для меня первый пост уже вышел из чистилища, и я уже даже получил первую обратную связь и советы. Спасибо большое за отзывы!

В прошлом посте я описал какая примерно у меня планируется тестовая карта. 25х25 поле в спредшите.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 В с D Е F G H i J к L M N 0 P Q R s T U V U

На данный момент мне уже удалось чуть-чуть это поле оживить. Текущая цель - научить "игру" находить путь между точками А и B в двумерном пространстве, с учётом препятствий. Есть много всяких разных алгоритмов поиска пути, эффективных и не очень, но на мой взгляд самым нативно понятным и доступным в реализации алгоримом является "Волновой Алгоритм Поиска Пути".

Я к несчастью самоучка, и когда я учился увы небыло никаких учебных материалов кроме находящейся в зачаточном состоянии википедии, о которой знал то далеко не каждый и сухих каких-то учебников и прочего. Цензуры кстати тоже небыло. Светлое ламповое время зачаточного интернета по карточкам и гостевых книг, даже форумы считались прям вообще редкостью и признаком ылитарности. Таких вещей как "О ГОСПАДИ КУРС ПО <подставить_любую_тему> ОНЛАЙН! СТАНЬ СПЕЦИАЛИСТОМ ВСЕГО ЗА <подставить_желаемый_срок>. БЕЗ ПРЕДОПЛАТЫ \ В КРЕДИТ \ ПЛАТИ ПОСЛЕ ТРУДОУСТРОЙСТВА \ БЕСПЛАТНО", небыло не то что и в помине, а те кто реализовал первые их варианты, вероятно ещё так же как я страдали от отсутствия каких-то материалов для обучения. А на практически любые вопросы на тематических страницах и форумах в ответ обоссывали. Потому вероятнее всего как последствие детских душевных травм, я всё стараюсь оформить как некие учебный материал или пособие. Чтобы если кто-то захочет пройти мой путь, у него были какие-то готовые подсказки, потому не обессутьте, ниже вас ждёт стена текста.

Wall of text hit you for over 9000 Holy Damage

Ну и описываю я всё так, как было бы понятно мне самому, тоесть для дибилов, с деменцией и памятью как у аквариумной рыбки.

Волновой Алгоритм Поиска Пути

Суть этого алгоритма заключается в том, что мы обозначаем откуда мы хотим найти путь и куда мы хотим попасть в рамках двумерного массива. И в случае с таблицами, нам достаточно представить игровое поле на скрине выше как двумерный массив, коим оно и является, где по оси Y у нас имеется 25 строк с номерами от 0 до 24, и в каждой строке есть 25 колонок по оси X, с номерами от 0 до 25. В виду специфики спредшитов, и отсутствия у меня желания переворачивать массив делая так называемый transpose, я везде буду использовать координаты исходя из того что в координатной паре, Y стоит на первом месте, а X на втором. Тоесть Y,X, в отличии от привычных всем X,Y. Запись 13,17 будет означать 13 по Y, 17 по X. Y - вертикальная шкала (справа), X - горизонтальная (снизу)

В случае со спредшитами, чтобы начать работать с таким массивом, нам достаточно в переменную например map, считать диапазон "A1:Y25". В этом случае мы получим массив размером от map[0][0] до map[24][24], забитый пустыми значениями, кроме следующих позиций:
Юнит с обозначением U будет находиться в map[1][1]
Ресурс с обозначением Res, будет находиться в map[13][17]
База с обозначением B, будет находиться в map[14][3]

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 С D Е F G H i J K L M N 0 P Q R s T U V w X Y Z 0 I □ 2 3

Тоесть в случае, если необходимо найти путь между U находящимся в map[1][1] до Res, находящимся в map[13][17], для начала, нам необходимо последовательно распространить волну вычислений от U до Res.

Распространение волны от U до Res

Нулевым шагом будет сканирование всего массива данных по Y и X на предмет наличия в ячейке значения U. Как только это значение будет найдено, необходимо проверить всё в радиусе одной ячейки от U на предмет возможости совершить первый ход. Чтоо в данном случае будет проще рассмотреть на более маленьком поле, например 7х7

Пусть выдуманное поле выглядит вот так

 q 0 и q Res 1 q 2 q q q 3 4 q 5 q 6 0 1 2 3 4 5 6,2844,geek,Прикольные гаджеты. Научный, инженерный и айтишный юмор,devblog,adminguide,песочница,gamedev,Игры

q - Это стена, куда нельзя сделать шаг

Тогда когда мы найдём U и проскаируем все соседний ячейки куда можно сделать первый шаг и разметим их, наше поле станет выглядеть следующим образом.
Шаг 0. Из U мы считаем куда мы можем шагнуть в Шаг 1.

1 1 q 0 1 и q Res 1 1 1 q 2 q q q 3 4 q 5 q 6 0 1 2 3 4 5 6,2844,geek,Прикольные гаджеты. Научный, инженерный и айтишный юмор,devblog,adminguide,песочница,gamedev,Игры

Следующим шагом мы должны просканировать всё поле на предмет наличия там следов первого шага. И проверить все на наличие там Res и пустые клетки вокруг каждой единицы, и те куда можно сделать шаг, отметить цифрой 2, так как это будет уже второй шаг. И так мы должны сканировать каждый новый шаг, находя цифры предыдущего шага, проверять возде них все соседние пустые клетки куда можно сделать шаг и вписывать туда число текущего шага.

При этом, рассчитывая куда мы можем шагнуть возле каждой текущей проверяемой цифры, мы проверяем не только можем ли мы туда сделать шаг, а ещё нет ли случаем там нашей цели Res

Шаг 1. Из 1 мы считаем куда мы можем шагнуть в Шаг 2.

1 1 q 0 1 U q Res 1 1 1 q 2 2 2 q q q 3 4 q 5 q 6 0 1 2 3 4 5 6,2844,geek,Прикольные гаджеты. Научный, инженерный и айтишный юмор,devblog,adminguide,песочница,gamedev,Игры

Шаг 2. Из 2 мы считаем куда мы можем шагнуть в Шаг 3.

1 1 q 0 1 U q Res 1 1 1 q 2 2 2 q q q 3 3 3 3 4 q 5 q 6 0 1 2 3 4 5 6,2844,geek,Прикольные гаджеты. Научный, инженерный и айтишный юмор,devblog,adminguide,песочница,gamedev,Игры

Шаг 3. Из 3 мы считаем куда мы можем шагнуть в Шаг 4.

1 1 q 0 1 U q Res 1 1 1 q 2 2 2 q q q 3 3 3 3 4 4 4 4 4 q 5 q 6 0 1 2 3 4 5 6,2844,geek,Прикольные гаджеты. Научный, инженерный и айтишный юмор,devblog,adminguide,песочница,gamedev,Игры

Шаг 4. Из 4 мы считаем куда мы можем шагнуть в Шаг 5.

1 1 q 0 1 U q Res 1 1 1 q 2 2 2 q q q 3 3 3 3 4 5 4 4 4 4 q 5 5 5 5 5 q 6 0 1 2 3 4 5 6,2844,geek,Прикольные гаджеты. Научный, инженерный и айтишный юмор,devblog,adminguide,песочница,gamedev,Игры

Шаг 5. Из 5 мы считаем куда мы можем шагнуть в Шаг 6.

1 1 q 0 1 U q Res 1 1 1 q 2 2 2 q q q 6 3 3 3 3 4 5 6 4 4 4 4 q 5 6 5 5 5 5 q 6 6 0 1 2 3 4 5 6,2844,geek,Прикольные гаджеты. Научный, инженерный и айтишный юмор,devblog,adminguide,песочница,gamedev,Игры

Шаг 6. Из 6 мы считаем куда мы можем шагнуть в Шаг 7.

1 1 q 0 1 U q Res 1 1 1 q 7 7 7 2 2 2 q q q 6 7 3 3 3 3 4 5 6 7 4 4 4 4 q 5 6 7 5 5 5 5 q 6 7 6 0 1 2 3 4 5 6,2844,geek,Прикольные гаджеты. Научный, инженерный и айтишный юмор,devblog,adminguide,песочница,gamedev,Игры

Шаг 7. Из 7 мы считаем куда мы можем шагнуть в Шаг 8.

Но на этом этапе, сканируя поле сверху в низ, перебирая строки, и в каждой строке перебирая поколоночно слева направо ячейки на наличие цифры 7, чтобы рассчитать 8й шаг, мы находим первую семёрку. Относительно этой семёрки мы начинаем проверять слева сверху вправо вниз каждую соседнюю ячейку, и так получилось что прямо слева сверху этой семёрки, мы находим нашу цель Res. Дальше рассчёты мы не ведём. Волна была пущена и достигла своей цели.

Поиск пути в волне

Мы пустили волну от U и она дошла до Res. Теперь внутри этой волны нам нужно найти путь. Но если мы начнём считать путь от U, то на этапе рассчёта куда можно шагнуть из U, мы сразу же получим кучу вариантов, и многие из них будут неправильными. Потому чтобы искать путь, мы должны вести рассчёты в обратном напавлении. от Res до U. Но теперь нам будет проще.

Мы знаем координаты Res т.к. мы уже нашли Res в ходе распространения волны. Поиск маршрута мы начинаем от Res.

Шаг 7. Мы ищем вокруг Res минимальную цифру или U
Так как вокруг Res кроме 7 вообще нет никаких цифр, мы отмечаем 7 как шаг следующий шаг.

1 1 q 0 1 U q Res 1 1 1 q 7 7 7 2 2 2 q q q 6 7 3 3 3 3 4 5 6 7 4 4 4 4 q 5 6 7 5 5 5 5 q 6 7 6 0 1 2 3 4 5 6,2844,geek,Прикольные гаджеты. Научный, инженерный и айтишный юмор,devblog,adminguide,песочница,gamedev,Игры

Шаг 6. Мы ищем вокруг 7 минимальную цифру или U

1 1 q 0 1 U q Res 1 1 1 q 7 7 7 2 2 2 q q q 6 7 3 3 3 3 4 5 6 7 4 4 4 4 q 5 6 7 5 5 5 5 q 6 7 6 0 1 2 3 4 5 6,2844,geek,Прикольные гаджеты. Научный, инженерный и айтишный юмор,devblog,adminguide,песочница,gamedev,Игры



Шаг 5. Мы ищем вокруг 6 минимальную цифру или U

1 1 q 0 1 U q Res 1 1 1 q 7 7 7 2 2 2 q q q 6 7 3 3 3 3 4 5 6 7 4 4 4 4 q 5 6 7 5 5 5 5 q 6 7 6 0 1 2 3 4 5 6,2844,geek,Прикольные гаджеты. Научный, инженерный и айтишный юмор,devblog,adminguide,песочница,gamedev,Игры

Шаг 4. Мы ищем вокруг 5 минимальную цифру или U

1 1 q 0 1 U q Res 1 1 1 q 7 7 7 2 2 2 q q q 6 7 3 3 3 3 4 5 6 7 4 4 4 4 q 5 6 7 5 5 5 5 q 6 7 6 0 1 2 3 4 5 6,2844,geek,Прикольные гаджеты. Научный, инженерный и айтишный юмор,devblog,adminguide,песочница,gamedev,Игры

Шаг 3. Мы ищем вокруг 4 минимальную цифру или U

1 1 q 0 1 U q Res 1 1 1 q 7 7 7 2 2 2 q q q 6 7 3 3 3 3 4 5 6 7 4 4 4 4 q 5 6 7 5 5 5 5 q 6 7 6 0 1 2 3 4 5 6,2844,geek,Прикольные гаджеты. Научный, инженерный и айтишный юмор,devblog,adminguide,песочница,gamedev,Игры

Шаг 2. Мы ищем вокруг 3 минимальную цифру или U

1 1 q 0 1 U q Res 1 1 1 q 7 7 7 2 2 2 q q q 6 7 3 3 3 3 4 5 6 7 4 4 4 4 q 5 6 7 5 5 5 5 q 6 7 6 0 1 2 3 4 5 6,2844,geek,Прикольные гаджеты. Научный, инженерный и айтишный юмор,devblog,adminguide,песочница,gamedev,Игры

Шаг 1. Мы ищем вокруг 2 минимальную цифру или U

1 1 q 0 I 1 U q Res 1 1 1 q 7 7 7 2 Г 2 2 q q q 6 7 3 3 3 3 4 5 6 7 4 4 4 4 q 5 6 7 5 5 5 5 q 6 7 6 0 1 2 3 4 5 6,2844,geek,Прикольные гаджеты. Научный, инженерный и айтишный юмор,devblog,adminguide,песочница,gamedev,Игры

Шаг 0. Мы ищем вокруг 1 минимальную цифру или U

1 1 q 0 1 U ] q Res 1 1 1 q 7 7 7 2 2 2 q q q 6 7 3 3 3 3 4 5 6 7 4 4 4 4 q 5 6 7 5 5 5 5 q 6 7 6 0 12 3 4 5 6,2844,geek,Прикольные гаджеты. Научный, инженерный и айтишный юмор,devblog,adminguide,песочница,gamedev,Игры

U найдено, на этом этапе в теории у нас есть всё необходимое для того чтобы получить маршрут от U до Res.

Но на словах всё просто, а на деле чуть-чуть не получилось. Написанный код зацикливается на 2м этапе

2 2 2 2 2 2 2 2 2 2 2 2 2 О Res 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 2 2 2 2 2 2 2 2 2 2 1 U 1 2 2 2 2 2 2 2 2 2 2 1 В 1 2 2 2 2 2

так что продолжать я буду уже потом :)

Продолжение следует :)


Подробнее

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 В с D Е F G H i J к L M N 0 P Q R s T U V U Res В 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 С D Е F G H i J K L M N 0 P Q R s T U V w X Y Z 0 I □ 2 3 4 5 6 7 8 9 10 11 ÍReí 12 m Ici FM 'Ш 15 16 17 18 19 20 21 22 23 24 Li Li 5 6 7 8 9 10 11 12 13 14 15 2£ 21 19 20 21 22 23 24 25
 q 0 и q Res 1 q 2 q q q 3 4 q 5 q 6 0 1 2 3 4 5 6
1 1 q 0 1 и q Res 1 1 1 q 2 q q q 3 4 q 5 q 6 0 1 2 3 4 5 6
1 1 q 0 1 U q Res 1 1 1 q 2 2 2 q q q 3 4 q 5 q 6 0 1 2 3 4 5 6
1 1 q 0 1 U q Res 1 1 1 q 2 2 2 q q q 3 3 3 3 4 q 5 q 6 0 1 2 3 4 5 6
1 1 q 0 1 U q Res 1 1 1 q 2 2 2 q q q 3 3 3 3 4 4 4 4 4 q 5 q 6 0 1 2 3 4 5 6
1 1 q 0 1 U q Res 1 1 1 q 2 2 2 q q q 3 3 3 3 4 5 4 4 4 4 q 5 5 5 5 5 q 6 0 1 2 3 4 5 6
1 1 q 0 1 U q Res 1 1 1 q 2 2 2 q q q 6 3 3 3 3 4 5 6 4 4 4 4 q 5 6 5 5 5 5 q 6 6 0 1 2 3 4 5 6
1 1 q 0 1 U q Res 1 1 1 q 7 7 7 2 2 2 q q q 6 7 3 3 3 3 4 5 6 7 4 4 4 4 q 5 6 7 5 5 5 5 q 6 7 6 0 1 2 3 4 5 6
1 1 q 0 1 U q Res 1 1 1 q 7 7 7 2 2 2 q q q 6 7 3 3 3 3 4 5 6 7 4 4 4 4 q 5 6 7 5 5 5 5 q 6 7 6 0 1 2 3 4 5 6
1 1 q 0 1 U q Res 1 1 1 q 7 7 7 2 2 2 q q q 6 7 3 3 3 3 4 5 6 7 4 4 4 4 q 5 6 7 5 5 5 5 q 6 7 6 0 1 2 3 4 5 6
1 1 q 0 1 U q Res 1 1 1 q 7 7 7 2 2 2 q q q 6 7 3 3 3 3 4 5 6 7 4 4 4 4 q 5 6 7 5 5 5 5 q 6 7 6 0 1 2 3 4 5 6
1 1 q 0 1 U q Res 1 1 1 q 7 7 7 2 2 2 q q q 6 7 3 3 3 3 4 5 6 7 4 4 4 4 q 5 6 7 5 5 5 5 q 6 7 6 0 1 2 3 4 5 6
1 1 q 0 1 U q Res 1 1 1 q 7 7 7 2 2 2 q q q 6 7 3 3 3 3 4 5 6 7 4 4 4 4 q 5 6 7 5 5 5 5 q 6 7 6 0 1 2 3 4 5 6
1 1 q 0 1 U q Res 1 1 1 q 7 7 7 2 2 2 q q q 6 7 3 3 3 3 4 5 6 7 4 4 4 4 q 5 6 7 5 5 5 5 q 6 7 6 0 1 2 3 4 5 6
1 1 q 0 I 1 U q Res 1 1 1 q 7 7 7 2 Г 2 2 q q q 6 7 3 3 3 3 4 5 6 7 4 4 4 4 q 5 6 7 5 5 5 5 q 6 7 6 0 1 2 3 4 5 6
1 1 q 0 1 U ] q Res 1 1 1 q 7 7 7 2 2 2 q q q 6 7 3 3 3 3 4 5 6 7 4 4 4 4 q 5 6 7 5 5 5 5 q 6 7 6 0 12 3 4 5 6
2 2 2 2 2 2 2 2 2 2 2 2 2 О Res 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 1 1 2 2 2 2 2 2 2 2 2 2 1 U 1 2 2 2 2 2 2 2 2 2 2 1 В 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2I 2l 2 2 2 2 2 2 2 2 2 2 2 2 * 2 т 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 1 2 3 4 5 6 7 8 9 10 11 12 13 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 14 15 16 17 18 19 0 1 2 3 4 5 6 7 8 9 10 2 2 2 2 11 2 2 2 2 12 2 2 2 2 13 2 2 2 2 14 2 2 2 2 15 2 2 2 2 16 2 2 2 2 17 2 2 2 2 18 2 2 2 2 19 2 2 2 2 20 2 2 2 2 21 2 2 2 2 22 2 2 2 2 23 2 2 2 2 24 21 22 23 24 25 2 2 2 2 2 2 2 2 2 2 2 2 2 2 20
2844,geek,Прикольные гаджеты. Научный, инженерный и айтишный юмор,devblog,adminguide,песочница,gamedev,Игры
Еще на тему
Развернуть
Видать я что-то не то сделал, я думал оно появится в чистилище :(
Если цель - именно запилить игру, а не словить максимум фана с разработки, я бы порекомендовал по-максимуму переиспользовать реализованные в движке алгоритмы. Кажется, поиск пути должен быть в готовом виде где-то.
Конечно когда дело дойдёт до юнити так и будет сделано. Просто чтобы переходить к юнити, нужно понять имеет ли это смысл вообще. А чтобы это понять - проще сначала по быстренькому запилить некое подобие MVP игры в спредшитсах, т.к. на изучения юнити так или иначе у меня уйдёт больше времени :(
Только зарегистрированные и активированные пользователи могут добавлять комментарии.
Похожие темы

Похожие посты
дафкЗадЧЭ [Разработчик] Игра активно обновляется и дорабатывается, проект находится в Бета версии и до Альфа осталось немного. Скачивайте, играйте, наслаждайтесь)
подробнее»

it-юмор geek,Прикольные гаджеты. Научный, инженерный и айтишный юмор Разработка игр Игры Steam,Стим регресс

дафкЗадЧЭ [Разработчик] Игра активно обновляется и дорабатывается, проект находится в Бета версии и до Альфа осталось немного. Скачивайте, играйте, наслаждайтесь)
анализ классической игры Entombed для игровой приставки Atari 2600. Механика этой игры, выпущенной в 1982, крайне проста: археолог, управляемый игроком, должен пробраться по прокручивающимся снизу вверх катакомбам, уворачиваясь от зомби. У Atari 2600 было всего 128 байт ОЗУ; тем не менее, кажущийс
подробнее»

it-юмор geek,Прикольные гаджеты. Научный, инженерный и айтишный юмор программирование Разработчики игр Игры gamedev алкоголизм

анализ классической игры Entombed для игровой приставки Atari 2600. Механика этой игры, выпущенной в 1982, крайне проста: археолог, управляемый игроком, должен пробраться по прокручивающимся снизу вверх катакомбам, уворачиваясь от зомби. У Atari 2600 было всего 128 байт ОЗУ; тем не менее, кажущийс