0

チェスゲームで王を動かすためのコードを書きました。キングが動かないこのコードの問題はどこにあるのか教えていただけますか?ありがとう。

編集2:

public partial class Form1 : Form
{
    PictureBox[,] pic = new PictureBox[8, 8];

private void pictureBox34_Click(object sender, EventArgs e)
    {

if (pictureBox34.Image == chess9.Properties.Resources.siyahsah2)

{

f();
}
}

public void picarray()
{
        pic[0, 0] = pictureBox54;
        pic[0, 1] = pictureBox64;
        pic[0, 2] = pictureBox48;
        pic[0, 3] = pictureBox42;
        pic[0, 4] = pictureBox34;
        pic[0, 5] = pictureBox26;
        pic[0, 6] = pictureBox18;
        pic[0, 7] = pictureBox8;
        pic[1, 0] = pictureBox1;
        pic[1, 1] = pictureBox2;
        pic[1, 2] = pictureBox3;
        pic[1, 3] = pictureBox4;
              .
              .///thats so long(64 arrays)
              .
 }

public void f()
{



        int x = 3;
        int y = 3;

       for (int i = 1; i < x; i++)
       {
            for (int j = 1; j < y; j++)
            {
                pic[i, j] = new PictureBox();

                pic[i, j] = pic[i + 1, j + 1];

                pic[i, j] = new PictureBox();
                pic[i, j].Image = Image.FromFile("pic/siyahsah2.jpg");

          }

}
}
4

4 に答える 4

5
if (pictureBox34.Image == Image.FromFile("pic/siyahsah2.jpg"))

このコード行の意味を知っていますか?

  • このステートメントが実行されるたびに、ディスクに保存されているイメージを使用して新しいインスタンスが作成されます
  • 比較は参照の同等性に基づいているため、比較がtrueと評価されることはありません。これは、新しく作成されたオブジェクトには明らかに当てはまりません。
于 2010-12-04T10:55:28.743 に答える
4

いいえ、そのコードのどこにも戻り値がないため、戻り型を正しく定義していません。

コードが何をするか見てみましょう...

最初の問題は次の行です。

if (pictureBox34.Image == Image.FromFile("pic/siyahsah2.jpg"))

このFromFileメソッドは新しいオブジェクトを作成します。そのオブジェクトが画像ボックスに格納されているオブジェクトと同じになることはないため、条件は常にfalseであり、メソッドfが呼び出されることはありません。

メソッドpicarrayで変数を使用していますが、その変数はそのメソッドでローカルに宣言されているためpic、メソッドで使用されている変数と同じではありません。f

このfメソッドでは、操作する画像ボックスの配列を宣言していますが、配列を操作せずにメソッドを終了するだけなので、配列が消えて、結果がどこにも表示されなくなります。

配列は新しく作成されるため、null参照のみが含まれるため、配列内のある項目から別の項目にそれらをコピーしても何も実行されません。また、アイテムを2つの位置から同じ位置にコピーしているため、2番目のコピーが最初のコピーを上書きします。

変数ijがゼロに設定されている[i - 1, j - 1]ため、配列の外側にあるアイテムにアクセスしようとします。これにより、例外が発生します。

配列内のアイテムの1つのプロパティに何かを格納しようとしていImageますが、配列内のすべてのアイテムがnullであるため、Imageプロパティを設定できる画像ボックスがありません。

何をしようとしているのかを判断するのは難しいですが、この情報は、少なくともコードが何をしていないのかを理解するのに役立つはずです。

于 2010-12-04T11:02:54.627 に答える
1

このスニペットを使用してコード全体で何をしようとしているのかを判断するのは難しいですが、正しく見えません。

私が見る問題は、f()あなたが作成しPictureBox pic、そのプロパティのいくつかを設定し、それからそれで何もしないということです。メソッドの最後にf()戻り、pic破棄されます。

このコードが実際にコンパイルされる場合pix[]picarray()メソッドでの使用から、ゲームボードのどこかにクラスレベルの変数があると言えます。その場合、次の行は必要ありません。

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

実際のボードを更新するのではなく、f()内部にのみ存在する新しい空のボードを作成するだけだからです。f()

于 2010-12-04T10:53:05.717 に答える
1

この行を削除します

PictureBox[,] pic = new PictureBox[8, 8]; from the f() function

私は、あなたは再び新しい画像で画像配列を初期化していると思います

于 2010-12-04T10:54:30.547 に答える