Определение диапазона движения с помощью массива

  • Автор темы ferus
  • 31
  • Обновлено
  • 13, May 2024
  • #1
У меня есть одномерный массив, например:

0, 0, 0, 0, 0, 0, 0,

0, 1, 1, 1, 1, 1, 0,

0, 0, 0, 0, 0, 1, 1,

0, 0, 0, 0, 0, 0, 0,

1, 0, 0, 0, 0, 1, 1,

0, 1, 0, 1, 1, 1, 0,

0, 1, 0, 1, 0, 0, 0,

Легенда: 0 = пустой этаж, 1 = стена, преграждающая путь, 2 = начальная точка, 3 = пол, до которого можно добраться из начальной точки.

Перемещение возможно по горизонтали, вертикали и диагонали, если значение равно 0.

Пример массива карт — 7x7, а примерный диапазон движения — 3, но эти параметры могут быть даже 15x9 с 6.

Я пытаюсь получить одномерный массив, который показывает возможный диапазон перемещения от выбранной точки, как показано ниже (примерный диапазон составляет 3 шага, а диагональ может проходить между стенами, если позиция равна 0, как вы можете видеть в левом нижнем углу):

0, 0, 0, 0, 0, 0, 0,

3, 1, 1, 1, 1, 1, 0,

3, 3, 3, 3, 3, 1, 1,

3, 3, 3, 2, 3, 3, 3,

1, 3, 3, 3, 3, 1, 1,

3, 1, 3, 1, 1, 1, 0,

0, 1, 3, 1, 0, 0, 0,

Это была более простая версия, потому что было бы хорошо, если бы диапазон можно было ограничить указанной формой, которая может отличаться в массиве масок одного измерения, как в этом примере (0 = вне диапазона):

0, 0, 0, 1, 0, 0, 0,

0, 0, 1, 1, 1, 0, 0,

0, 1, 1, 1, 1, 1, 0,

1, 1, 1, 1, 1, 1, 1,

0, 1, 1, 1, 1, 1, 0,

0, 0, 1, 1, 1, 0, 0,

0, 0, 0, 1, 0, 0, 0,

В этом случае результат будет таким:

0, 0, 0, 0, 0, 0, 0,

0, 1, 1, 1, 1, 1, 0,

0, 3, 3, 3, 3, 1, 1,

3, 3, 3, 2, 3, 3, 3,

1, 3, 3, 3, 3, 1, 1,

0, 1, 3, 1, 1, 1, 0,

0, 1, 0, 1, 0, 0, 0,

 

<div id="results" style="font-family: monospace; font-weight: bold; font-size: 24pt; background-color: #000000; color: #FFFFFF;">

</div>

<script>

var map=[0,0,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,1,1,0,0,0,0,0,0,0,1,0,0,0,0,1,1,0,1,0,1,1,1,0,0,1,0,1,0,0,0,];

var mask=[0,0,0,1,0,0,0,0,0,1,1,1,0,0,0,1,1,1,1,1,0,1,1,1,1,1,1,1,0,1,1,1,1,1,0,0,0,1,1,1,0,0,0,0,0,1,0,0,0,];

function path_create(map,width,height,point,range,mask)

{

// map = pure map with 0 as floor and 1 as wall

// width, height = size of map

// point = starting point to calculate movement range

// range = number of moves from starting point to each direction of horizontal, vertical, and diagonal

// mask = (optional) if possible to do, array mask (0 is not in range) can change range for diagonal moves with special shapes like circle or rhombus

var matrix=[];

return matrix;

// one dimension array where 0 is no range, and 1 is ok

}

function path_show(matrix,width,height)

{

var v="";

for(var i=0; i<matrix.length; i++)

{

if(i!=0 && i%7==0){v=v+"<br>";}

v=v+matrix[i]+" ";

}

document.getElementById('results').innerHTML=v;

}

path_show(path_create(map,7,7,25,3,mask));

//path_show(path_create(map,7,7,16,3,mask));

</script>

Код (разметка):

ferus


Рег
21 Jun, 2011

Тем
2

Постов
3

Баллов
23
Тем
49554
Комментарии
57426
Опыт
552966

Интересно