我正在尝试生成一个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轻orange...continuing左右9深绿色,然后向内4浅橙色。
这种模式限制了我需要进行的比较的数量。
发布于 2014-10-24 08:43:50
你可以做几个优化-首先,你知道每个瓷砖上有多少个数字--你有2,3,3,4,4,5,5,6,6,8,8,9,9,10,10,11,11,12
。因此,从这组数字开始--如果生成的数字太多,您将取消检查。现在,您可以对这组数字进行随机洗牌,并检查它是否“有效”。这仍然会导致太多的负面检查,我认为,但它应该比你目前的方法表现更好。
发布于 2014-10-24 17:25:48
先放置8块,然后计算出你愿意把6块放在哪一块(即不相邻),然后随机选择6块,然后把其余的放在上面。
https://stackoverflow.com/questions/26544081
复制相似问题