15拼图随机播放方法问题

Cod*_*dyK 0 .net c# algorithm winforms

我正在使用C#制作15个益智游戏,允许用户输入自定义行和列值,最多可达10 x 10拼图.因此,我遇到了shuffle方法的问题.我想做到这一点,这个难题总是可以解决的.通过首先创建一个获胜的拼图然后改变空的空间.问题是每次调用每个点击事件效率太低.我需要一种方法来调用与空白空间相邻但不是对角线的按钮的单击事件.我还使用一个看不见的静态按钮作为空白点.PuzzlePiece类继承自Button.我不太清楚如何做到这一点.我将不胜感激任何帮助.

谢谢

这就是我所拥有的:

private void shuffleBoard()
    {
        //5 is just for test purposes
        for (int i = 0; i < 5; i++)
        {
            foreach (Control item in this.Controls)
            {
                if (item is PuzzlePiece)
                {
                    ((PuzzlePiece)item).PerformClick();
                }
            }
        }
    }

 void PuzzlePiece_Click(object sender, EventArgs e)
    {
        PuzzlePiece piece = (PuzzlePiece)sender;

        if (piece.Right == puzzleForm.emptyPiece.Left && piece.Top == puzzleForm.emptyPiece.Top)
        {
            movePiece(piece);
        }
        else if (piece.Left == puzzleForm.emptyPiece.Right && piece.Top == puzzleForm.emptyPiece.Top)
        {
            movePiece(piece);
        }
        else if (piece.Top == puzzleForm.emptyPiece.Bottom && piece.Left == puzzleForm.emptyPiece.Left)
        {
            movePiece(piece);
        }
        else if (piece.Bottom == puzzleForm.emptyPiece.Top && piece.Left == puzzleForm.emptyPiece.Left)
        {
            movePiece(piece);
        }
    }
Run Code Online (Sandbox Code Playgroud)

RBa*_*ung 10

对于15个谜题(以及类似的滑动瓦片游戏),任何瓦片排列都是可以解决的.当且仅当它具有偶数奇偶校验.

因此,您应该能够随意铺设瓷砖.如果奇偶校验是均匀的那么它可以解决.如果奇偶校验是奇数,那么只需交换两个相邻的块以反转奇偶校验,然后它就可以解决.

有关如何衡量平价的详细信息,请参见此处:http://en.wikipedia.org/wiki/Fifteen_puzzle#Solvability


由于维基百科的文章已被更改,因此不再清楚如何计算十五拼图排列的平价,我将在下面进行探讨:

对于任何瓷砖排列,您可以通过以下方式计算反演:

  1. 统计所有的" 倒置 ".从右上角开始,从每个行向下到左下角的顺序中的反转是编号的瓦片低于其前面的瓦片.第一个图块从不计为倒置(因为它之前没有图块,因此它不能低于该图块),并且您不计算空白区域.

  2. 添加空格的行号减去 1.

这总数是一个安排的计数.如果Count是偶数,则排列具有偶数(或0)奇偶校验.如果Count是奇数,则它具有奇数(或1)奇偶校验.

将起始排列的奇偶校验与目标排列的奇偶校验进行比较.如果它们是相同的,那么这个谜题是可以解决的,否则它是不可解决的.由于标准目标排列(空间,顺序为1-15)具有0个反转并且空间的行数为1,因此我们得到Count为0 + (1 - 1)0或0,即使如此目标的奇偶校验为0.因此任何同样为0的起始排列是可以解决的.