Элементарные клеточные автоматы Wolfram с использованием обработки

Я использую фрагмент кода, взятый с веб-сайта The Nature of Code — https://natureofcode.com/book/chapter-7-cellular-automata/ — часть, которую я использовал, взята из примера 7.1. Я пытаюсь создать одномерный клеточный автомат с помощью Processing IDE, но постоянно получаю сообщение об ошибке, говорящее о том, что скобки отсутствуют в определенных местах.

Ошибки: - Отсутствует фигурная скобка "}", строка 32 - Синтаксическая ошибка в "}", удалите это, строка 40

Я прошел через это несколько раз, но я не вижу, как это неправильно. Хотя я пытался изменить их, как говорится, только чтобы получить больше ошибок. Я думал, может быть, они были просто не в том месте, но я также не понимаю, как это происходит. Насколько я могу судить, они кажутся правильными, но, возможно, я что-то упускаю. Я впервые использую Processing, и прошло много времени с тех пор, как я в последний раз использовал Java. Так что, возможно, я ошибаюсь.

class CA {
  int[] cells;
  int[] ruleset;
  int w = 10;
  // The CA should keep track of how
  // many generations.
  int generation = 0;
  CA() {
    cells = new int[width/w];
    ruleset = new int[]{0,1,0,1,1,0,1,0};
    cells[cells.length/2] = 1;
  }

  // Function to compute the next generation
  void generate() {
    int[] nextgen = new int[cells.length];
    for (int i = 1; i < cells.length-1; i++) {
      int left   = cells[i-1];
      int me     = cells[i];
      int right  = cells[i+1];
      nextgen[i] = rules(left, me, right);
    }
    cells = nextgen;
    // Increment the generation counter.
    generation++;
  }

  int rules(int a, int b, int c) {
    String s = "" + a + b + c;
    int index = Integer.parseInt(s,2);
    return ruleset[index];
  }

  for (int i = 0; i < cells.length; i++) {
    if (cells[i] == 1) fill(0);
    else               fill(255);
    // Set the y-location according to the generation.
    rect(i*w, generation*w, w, w);
  }
}

Предполагается, что программа печатает каждое поколение одномерного CA поверх следующего.


person Chad Leftwich    schedule 23.01.2019    source источник
comment
Возможно, вам нужен цикл for в строке 34 в методе? Кроме того, поместите фигурные скобки в строки 35 после '(cells[i] == 1)' и после else.   -  person CrashBandicoot    schedule 23.01.2019
comment
Фигурные скобки вокруг блоков кода одной команды, таких как fill(0); и fill(2555);, не нужны.   -  person hlg    schedule 23.01.2019


Ответы (1)


Цикл for в конце класса CA не должен быть там. Вот почему вы получаете ошибку: парсер ожидает либо объявление метода, либо конец класса, следовательно, фигурную скобку.

Похоже, что этот цикл на самом деле рисует состояние CA, так что вы можете попробовать обернуть его в метод void draw(){}. Тогда он должен быть синтаксически правильным, но не уверен, что он работает так, как ожидалось. В качестве альтернативы переместите цикл for за пределы класса и вызовите fill на основе состояния cells экземпляра класса CA.

В любом случае потребуется дополнительный код, создающий экземпляр CA и вызывающий функцию generate.

person hlg    schedule 23.01.2019
comment
Удаление цикла for избавляет от ошибки. Спасибо за помощь! - person Chad Leftwich; 24.01.2019