我正在尝试生成一个 Settlers of Catan 游戏板,并试图创建一个有效的十六进制数字实现。
目标是从 2-12 随机生成一组数字(只有一个 2 和 12 的实例,以及介于两者之间的所有数字的两个实例),确保值 6 和 8 它们不是六边形 (?) 相邻另一个。6 和 8 很特别,因为它们是您最有可能掷出的数字,因此游戏不希望它们彼此相邻,因为玩家获得的此类资源不成比例地更高。7 表示您必须丢弃资源。
预期结果:http: //imgur.com/Ng7Siy8
现在我有一个非常缓慢的蛮力实现,我希望对其进行优化,但我不确定如何。实现是在 VBA 中,它限制了我可以使用的数据结构。
在伪代码中,我正在做这样的事情:
For Each of the 19 hexes
Loop Until we have a valid number
Generate a random number between 1 and 12
Check
Have we already placed too many of that number?
Is the number equal to 6 or 8?
Is the number being placed on a hex next to another hex with 6 or 8 placed on it?
If valid
Place
If invalid
Regenerate random number
它非常手动并且受随机生成器功能的影响,这意味着它可以是从非常短到非常长的任何地方(超过 19 个十六进制数)。
注意:如何放置我的号码似乎很重要。我从游戏板的外部开始(请参阅此处http://imgur.com/Ng7Siy8),位于带有数字 6 的灰色六角形上,然后逆时针围绕板向内移动。这意味着我的下一个六角形是 2 个浅绿色,4 个浅橙色......继续到 9 个深绿色,然后向内变成 4 个浅橙色。
这种模式限制了我需要进行的比较次数。