В чем проблема этого кода? - PullRequest
       3

В чем проблема этого кода?

0 голосов
/ 04 декабря 2010

Я написал код для перемещения короля в шахматной игре;Можете ли вы сказать мне, где проблема этого кода, что король не двигается?Спасибо.

РЕДАКТИРОВАНИЕ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 ]

5 голосов
/ 04 декабря 2010
if (pictureBox34.Image == Image.FromFile("pic/siyahsah2.jpg"))

Знаете ли вы значение этой строки кода?

  • Каждый раз, когда выполняется этот оператор, создается новый экземпляр с использованием образа, хранящегося на диске
  • Сравнение никогда не оценивается как true, поскольку сравнение основано на равенстве ссылок, что, очевидно, не может быть истинным для вновь созданного объекта
4 голосов
/ 04 декабря 2010

Нет, вы не правильно определили типы возвращаемых данных, поскольку у вас вообще нет никаких возвращаемых значений в этом коде.

Посмотрим, что может сделать код ...

Первая проблема - это строка:

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

Метод FromFile создаст новый объект, и, поскольку этот объект никогда не будет тем же самым объектом, который хранится в графическом блоке, условие всегда ложно и метод f никогда не вызывается.

В методе picarray вы используете переменную pic, но она не будет той же самой переменной, которая используется в методе f, так как эта переменная объявлена ​​локально в этом методе,

В методе f вы объявляете массив графических блоков, которыми вы манипулируете, но затем вы просто выходите из метода, ничего не делая с массивом, поэтому массив просто уходит, и результат никогда нигде не будет виден.

Поскольку массив только что создан, он содержит только нулевые ссылки, поэтому копирование их из одного элемента в другой в массиве ничего не дает. Вы также копируете элементы из двух позиций в одну и ту же позицию, поэтому вторая копия будет перезаписывать первую.

Поскольку переменные i и j установлены в ноль, [i - 1, j - 1] попытается получить доступ к элементу, который находится за пределами массива, что даст вам исключение.

Вы пытаетесь сохранить что-либо в свойстве Image одного из элементов в массиве, но, поскольку все элементы в массиве имеют значение null, нет графического окна, для которого можно установить свойство Image.

Трудно сказать, что вы пытаетесь сделать, но эта информация должна, по крайней мере, помочь вам понять, что код не делает.

1 голос
/ 04 декабря 2010

Удалить эту строку

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

я думаю, вы снова запускаете массив картинок с новой картинкой

1 голос
/ 04 декабря 2010

Трудно сказать, что вы пытаетесь сделать в общем коде с помощью этого фрагмента, но он выглядит неправильно, нет.

Проблема, которую я вижу, состоит в том, что в f() вы создаете PictureBox pic, устанавливаете некоторые его свойства, но затем ничего не делаете с ним. В конце f() метод возвращается и pic уничтожается.

Если этот код на самом деле компилируется, то после использования pix[] в методе picarray() я бы сказал, что у вас есть переменная уровня класса где-то, которая является вашей игровой доской. В этом случае вам не нужна строка:

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

в f(), потому что это просто создание новой пустой доски, которая существует только внутри f(), а не обновление вашей реальной доски.

...