0

私はC#で15パズルゲームを作成しています。これにより、ユーザーは最大10x10パズルまでのカスタムの行と列の値を入力できます。このため、シャッフル方法に問題があります。パズルが常に解けるように作りたいです。最初に勝利のパズルを作成し、次に空のスペースをシャッフルすることによって。問題は、毎回すべてのクリックイベントを呼び出すのは非効率的すぎることです。空のスペースに隣接しているが対角線ではないボタンのクリックイベントを呼び出す方法が必要です。また、空いている場所には非表示の静的ボタンを使用します。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);
        }
    }
4

2 に答える 2

10

15パズル(および同様のスライディングタイルゲーム)の場合、タイルの配置は、パリティが均等である場合にのみ解決できます。

したがって、タイルをランダムにレイアウトできるはずです。パリティが偶数の場合、そのまま解決可能です。パリティが奇数の場合は、隣接する2つのタイルを交換してパリティを反転するだけで、解決できます。

パリティの測定方法の詳細については、http://en.wikipedia.org/wiki/Fifteen_puzzle#Solvabilityを参照してください。


ウィキペディアの記事が変更され、15パズルの配置のパリティを計算する方法が明確でなくなったため、以下で説明します。

タイルの配置については、次の方法で反転を計算します。

  1. すべての「反転」を数えます。反転は、右上隅から各行を横切って左下隅まで、番号が付けられたタイルが前のタイルよりも低い順序でいつでも行われます。最初のタイルは反転としてカウントされません(前にタイルがないため、そのタイルより低くすることはできません)。また、空のスペースはカウントされません。

  2. それに、空白スペースの行番号から1を引いたものを追加します。

この合計は、アレンジメントのカウントです。カウントが偶数の場合、アレンジメントのパリティは偶数(または0)になります。カウントが奇数の場合、奇数(または1)のパリティがあります。

開始アレンジメントのパリティをターゲットアレンジメントのパリティと比較します。それらが同じである場合、パズルは解ける可能性があり、そうでない場合は解けません。標準のターゲット配置(スペース、順番に1〜15)には0の反転があり、スペースの行番号は1であるため、カウント0 + (1 - 1)または0が得られます。これは、ターゲットのパリティが0であって同様です。同じく0である開始配置は解決可能です。

于 2012-10-16T01:18:35.423 に答える
2

私があなたなら、あなたのモデルを UI から分離します。

というクラスを作成しますPuzzle。このクラスは、パズルの状態を保持し、状態に対してすべての操作を実行します。

MoveLeft、、、およびメソッドMoveRightを実装する可能性があります。ボードをシャッフルするには、これら 4 つのメソッドをランダムに呼び出して (かなり長い) 一連の動きを実行するだけです。MoveUpMoveDown

クラスPuzzleは、UI がそれ自体をレンダリングするのに十分な状態を公開する必要があります。

このようにすることで、コードを簡素化し、単体テストをより簡単にすることができます。

于 2012-10-16T01:23:53.523 に答える