首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >N-拼图伪随机洗牌?

N-拼图伪随机洗牌?
EN

Stack Overflow用户
提问于 2011-05-24 07:58:25
回答 3查看 4.4K关注 0票数 3

我正在开发N-Puzzle游戏(也被称为15-Puzzy...)在正方形网格上拆分图像,移除其中的一部分,然后进行混洗。我对这个难题的解决方案不太感兴趣,因为这取决于用户。但我想伪随机地洗牌。

我知道1/2的所有可能的洗牌都会使棋盘无法解决。假设我有一些rand()-esc函数,并且我知道棋盘的大小,有没有一种简单的方法来伪随机地生成一个随机的状态?

我在内存中有一个游戏板,一个整数的多维数组。我的方法只是将图像按相反的顺序放置,将最后一个图像与偶数板上倒数第二个图像交换。我的当前函数如下所示,我正在使用Java。

代码语言:javascript
复制
private void shuffle()
{
    gameState = new int[difficulty][difficulty];
    int i = 0, N = (difficulty * difficulty) -1;

    while (i < N)
        gameState[(int)(i / difficulty)][i % difficulty] = N - ++i;
    gameState[difficulty-1][difficulty-1] = N;

    // N id even when the remainder of N/2 is 0
    if ((difficulty % 2) == 0)
    {
        // swap 2nd to last and 3rd to last element
        int tmpEl = gameState[difficulty-1][difficulty-2];
        if (difficulty == 2)
        {
            gameState[1][0] = gameState[0][1];
            gameState[0][1] = tmpEl;
        }
        else
        {
            gameState[difficulty-1][difficulty-2] = gameState[difficulty-1][difficulty-3];
            gameState[difficulty-1][difficulty-3] = tmpEl;
        }
    }
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-05-24 08:08:13

我的建议是跟踪数组中的一个空正方形(您已经移除的部分)。

然后,随机挑选这个空正方形的一边(确保做必要的边界检查),并用空正方形“交换”那一边的那一块。这模拟了玩家要做的滑动动作。

重复此操作多次(简单难度设置-难度设置您所做的迭代次数),每次在数组中“滑动”空方块。

使用这种方法,您只需跟踪空正方形的位置,然后选择要移动到的随机边。

希望这能对你有所帮助--我在这里没有提供任何代码,只提供了一个简单的算法供你使用。

票数 3
EN

Stack Overflow用户

发布于 2011-05-24 08:11:18

这个问题基本上归结为做一个标准的混洗算法和一个小的扭曲。

关键的观察是,对于15个拼图是可解的,排列的奇偶性和空白正方形的奇偶性必须相同。

为此,首先使用标准算法创建一个随机排列。例如,Knuth混洗算法:Random Permutations

使用Knuth's shuffle (或Fisher-Yates shuffle )的优点是它涉及到交换数字,因此您可以轻松地跟踪排列的奇偶校验。每个交换要么保留奇偶校验(如果交换1和3 ),要么更改奇偶校验(如果交换1和2 )。

将空白方块放在与排列的奇偶校验相同的奇偶校验上,就完成了。如果排列具有奇数奇偶校验,则将空白放置一个奇数正方形(1,3,5,...随机选择)。如果排列具有偶数奇偶校验,则将空白放在偶数正方形上。

票数 6
EN

Stack Overflow用户

发布于 2011-05-24 08:08:18

只需生成随机拼图,直到您生成具有偶数奇偶校验的拼图。http://heuristicswiki.wikispaces.com/N+-+Puzzle

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6104384

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档