Ошибка в игре "Жизнь"

В коде, написанном на c# в Windows Forms по игре "Жизнь" есть ошибка, но я не могу найти какая. Более того, я не могу отследить даже её на своём экране, но она определенно есть. Суть в том, что по какой-то причине клетки очень быстро размножаются и в скором времени заполоняют почти весь экран. Вот метод подсчётки соседей вокруг, проблемы скорей всего в нём (massive1 это двумерный массив с расположением каждой клетки по x и y)

private bool[,] CounterNeibhours(in bool[,] massive1)
{
    bool[,] massive2 = massive1;
    for (int x = 0; x < cols; x++)
    {
        for (int y = 0; y < rows; y++)
        {

            int k = 0;
            try
            {
                if (massive1[x - 1, y + 1] == true)
                {
                    k++;
                }
            }
            catch
            {

            }
            try
            {
                if (massive1[x, y + 1] == true)
                {
                    k++;
                }
            }
            catch
            {

            }

            try
            {
                if (massive1[x + 1, y + 1] == true)
                {
                    k++;
                }
            }
            catch
            {

            }

            try
            {
                if (massive1[x - 1, y] == true)
                {
                    k++;
                }
            }
            catch
            { }
            try
            {
                if (massive1[x + 1, y] == true)
                {
                    k++;
                }
            }
            catch { }
            try
            {
                if (massive1[x - 1, y - 1] == true)
                {
                    k++;
                }
            }
            catch { }
            try
            {
                if (massive1[x, y - 1] == true)
                {
                    k++;
                }
            }
            catch { }

            try
            {
                if (massive1[x + 1, y - 1] == true)
                {
                    k++;
                }
            }
            catch { }


            if (k >  3)
            {
                massive2[x, y] = false;
            }




            if (k < 2)
            {
                massive2[x, y] = false;
            }



            if (massive2[x, y] == false)
            {
                if (k == 3)
                {
                    massive2[x, y] = true;
                }
            }



        }

    }

    return massive2;
}

А вот метод в котором и используется подсчёт соседей, на случай если ошибка в нём (resolution просто уменьшает поле и увеличивает размер клеток)

private void NextGeneration()
{
    graphics.Clear(Color.Black);





    for (int x = 0; x < cols; x++)
    {
        for (int y = 0; y < rows; y++)
        {

            if (field[x, y])
            {
                graphics.FillRectangle(Brushes.Crimson, x * resolution, y * resolution, resolution, resolution);

            }
        }
    }
    pictureBox1.Refresh();
    field = CounterNeibhours(field);
    pictureBox1.Refresh();
    Thread.Sleep(300);
}

Если нужны ещё какие-то доп данные, например, что такое rows или cols, то прошу написать, но они просто определяют размер экрана в более удобном формате Вот скриншот игры и это если что далеко не первое поколение, так что проблема в алгоритме: скриншот игры

Прошу, кому несложно, мне помочь. Код по сути несложный, думаю профессионалу станет сразу понятно, а я просто новичок.


Ответы (1 шт):

Автор решения: Stanislav Volodarskiy

Присвоение массивов в C# не создаёт новый массив, а только ещё одно имя (alias) для старого значения (original).

Сделать копию можно вызвав Clone. К сожалению, потребуется приведение типа, но вы получите новый массив-копию старого (clone):

int[,] orignal = new int[2, 3]{{1, 2, 3}, {4, 5, 6}};
int[,] alias = orignal;
int[,] clone = (int[,])orignal.Clone();

Console.WriteLine("orignal[0, 0] = " + orignal[0, 0]);
Console.WriteLine("alias[0, 0] = " + alias[0, 0]);
Console.WriteLine("clone[0, 0] = " + clone[0, 0]);

orignal[0, 0] = 10;

Console.WriteLine("orignal[0, 0] = " + orignal[0, 0]);
Console.WriteLine("alias[0, 0] = " + alias[0, 0]);
Console.WriteLine("clone[0, 0] = " + clone[0, 0]);
$ dotnet run
orignal[0, 0] = 1
alias[0, 0] = 1
clone[0, 0] = 1
orignal[0, 0] = 10
alias[0, 0] = 10
clone[0, 0] = 1
→ Ссылка