1

我正在尝试生成一个 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 个浅橙色。

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

4

2 回答 2

2

您可以进行多种优化 - 首先您确切地知道每个磁贴有多少数字存在 - 您有2,3,3,4,4,5,5,6,6,8,8,9,9,10,10,11,11,12。所以从这组数字开始 - 如果数字生成次数过多,您将消除检查。现在您可以对这组数字进行随机洗牌并检查它是否“有效”。我认为这仍然会导致过多的负面检查,但它应该比您当前的方法执行得更好。

于 2014-10-24T08:43:50.027 回答
0

首先放置 8 个,计算您愿意将 6 个放置在哪些剩余的瓷砖上(即不相邻的),然后随机选择 6 个。然后放置其余的。

于 2014-10-24T17:25:48.500 回答