生成Catan数字的定居者?

时间:2014-10-24 08:23:02

标签: algorithm vba hexagonal-tiles

我正在尝试生成一个Settlers of Catan游戏板,并试图创建一个有效的十六进制数字实现。

目标是从2-12中随机生成一组数字(只有一个2和12的实例,以及其间所有数字的两个实例),确保值6和8不是六边形(? )彼此相邻。 6& 8是特殊的,因为它们是你最有可能推出的数字,因此游戏不希望这些数字彼此相邻,因为玩家获得了不成比例的更高资源。 A 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浅橙色。

这种模式限制了我需要进行的比较次数。

2 个答案:

答案 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.然后放置其余的。