Ошибка в игре "Жизнь"
В коде, написанном на 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 шт):
Присвоение массивов в 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