让我们说我想让玩家加入游戏。我需要给每个球员一个起始位置。是否有一种创造性的算法方式来分散玩家。注意:玩家不会同时开始,所以你不知道会有多少玩家。您只知道可能的最大玩家数量。
例如假设我有一个棋盘。我可以按顺序启动它们
+--+--+--+--+--+--+--+--+
| 1| 2| 3| 4| 5| 6| 7| 8|
+--+--+--+--+--+--+--+--+
| 9|10|11|..|..| | | |
..
+--+--+--+--+--+--+--+--+
|..|..|..|..|..|62|63|64|
+--+--+--+--+--+--+--+--+
我想让球员们远离对方。
+--+--+--+--+--+--+--+--+
| 1| | 9| | |11| | 3|
+--+--+--+--+--+--+--+--+
| | | | | | | | |
+--+--+--+--+--+--+--+--+
| | | | 5| | | | |
+--+--+--+--+--+--+--+--+
| | | | | | 7| | |
+--+--+--+--+--+--+--+--+
| | |8 | | | | | |
+--+--+--+--+--+--+--+--+
| | | | | 6| | | |
+--+--+--+--+--+--+--+--+
| | | | | | | | |
+--+--+--+--+--+--+--+--+
| 4| |12| | |10| | 2|
+--+--+--+--+--+--+--+--+
思路:
我可以制作一个手写的起始位置表
我不反对此解决方案,但我更喜欢可以使用不同尺寸网格的解决方案
做一些重型算法,每个玩家一次放置一个网格,然后放置下一个每个都检查网格上的每个点,找到离所有填充点最远的一个点
这样做有点过分了。它也很慢。
其他(在此处插入您的广告素材解决方案)
我曾经把事情放在圈子上的一个例子。我基本上颠倒了比特,所以假设最大玩家是2的幂。在这种情况下,让我们假设它是16
0 -> 0000 -> 0000 -> 0
1 -> 0001 -> 1000 -> 8
2 -> 0010 -> 0100 -> 4
3 -> 0011 -> 1100 -> 12
4 -> 0100 -> 0010 -> 2
5 -> 0101 -> 1010 -> 10
6 -> 0110 -> 0110 -> 6
7 -> 0111 -> 1110 -> 14
8 -> 1000 -> 0001 -> 1
9 -> 1001 -> 1001 -> 9
10 -> 1010 -> 0101 -> 5
11 -> 1011 -> 1101 -> 13
12 -> 1100 -> 0011 -> 3
13 -> 1101 -> 1011 -> 11
14 -> 1110 -> 0111 -> 7
15 -> 1111 -> 1111 -> 15
因此,如果您将其映射到圆圈,您将按此顺序获得起始位置。
__0__
_15/ \_8_
/ \
7 4
/ \
| |
11 12
| |
/ \
| |
3 2
| |
\ /
| |
13 10
| |
\ /
5 6
\_ _ _ _/
9 \__ __/ 14
1
每个玩家的起始顺序都是分散的。如果只有2名球员,他们将在圈子的两侧。如果有3个,它们将相互成90度。如果有8个,则彼此相距45度。当然,如果我知道一开始会有多少玩家,我可以轻松地将它们分散开来,但就像上面说的那样,我不知道有多少玩家。我只知道允许的最大值。
所以,我想知道是否有一个类似的创意和简单的网格而不是圆形的解决方案。我可以做一些复杂的事情,比如
if (playerNum == 0)
{
put 1st player in center
}
else if (playerNum < 5)
{
put next 4 players in one of the corners
}
else if (playerNum < 9)
{
put next 4 players in mid point of edge
}
else if (playerNum < 13)
{
put next 4 players in the center of the of the
formed by the clockwise triangle of the center
a corner and midpoint
}
else if (playerNum < 17)
{
put next 4 players in the center of the of the
formed by the counter-clockwise triangle of the center
a corner and midpoint
}
else if (...)
这不仅仅是制作硬编码表,因为每个案例都是自定义的。还有其他创意解决方案吗?
答案 0 :(得分:0)
好吧,在函数式语言中我会描述一个规则:取一个随机位置样本,直到你有 n ,其中距离为ex:算术距离 {{1} }到最近的现有起点是7.
sqrt(x^2+y^2)
现在你已经 n ,选择一个。
您可以在世界开始时或需要新位置时执行此操作。因为你想让球员彼此相距遥远,你可以增加7的大小。这或多或少会保证位置无法预测。