块匹配博弈定位算法

时间:2013-10-12 22:44:42

标签: algorithm gml game-maker

所以我正在研究一种与宝石迷阵技术相似的游戏 - 你知道这种类型,你在网格中交换相邻的瓷砖以匹配相同类型的瓷砖组。所以这是我的问题:如果我有一个MxM网格,并且有N种不同的图块类型,我该如何计算图块的“随机”位置,以便最小化3个相同类型图块的组数? / p>

目前,我只是完全随机地放置它们,但是从一开始就会产生很多分组,从而消除了游戏中的所有技能。我甚至不知道从哪里开始提出一种算法来最小化这些初始组。如果它有帮助或重要,那么现在在10x10网格中特别有5种磁贴类型。

2 个答案:

答案 0 :(得分:0)

我能想到的最简单的方法:

for each tile
  based on the surrounding already generated tiles,
    generate a random type among those which won't result in 3-in-a-row

这是一种未经优化的方法,假设只是水平和垂直匹配(不是对角线):(伪代码)

for x = 1 to M
for y = 1 to M
  do
    board[x][y] = randomType()
  while ((x >= 3 && board[x-1][y] == board[x-2][y] && board[x-1][y] == board[x][y]) ||
         (y >= 3 && board[x][y-1] == board[x][y-2] && board[x][y-1] == board[x][y]))

避免完全重复生成的方法:(假设类型为数字)

for x = 1 to M
for y = 1 to M
  limit = N
  horizontal = (x >= 3 && board[x-1][y] == board[x-2][y] && board[x-1][y] == board[x][y])
  vertical   = (y >= 3 && board[x][y-1] == board[x][y-2] && board[x][y-1] == board[x][y])
  if horizontal
    limit--
  if vertical
    limit--
  board[x][y] = randomType(limit)
  offset = 0
  if (vertical && board[x][y] >= board[x][y-1])
    offset++
  if (horizontal && board[x][y] >= board[x-1][y])
    offset++

  board[x][y] += offset

上述方法类似于通过生成[0,B-1]范围内的数字来生成范围[0,A-1]和[A + 1,B]中的数字,然后,如果生成的数字是A或更高,我们将它增加1。

N需要至少为3,否则你可能会得到类似的结果:

..A
..A
BB?

上述算法将进入无限循环。

答案 1 :(得分:0)

两个观察结果:

  • 瓷砖的数量非常少,因此我们的算法不需要非常高效
  • 初始序列不一定是"完美"未分组,所以我们不需要解决问题,但只需尽力解决问题

这导致了一个简单的算法,可能足够好"为你:

  • 从空白的棋盘和所有瓷砖的列表(例如阵列)开始
  • 随机播放列表
  • 按照简单的规则将一个列表元素放在电路板上:
    • 列出当前图块的可能位置,每个位置以1点开始
    • 对于相同颜色的每个对角相邻的图块,将位置点乘以N
    • 对于相同颜色的每个直接相邻的块,将位置点乘以M(M> N)
    • 找到最低分的位置
    • 如果这不是唯一的,请使用与中心距离最短的位置
    • 如果这仍然不是唯一的,则随机选择