我正在尝试生成一个Settlers of Catan游戏板,并试图创建一个有效的十六进制数字实现。
目标是从2-12中随机生成一组数字(只有一个2和12的实例,以及其间所有数字的两个实例),确保值6和8不是六边形(? )彼此相邻。 6& 8是特殊的,因为它们是你最有可能推出的数字,因此游戏不希望这些数字彼此相邻,因为玩家获得了不成比例的更高资源。 A 7表示您必须丢弃资源。
现在我有一个非常慢的工作强力实现,我希望能够优化它,但我不确定如何。实现是在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浅橙色。
这种模式限制了我需要进行的比较次数。
答案 0 :(得分:2)
您可以进行多项优化 - 首先,您确切知道每个图块中有多少个数字 - 您有2,3,3,4,4,5,5,6,6,8,8,9,9,10,10,11,11,12
。因此,从这组数字开始 - 如果数字生成次数太多,您将取消检查。现在你可以随机抽取这组数字并检查它是否有效"。这仍然会导致我认为太多的负面检查,但它应该比你当前的方法表现更好。
答案 1 :(得分:0)
首先放置8,计算你喜欢哪个剩余的瓷砖放置6(即非相邻),然后随机选择6.然后放置其余的。