C# клеточные автоматы, вопрос про кузнечиков - PullRequest
0 голосов
/ 27 мая 2020

Я вроде как новичок в программировании .. Я пытаюсь написать простой компонент для кузнечика о клеточных автоматах. Идея состоит в том, что компонент начинается с массива из 1 и 0, принимает входную «итерацию» в виде того, сколько поколений клеточных автоматов, согласно правилам, выводят либо «1», либо «0» в качестве списка результатов. Я столкнулся с проблемой, что мой код не регистрирует изменения, может кто-нибудь помочь? Ниже мой код, пожалуйста, помогите, спасибо!

   private CA myCA;
  protected override void RegisterInputParams(GH_Component.GH_InputParamManager pManager)
        {
            pManager.AddIntegerParameter("Iterations", "Iterations", "Iterations", GH_ParamAccess.item);
        }


        protected override void RegisterOutputParams(GH_Component.GH_OutputParamManager pManager)
        {
            pManager.AddIntegerParameter("Boolean", "Boolean", "Boolean", GH_ParamAccess.list);
        }


        protected override void SolveInstance(IGH_DataAccess DA)
        {

            int iIteration = 0;
            DA.GetData("Iterations", ref iIteration);

            myCA = new CA();
            myCA.start();

           if (myCA.generation<iIteration) myCA.Generate();

            DA.SetDataList("Boolean", myCA.Display());

        }``` 



``` namespace TestProject
{
    public class CA
    {

        List<int> cell = new List<int>();
        List<int> nextCell = new List<int>();
        public int[] cells;
        public int generation;
        public int[] ruleset = { 0, 1, 0, 1, 1, 0, 1, 0 };


        public CA()
        {

        }
        public void start()
        {
            cells = new int[100];// may need a list to record all the numbers in the generation
            for (int i = 0; i < 100; i++)
            {
                cells[i] = 0;
            }
            cells[cells.Length / 2] = 1;    // arbitrarily start with just the middle cell having a state of "1"
            generation = 0;
        }

        public void Generate()
        {
            int[] nextGen = new int[100];

            for (int i = 1; i < 99; i++)
            {
                int left = cells[i - 1];
                int me = cells[i];
                int right = cells[i + 1];
                nextGen[i] = Rules(left, me, right);//may need a list to record these outcomes, next gen will show up as a list as well.

                cells = nextGen;
                generation += 1;
            }
        }

        public int Rules(int a, int b, int c)
        {
            if (a == 1 && b == 1 && c == 1) return ruleset[0];
            if (a == 1 && b == 1 && c == 0) return ruleset[1];
            if (a == 1 && b == 0 && c == 1) return ruleset[2];
            if (a == 1 && b == 0 && c == 0) return ruleset[3];
            if (a == 0 && b == 1 && c == 1) return ruleset[4];
            if (a == 0 && b == 1 && c == 0) return ruleset[5];
            if (a == 0 && b == 0 && c == 1) return ruleset[6];
            if (a == 0 && b == 0 && c == 0) return ruleset[7];
            return 0;
        }


       public List<int> Display()
        {

            List<int> BO = new List<int>();

            for (int i = 0; i < cells.Length; i++)
            {
                if (cells[i] == 1) BO.Add(1);
                else if (cells[i] == 0) BO.Add(0);

            }


            return BO;

        }
    }
} ```

...