所以我正在研究一种与宝石迷阵技术相似的游戏 - 你知道这种类型,你在网格中交换相邻的瓷砖以匹配相同类型的瓷砖组。所以这是我的问题:如果我有一个MxM网格,并且有N种不同的图块类型,我该如何计算图块的“随机”位置,以便最小化3个相同类型图块的组数? / p>
目前,我只是完全随机地放置它们,但是从一开始就会产生很多分组,从而消除了游戏中的所有技能。我甚至不知道从哪里开始提出一种算法来最小化这些初始组。如果它有帮助或重要,那么现在在10x10网格中特别有5种磁贴类型。
答案 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)
两个观察结果:
这导致了一个简单的算法,可能足够好"为你: