C # / Visual Studio пытается изменить содержимое случайного массива и получает «Ссылка на объект не установлена ​​на экземпляр объекта». ошибка - PullRequest
0 голосов
/ 20 февраля 2020

Я пытаюсь сделать игру ti c ta c toe, в которой пользователь вводит размеры, а затем создается доска с помощью кнопок. Когда кнопка нажата, она отключается, и текст внутри меняется соответственно на «X» или «O». Пользователь играет против самого базового c "AI", который выбирает кнопки случайным образом. Я пытаюсь проверить наличие пустых (включенных) кнопок на доске, но я получаю сообщение об ошибке:

System.NullReferenceException: 'Ссылка на объект не установлена ​​для экземпляра объекта.'

, вот код:

public partial class Form1 : Form{
   int num; 
   Button[,] buttonspinak;
   private void button2_Click(object sender, EventArgs e)
        {
            int start = 180, end = 30;

            num = Convert.ToInt32(textBox1.Text);
            buttonspinak = new Button[num, num];

                for (int i = 0; i < num; i++)
                {
                    end += 80;
                    start = 180;

                    for (int j = 0; j < num; j++)
                    {
                        Button b = new Button();
                        b.Size = new Size(60, 60);
                        b.Location = new Point(start, end);
                        this.Controls.Add(b);
                        start += 80;
                        b.BackColor = Color.White;
                        buttonspinak[i, j] = b;
                        b.Click += new EventHandler(Computer2);
                        Computer(sender, e);

                    }
                }
            }
   int countercomputer;
        Random randcompu = new Random();
        private void Computer(object sender, EventArgs e)
        {
            int randomi = 0;
            int randomj = 0;
            Button b = (Button)sender;
            b.Enabled = false;
            randomi = randcompu.Next(0, num);
            randomj = randcompu.Next(0, num);
            **while (buttonspinak[randomi, randomj].Text == "O" || buttonspinak[randomi, randomj].Text == "X")** // this is the line where i get the error
            {
                randomi = randcompu.Next(0, num);
                randomj = randcompu.Next(0, num);
                //buttonspinak[randomi, randomj].Text = "C";
            }
            buttonspinak[randomi, randomj].Text = "O";
            b_Elegxos();

        }
private void Computer2(object sender, EventArgs e)
    {
        countercomputer++;
        Button b = (Button)sender;
        b.Enabled = false;
        if (countercomputer % 2 != 0)
        {
            b.Text = "X";
            b.ForeColor = Color.DarkRed;
        }
        b_Elegxos();

    }
}

1 Ответ

0 голосов
/ 20 февраля 2020

Вы, кажется, вызываете Computer() в каждой итерации вашего вложенного for l oop в обработчике button2_Click.

Это означает, что после инициализации buttonspinak[0,0] новым Button вызывается Computer(), который выбирает случайную позицию в buttonspinak и пытается получить Text этого элемента. Но, скорее всего, эта позиция в массиве еще не инициализирована, поэтому вы пытаетесь вызвать .Text по ссылке null, что приводит к вашему исключению.

Вы должны вместо этого вызвать Computer () после циклов for в button2_Click, так что вы можете быть уверены, что все позиции в buttonspinak инициализированы.

...