-1

片側にキングとクイーン、もう片側にキングだけのシンプルなチェス ゲームを書いています。ユーザーとそれに応じて他の作業を行います。キングが滞在する場所をユーザーから取得する方法を知りたいのですが、64 個のピクチャボックスでフォームを実装しました。

編集:

私はジョン・スキート氏からこのコードを書きました 回答:どのような間違いがありますか?

PictureBox[,] pic = new PictureBox[8, 8];

public PictureBox SetKingImage(int x,int y)
    {


        pic[x,y].Image=Image.FromFile("pic/siyahsah2.JPG");
        return pic[x, y];
    }

public void GetClickedPicturebox()
    {  
        int x, y;

      for(x=0;x<8;x++)
      {
          for(y=0;y<8;y++)
          {
              pic[x, y] = new PictureBox();

              pic[x, y].Click += (object sender, System.EventArgs e) =>SetKingImage(x, y);


            }
          }
      }
4

3 に答える 3

3

多くの PictureBoxes をいじる代わりに、ここにアイデアがあります。

という UserControl を作成しますChessBoardControl。は、指定されたChessBoardControl描画ChessBoardオブジェクトを処理します。

ではChessBoardControl、イベントをオーバーライドしてOnMouseDown、マウスの座標から、どの四角がクリックされたかを簡単に計算できます。

于 2010-12-06T07:54:26.837 に答える
3

最も簡単な方法は、関連する画像ボックスをクリックするようにユーザーに依頼することです。次の 3 つの方法のいずれかで、どの PictureBox がクリックされたかを判断できます。

  • PictureBox ごとに同じイベント ハンドラーを使用してサブスクライブしますが、PictureBox 内のタグを使用して座標を取得します。
  • 各 PictureBox に対して同じイベント ハンドラーを使用してサブスクライブしますが、PictureBox ( sender) への参照を使用して、それがどれであったかを見つけ、座標を適切に取得します。
  • 次のように、位置をカプセル化するラムダ式を使用して購読します。

    for (int x = 0; x < 8; x++) {
        for (int y = 0; y < 8; y++) {
            pictureBoxes[x, y].Click += (sender, args) => SetKingPosition(x, y);
        }
    }
    

後者のアプローチの問題点の 1 つは、ラムダ式を介してイベントからサブスクライブを解除するのが比較的面倒なことです。おそらく、最初のボタンがクリックされたときに、すべてのイベント ハンドラーをサブスクライブ解除する必要があります。

別の方法は、イベント ハンドラーをそのままにして、適切なタイミングでない場合は無視することです:)

于 2010-12-06T07:18:18.583 に答える
1

新しいコードでは、 ijforを反復処理する 2 つのループがありますが、ループでは常にイベント ハンドラーを pic[x,y] に割り当てています。

したがって、ハンドラを pic[0,0] に割り当てるだけです。xyは変わらない...

編集:
率直に言って、あなたのコードを理解しているかどうかはわかりません。あなたは何をしたかったのGetClickedPictureboxですか?で、いつ呼んでるの?

クリックされた PictureBox を取得するためにそれを呼び出すつもりだった場合、イベント ハンドラーをフォーム上にあるインスタンスではなく、新しい PictureBox インスタンスにアタッチしているため、間違っています。

このメソッドが初期化メソッドとして意図されていた場合、新しい PictureBox インスタンスを作成しているだけで、フォームに表示していないため、おそらく間違っています。フォームに PictureBox がある場合、それらは異なるインスタンスであり、イベント ハンドラーを正しいものにアタッチしていません。

于 2010-12-06T11:44:22.010 に答える