1

私は C# の初心者で、15 パズルのコーディングを試してみることにしました。これは、16 個のボタン、16 個のボタン クリック イベント、および大量の if ステートメントを使用して、過去に Delphi (Paschal) で行った演習です。今回は、プログラムでボタンを作成し、すべてのボタンが使用する単一の buttonClick メソッドを使用しています。隣接するボタンをチェックし、空白のボタンがある場合はボタンのテキストを変更するように設定されています。これで問題ありません。ただし、スクランブラー ボタンを作成しようとしたとき、Delphi で行った方法は、10,000 回ループする for ルックを作成することでした。ループ内で、数字 (0 ~ 15) をランダムに選択し、そのボタンの Click メソッドを呼び出しました。明らかに、すべてのクリックが登録されるわけではありませんが、これを 10,00 回実行すると、パズルを十分にスクランブルできます。これは、Delphi で完了するのに約 1 秒かかります。C# では、コードを高速に実行するのに苦労しています。Button.PerformClick アクションは、予想よりも非常に遅く実行されているようです。私が間違っていることはありますか?助けていただければ幸いです。ありがとう!

これがスクランブルボタンのコードです。

void scramble_Click(object sender, MouseEventArgs e)
{
    for (int i = 0; i < 1000; i++)
    {
        int temp = rand.Next(16);
        int div = temp % 4;
        int rem = temp / 4;
        buttonClick(puzzle[div, rem], new EventArgs());
        Refresh();
    }
}

ボタンは 4x4 グリッドにあり、x 座標として乱数 mod 4 と y 座標の乱数 intDiv 4 を介してアクセスされます。他に知りたい情報があれば教えてください!再度、感謝します!

4

2 に答える 2

1

これを試してみてください、役立つかもしれません:

void scramble_Click(object sender, MouseEventArgs e)
{
    EventArgs ea = new EventArgs();
    for (int i = 0; i < 1000; i++)
    {
        int temp = rand.Next(16);
        int div = temp % 4;
        int rem = temp / 4;
        buttonClick(puzzle[div, rem], ea);
    }
    Refresh();
}

クリックごとに新しいEventArgsオブジェクトを作成する必要はなく、1000回更新する必要もありません。エドS.がコメントで指摘したように、それは多くの無意味な塗り直しです。

于 2012-06-27T19:11:49.090 に答える
0

「失われた時間」のほとんどは、動かせない部分を動かそうとしていると思います。

たぶん、パズルの空きスペースを追跡し、rand.Next(4)移動する隣接するピースを決定するために使用することができます(空きスペースが側面または隅にある場合は、3または2を使用するように調整することもできます)

また、このrefresh関数を使用してボードを「再描画」する場合は、パズルがスクランブルされているのを見たいからだと思います。もしそうなら、プログラムが動かせない部分を動かそうとするので、動きの間に遅れを持たせるのではなく、動かせる部分だけを動かすと、おそらくより流動的に見えるでしょう。それ以外の場合、実際に動いているのを気にしない場合は、ピースのスクランブリングが終了したら、ボード全体を「再ペイント」するだけです。

于 2012-06-27T19:14:45.940 に答える