【问题标题】:Minesweeper mine generation algorithm扫雷器地雷生成算法
【发布时间】:2015-03-06 01:46:39
【问题描述】:

我正在制作一个扫雷克隆。我目前的地雷生成算法只是:选择一个坐标,如果它没有地雷,则放置一个地雷,否则再试一次。我认为这不是一种有效的算法,尤其是在高密度雷区。我正在考虑其他一些选项,例如:Fisher-Yates shuffle 等,但我认为它对于更大的网格有很长的运行时间。我正在考虑使用链接列表。有什么建议么?

【问题讨论】:

  • 将所有可能的位置放在一个列表中。重新排列列表并将炸弹放置在前 x 个位置。
  • 只需使用 Fisher-Yates shuffle 随机化索引,然后从 0 到该数字选择地雷数
  • 哦。谢谢!我会试试那些。但是还有其他解决方案可以减少不必要的工作吗?例如,我真的需要洗牌整个列表吗?无论如何,我想我会坚持改组,它更简单,更易于管理
  • @userx01 你不需要打乱整个列表,你只需要选择一个随机索引。

标签: algorithm minesweeper


【解决方案1】:

如果您有一个列表/数组,您可以在恒定时间内获取列表的大小,您可以尝试以下操作:

list = List of all fields
N = number of mines
N.times do
  index = random(list.size)
  pick list[index]
  list.remove(index)
end

这边:

  • 您不需要随机播放整个列表
  • 避免两次选择相同的字段

简而言之,它将只是从列表中绘制随机字段并将其从列表中删除以避免下次绘制时发生冲突。

【讨论】:

  • 是的!这就是我要找的。很大的帮助,谢谢!顺便说一句,这可以仅使用数组来实现吗? (对于没有数据结构的语言)
  • 我认为您要搜索的是 Vector 而不是列表。默认情况下,纯列表数据结构没有常量时间 size() 方法和 remove() 方法。
  • 假设我有一个用于雷区的二维数组。然后我会制作另一个列表,然后选择 X 个索引,对吗?所以至少我要复制整个数组?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多