0

ボタンの場所(インターチェンジの場所)をクリックしたときに黒いボタンに置​​き換えたいのですが、それは黒いボタンの隣にあります(b9 =黒いボタンで、lable1は場所を保存するための一時です)。

私はこの方法を作りました:

void checkLocation()
    {
        if (ActiveControl.Location == new Point(5, 7))//-----------for button 1
        {
            if (b9.Location == new Point(83, 7) || b9.Location == new Point(5, 71))
            {
                label1.Location = ActiveControl.Location;
                ActiveControl.Location = b9.Location;
                b9.Location = label1.Location;
            }
        }// it continue for every button

そして、すべてのボタンクリックに対してこのコードを書きます

private void button1_Click(object sender, EventArgs e)
    {
       checkLocation();
    }

現在、一部のボタンが現在機能しません。なにが問題ですか ?

4

2 に答える 2

0

2 つのコントロールの位置を交換するには、次のようにします。

void swapLocation()
{
    var tmp = ActiveControl.Location;
    ActiveControl.Location = b9.Location;
    b9.Location = tmp;
}

またはより一般的に

void swapLocation(Control x, Control y)
{
    var tmp = x.Location;
    x.Location = y.Location;
    y.Location = tmp;
}

...
swapLocation(ActiveControl, b9);

アップデート

15 パズルのバージョンを実装しようとしているようです。これを解決する方法はたくさんありますが、プログラムの根本的な書き直しを避けるために、次の方法をお勧めします。

private int buttonWidth = 82;
private int buttonHeight = 82; // adjust these values as needed

private void button_Click(object sender, EventArgs e)
{
   if ((Math.Abs(ActiveControl.Location.X - b9.Location.X) == 0 &&
        Math.Abs(ActiveControl.Location.Y - b9.Location.Y) == buttonHeight) ||
       (Math.Abs(ActiveControl.Location.X - b9.Location.X) == buttonWidth &&
        Math.Abs(ActiveControl.Location.Y - b9.Location.Y) == 0))
   {
       swapLocation(ActiveControl, b9);
   }
}

これは基本的に、ActiveControlが の真上、真下、左、または右にあるかどうかを確認しb9、そうであればそれらを交換します。このクリック ハンドラーは、1 ~ 8 のすべてのボタンに使用できます。このメソッドは、幅と高さが固定されているボタンでのみ機能することに注意してください。

于 2013-06-03T16:47:56.583 に答える