我正在开发一款基于N×M方格板的2D游戏(实际上是N×N,因为它是正方形)。董事会中的每个方格都有一个ID,从ID 0
开始,从左到右,从上到下依次计数。
示例,对于10 x 10
的电路板| 0 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 27 28 29 |
| etc |
| etc |
| etc |
| etc |
| etc |
我想要一个函数,它取一个网格的大小(N
)和一个象限([0, 1, 2, 3]
中的一个对应于左上角,右上角,左下角,底部-right),返回每个象限中元素的ID。例如,getQuadrant(10, 0)
将返回左上象限中的ID:
[0, 1, 2, 3, 4, 10, 11, 12, 13, 14, 20, 21, 22, 23, 24... 44]
我尝试过几个序列求解器来找到一个等式,但是他们无法找到匹配。我提出的唯一可行的解决方案是象限依赖,这意味着我基本上有4个功能。
答案 0 :(得分:2)
您可以使用for
循环创建此类函数,其中i按网格长度递增。然后你只需要根据象限参数切割网格的前半部分或后半部分。
var data = Array.from(Array(100), (e, i) => e = i)
function getQuadrant(data, n, quad) {
var result = []
for (var i = 0; i < data.length; i += n) {
var p = i + (n / 2)
if (quad == 0 && i < data.length / 2) result.push(...data.slice(i, p))
if (quad == 1 && i < data.length / 2) result.push(...data.slice(p, i + n))
if (quad == 2 && i >= data.length / 2) result.push(...data.slice(i, p))
if (quad == 3 && i >= data.length / 2) result.push(...data.slice(p, i + n))
}
return result
}
console.log(JSON.stringify(getQuadrant(data, 10, 0)))
console.log(JSON.stringify(getQuadrant(data, 10, 1)))
console.log(JSON.stringify(getQuadrant(data, 10, 3)))
&#13;
答案 1 :(得分:2)
<强>要点:强>
以下表达式求值为象限n
中n
x quad
平方的id数组:
Array.from({length: n * n / 4}).map((_,i) =>
2 * i - i % (n / 2) + (quad % 2) * n / 2 + (quad > 1) * n * n / 2
)
<强>详细信息:强>
下面的功能包括一个公式,允许您为任意大小的矩形网格(N&amp; M必须是偶数)输入N和M,以及象限数(0到3)。使用的第一个示例是一个6 x 4网格。
0 1 2 3 4 5
6 7 8 9 10 11
12 13 14 15 16 17
18 19 20 21 22 23
const getRectQuadrant = (n, m, quad) =>
Array.from({length: n/2 * m/2}).map((_,i) =>
2 * i - i % (n / 2) + (quad % 2) * n / 2 + (quad > 1) * n * m / 2
);
console.log(JSON.stringify(getRectQuadrant(6, 4, 0)));
console.log(JSON.stringify(getRectQuadrant(6, 4, 1)));
console.log(JSON.stringify(getRectQuadrant(6, 4, 2)));
console.log(JSON.stringify(getRectQuadrant(6, 4, 3)));
要将其概括为方形网格(即M = N),只需创建另一个调用该网格的函数,即const getSquareQuadrant = (n, quad) => getRectQuadrant(n, n, quad);
或仅用{{1}替换上述代码中的每个m
如下面的4 x 4方格网代码所示:
n
0 1 2 3
4 5 6 7
8 9 10 11
12 13 14 15
矩形N x M网格的说明:
const getSquareQuadrant = (n, quad) =>
Array.from({length: n * n / 4}).map((_,i) =>
2 * i - i % (n / 2) + (quad % 2) * n / 2 + (quad > 1) * n * n / 2
);
console.log(JSON.stringify(getSquareQuadrant(4, 0)));
console.log(JSON.stringify(getSquareQuadrant(4, 1)));
console.log(JSON.stringify(getSquareQuadrant(4, 2)));
console.log(JSON.stringify(getSquareQuadrant(4, 3)));
这创建了一个整数序列(即从零开始),其长度是一个象限的长度,即原始网格的四分之一的长度。这些序号以Array.from({length: n/2 * m/2}).map((_,i) => ...
传递。
i
矩形网格的更详细/可读版本:
2 * i - i % (n / 2) + (quad % 2) * n / 2 + (quad > 1) * n * m / 2
------------------- ------------------ ----------------------
creates the values adds a constant if adds a constant if you
in the top left you want the right want the bottom half
quadrant half