2
import processing.core.PApplet; 

    public class gl extends PApplet { 

    static int neighborCount; 
    static int screenRows; 
    int tNC; // Temporary Neighbor Count 
    int newState; 

    int columns = 960; 
    int rows = 477; 

    int[][] cells = new int[columns][rows]; 
    int[][] newGen = new int[columns][rows]; 

    public static void main(String[] args) { 
     PApplet.main("gl"); 
    } 

    public void settings() { 
     size(1920, 955); 
    } 

    public void setup() { 
     // Set background white and all of cells[][] to 0 or 1 
     screenRows = 0; 
     background(255); 
     for (int j = 0; j < (rows/2); j++) { 
      for (int i = 0; i < (columns/2); i++) { 
       cells[i][j] = (int) random(0, 2); 
      } 
     } 
    } 

    public void draw() { 
     // If program has finished generating this frame, reset everything and set cells[][] equal to newGen[][] 
     if (screenRows > (height/2)) { 
      screenRows = 0; 
      System.out.println("End of generation reached"); 
      background(255); 
      cells = newGen.clone(); 
      for (int i = 0; i < columns; i++) { 
       for (int j = 0; j < rows; j++) { 
        newGen[i][j] = 0; 
       } 
      } 
     } 
     // Go through every element in cells[][], determine it's value, and display it 
     for (int x = 1; x < (width/2) - 1; x++) { 
      for (int y = 1; y < (height/2) - 1; y++) { 

       printCell(x, y); 
      } 
     } 
     screenRows++; 

    } 

    public void printCell(int x, int y) { 
     setCellState(x, y); 

     if (newGen[x][y] == 0) { 
      stroke(255); 
      fill(255); 

     } else if (newGen[x][y] == 1) { 
      stroke(0); 
      fill(0); 

     } 
     System.out.println(x + ", " + y); 
     rect(x, y, 2, 2); 
    } 

    public void setCellState(int x, int y) { 
     tNC = getNeighborCount(x, y); 
     neighborCount = 0; 
     System.out.println(tNC); 

     if (tNC < 2) { // If less than 2 neighbors, cell dead 
      newGen[x][y] = 0; 

     } else if (tNC > 3) { // If more than 3 neighbors, cell dead 
      newGen[x][y] = 0; 

     } else if ((tNC == 2 || tNC == 3) && cells[x][y] == 1) { // If 2 or 3 neighbors and cell is alive, do nothing (unnecessary statement but makes visualizing easier) 

     } else if (tNC == 3 && cells[x][y] == 0) { // If 3 neighbors and cell is dead, cell is alive 
      newGen[x][y] = 1; 

     } else if (tNC == 2 && cells[x][y] == 0) { // If 2 neighbors and cel is dead, do nothing (also unnecessary) 

     } else { 
      System.out.println("Error in setCellState(int, int);"); // In event of none of the conditions being met 
     } 
     tNC = 0; // Reset variable (probably unnecessary but might as well) 
    } 

    public int getNeighborCount(int x, int y) { 
     // Go through each cell adjacent or diagonal to the cell and add it's value (0 or 1) to neighborCount 
     for (int i = -1; i < 2; i++) { 
      for (int j = -1; j < 2; j++) { 
       neighborCount += cells[i + x][j + y]; 
      } 
     } 
     // Subtract the value of the cell being evaluated from neighborCount as that is not a factor in the sum of the neighbors 
     neighborCount -= cells[x][y]; 
     return neighborCount; 
    } 
} 

PastebinИгра жизни Обработка

Я просто хочу для функциональности по скорости, на данный момент.

Я пытаю код игры Конвея жизни с помощью обработки в Eclipse. Приведенный выше код дисфункционален несколько способов:

отображается поколение появляется намного меньше в окне, чем я хочу быть. Это занимает лишь часть окна, несмотря на мои попытки уравновесить это, сделав каждую ячейку размером 2x2 пикселя и половиной числа строк и столбцов, так как окно является высоким и широким.

Кроме того, генерация не появляется для обновления в окне после первого поколения появится через несколько секунд.

Я заметил, что переменная TNC часто равна 0, когда оно должно быть равно любому числу от 0 до 7.

ответ

2

У вас есть три основные проблемы.

Проблема 1: Вы, кажется, генерации нового поколения, как вы оказываете клетки, что может быть хорошо ... но что вы делаете с screenRows логику (if заявление в вашей draw() функции)?

Если бы я тебя, я бы разделить логику на две части: написать одну функцию, которая черпает свою доску и другую функцию, которая возвращает новую плату, основанную на текущем. Не пытайтесь рассчитать следующее поколение, когда вы рисуете текущее поколение, так как это просто даст вам массу головных болей.

Я также не думаю, что ваша логика для переключения между массивами является правильной. Какой массив содержит текущее поколение и который содержит следующее поколение? Ты уверен?

Проблема 2: Вы, кажется, переключаетесь между размерами пикселей и координатами массива. Например, вы рисуете каждую ячейку по координате индекса массива, но вы рисуете их как прямоугольники 2x2. Это не составляет тонны смысла, так как вы все равно будете рисовать поверх нее со следующей ячейкой. Опять же, отделить логику: создать функцию, которая рисует ячейку на основе окна width и height, с позицией массива, и длиной массива.

Задача 3: Ваши заявления о печати убивают вашу частоту кадров. Заявления о печати заведомо медленны. Из-за всех вычислений ваша частота кадров довольно медленная, но она становится еще медленнее, когда вы печатаете (960 * 477 * 2) вещи в каждом отдельном фрейме. На самом деле это не логическая ошибка, но сложнее понять, что именно делает ваша программа.

Чтобы исправить возникшие проблемы, я рекомендую реорганизовать ваш код совсем немного. Если бы я был вами, я бы начал с новой программы. Затем:

Шаг 1: Отделите логику рисования от логики для расчета следующего поколения. Создайте две функции: одну для рисования и другую, которая возвращает новый массив на основе текущего.

Шаг 2: В коде чертежа убедитесь, что вы разделяете индексы массивов и позиции пикселей. Возможно, напишите еще одну функцию, которая занимает позицию ячейки и рисует прямоугольник на основе размера окна и размера массива.

PS: Вы в том же классе, как this person? Вы тоже используете код Даниэля Шиффмана?

+0

Я пробовал ваши предложения и начинал заново, и это, безусловно, более аккуратно, компактнее и читаемо, но все еще не работает. Я продолжу пробовать какое-то время, прежде чем, возможно, вернусь сюда для дальнейших консультаций. Я не из этого класса с этим человеком, однако я прочитал главу книги Даниэля Шиффмана для руководства (но я думаю, что большая часть моего кода оригинальна, или, по крайней мере, я лично это придумал). – sirmax224

+0

Если вы снова застряли, я предлагаю создать новый пост с вашим новым кодом. Я буду рад продолжать пытаться помочь. О, и я не обвинял вас в краже кода или что-то еще, я просто подумал, что это интересное совпадение! –

+0

Я считаю, что я добился прогресса, но моя Игра Жизни не совсем функциональна. Кажется, что-то неправильно подсчитывает окрестности или неправильно интерпретирует сумму или что-то в этом роде. Не могли бы вы помочь? Спасибо http://stackoverflow.com/questions/38382356/why-are-the-generations-in-my-game-of-life-using-processing-out-of-order – sirmax224

Смежные вопросы