@MyOnAsSalat

Как найти ошибку в генерации поколения в «game of life»?

Пытаюсь сделать свою реализацию клеточного автомата "Game of life", но у меня не получается реализовать правила игры.
В чём может быть ошибка?
Генерация поколения происходит в методе next, предполагаю что там ошибка, но сообразить немогу.
using System;
using System.Security.Cryptography;
using System.Threading;


class Program
{
    static void Main()
    {
        Area a = new Area(20);
        while (true)
        {
            a.Show();
            a.Next();
            Thread.Sleep(100);
        }
    }

    class Area
    {
        bool[,] Cells;
        public int Size { get { return Convert.ToInt32(Math.Sqrt(Cells.Length)); } }
        //Конструктор поля с заданными клетками
        public Area(bool[,] cells)
        {
            this.Cells = cells;
        }
        //Конструктор поля с заданным размером
        public Area(int size)
        {
            RandomCells(out Cells, size);
        }
        //индексатор для получения клетки из поля
        public bool this[int x, int y]
        {            
            get
            {               
                return Cells[index(x), index(y)];
            }
            set
            {
                Cells[index(x), index(y)] = value;
            }
        }
        // Получение цикличного индекса вычетом по модулю
        private int index(int i)
        {            
           return i < 0 ? Size - Math.Abs(i % Size) : i % Size;
        }
        //Заполнение поля рандомными клетками
        void RandomCells(out bool[,] cells, int size)
        {
            cells = new bool[size, size];
            for (int i = 0; i < size; i++)
            {
                for (int f = 0; f < size; f++)
                {

                    cells[i, f] = rng();
                }
            }
            bool rng()
            {
                int randomvalue;
                using (RNGCryptoServiceProvider rg = new RNGCryptoServiceProvider())
                {
                    byte[] rno = new byte[5];
                    rg.GetBytes(rno);
                    randomvalue = BitConverter.ToInt32(rno, 0);
                }
                return randomvalue % 2 == 0 ? true : false;
            }
        } 
        //генерация следующего поколения
        public void Next()
        {
            bool[,] BufferCells = new bool [Size,Size];
            for (int i = 0; i < Size; i++)
            {
                for (int f = 0; f < Size; f++)
                {
                    int sum = 0; //сумма клеток вокруг клетки по индексу i f
                    sum = this[i - 1, f - 1] ? ++sum : sum;
                    sum = this[i - 1, f + 1] ? ++sum : sum;
                    sum = this[i - 1, f] ? ++sum : sum;
                    sum = this[i + 1, f - 1] ? ++sum : sum;
                    sum = this[i + 1, f + 1] ? ++sum : sum;
                    sum = this[i + 1, f] ? ++sum : sum;
                    sum = this[i, f - 1] ? ++sum : sum;
                    sum = this[i, f + 1] ? ++sum : sum;
                    
                    BufferCells[i, f] = (sum == 2 || sum == 3) ? true : false;
                }                
            }
            Cells = BufferCells;
        }
        //Вывод текущего поля в консоль
        public void Show()
        {
            Console.Clear();
            for (int i = 0; i < Size; i++)
            {
                for (int f = 0; f < Size; f++)
                {
                    Console.Write(Cells[i, f] == true ? "O" : "T");
                }
                Console.Write("\n");
            }
        }
    }
}
  • Вопрос задан
  • 126 просмотров
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
У вас неверно описано основное условие игры. Оно звучит так:
- в пустой (мёртвой) клетке, рядом с которой ровно три живые клетки, зарождается жизнь;
- если у живой клетки есть две или три живые соседки, то эта клетка продолжает жить; в противном случае, если соседей меньше двух или больше трёх, клетка умирает («от одиночества» или «от перенаселённости»)

При формализации получаем:
- Два соседа: новое состояние = старое состояние
- Три соседа: новое состояние = живая
- Иначе: новое состояние = мёртвая
У вас же при двух соседях клетка всегда становится живой.

Ну и можно слегка упростить алгоритм, если использовать не bool, а char и обозначать живую клетку как 1, мёртвую как 0. Тогда количество соседей можно посчитать просто суммируя значения, без тернарных операторов.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы