2015-03-01 2 views
0

Большое вам спасибо за всю помощь. Очень ценю всех вас. Это удивительное сообществоЗавершено finito

+0

Трудно сказать без класса «Grid». – RealSkeptic

+0

Я думаю, что мы должны использовать только одну сетку. И мы добавили файл jar в eclipse, чтобы получить доступ к сетке. Вот ссылка на направления. Http: //cobweb.cs.uga.edu/~cs1301/files/Lab07.pdf – jay

+0

Ах. Посмотрите на правила 14 и 15, затем оглянитесь на цикл вашего кода. – RealSkeptic

ответ

1

Две проблемы, которые я заметил:

  1. Вы должны обновлять сетку только после завершения обновления всех ячеек.
  2. Ваш отступ был выключен, и был } неуместен. После повторного форматирования ясно видно, что вы не охватываете все случаи, поэтому есть ячейки, которые не получают новое значение. Например, если ячейка жива, вы обрабатываете только случай, когда у нее есть 2 или 3 соседи, но нет else до этого if, и поэтому живая ячейка с 1 или 4 или более соседей никогда не обновляется.

    Вы можете подумать, что каким-то образом в этом случае код попадает в общее «другое», но на самом деле он никогда туда не попадает. Все значения ячейки «живые» или «мертвые». Таким образом, конструкция такой как:

    if (cell == aliveColor) { 
        // Handle alive cell 
    } else if (cell == deadColor) { 
        // Handle dead cell 
    } else { 
        // Handle all other cases - but there are none! 
    } 
    

    эквивалентен:

    if (cell == aliveColor) { 
        // Handle alive cell 
    } else { 
        // Handle dead cell 
    } 
    

    оригинальные «еще» никогда не достигаются, потому что нет никакого другого случая, чем «aliveColor» и «deadColor».


Ответ на ваши изменения:

  if (cell == aliveColor) 
      { 
       if (aliveNeighbors == 2 || aliveNeighbors == 3){ 
        val =1; 
        grid.setPos(row, column,val); 
       } 
       if (aliveNeighbors ==1 || aliveNeighbors == 4){ 
        val = 0; 
        grid.setPos(row,column,val); 
       } 
      } 

По какой-то причине, вы, кажется, думаете, что может быть не более 4 соседи каждой ячейки. Посмотрите на пример ячейки в вашей лаборатории документ снова:

 
⬜︎⬜︎⬛︎ 
⬛︎⬜︎⬛︎ 
⬛︎⬛︎⬜︎ 

Эта клетка имеет мертвых соседей и 3 живых из них. Фактически, каждая ячейка может иметь до 8 соседей - диагональные соседи также подсчитываются!

Но ваши правила были:

  1. Если х жив и имеет ровно 2 или 3 живых соседей, то х доживает до следующего поколения. В противном случае он умирает.
  2. Если x мертв и имеет ровно 3 живых соседних, то x жив в следующем поколении. В противном случае он остается мертвым

Это иначе переводится непосредственно else в программировании. Таким образом, вместо того, чтобы иметь второй if с дополнительным условием (если есть 1, 4,5,6,7 или 8 живых соседей ...), просто дать первый, если else:

   if (aliveNeighbors == 2 || aliveNeighbors == 3) { 
        grid.setPos(row, column, aliveColor); 
       } else { 
        grid.setPos(row, column, deadColor); 
       } 

То же Конечно, дело касается правил для мертвой клетки.

(Обратите внимание, что я также удалил val=1 и просто использовал значение напрямую, val является излишним. Также я использовал имена, которые объясняют, что такое значение, а не 1 и 0 (что, если вы хотите изменить игру на работу с зеленым и красным)?).


Одна важная вещь, которую я не заметил раньше:

do 
{ 
    row = 0; 
    column = 0; 
    generation = 0; 
    while (row <= gridSize-1){ 
     while (column <= gridSize-1){ 

Вы инициализировать как строку и столбец в ноль перед строки цикла.

Это означает, что в конце первого ряда column остается gridSize-1 и не имеет нуля. Поэтому на самом деле вы обновляете только одну строку, а затем только последний столбец каждой из других строк.

Оно должно быть:

do 
{ 
    row = 0; 
    generation = 0; 
    while (row <= gridSize-1){ 
     column = 0; 
     while (column <= gridSize-1){ 

Или вы могли бы использовать для цикла:

for (row = 0; row < gridSize; row++) { 
    for (column = 0; column < gridSize; column++) { 
     ... 

Если вы решили сделать это, не забудьте удалить row++ и column++ из внутри чтобы они не увеличивались в два раза.

+0

Мне жаль, что я не понимаю, почему все остальные утверждения не обрабатываются заключительным заявлением else. потому что, если ячейка не соответствует указанным выше критериям, она перескакивает в нижнюю часть инструкции if-else и либо изменяет значение ячейки, либо сохраняет ее мертвой. – jay

+0

@jay Почему вы думаете, что она волшебным образом скачет в нижней части if -это заявление? Оператор 'if-else' проверяет состояние. Если условие истинно, оно выполняет первый блок, если нет, он выполняет блок 'else'.Что бы заставить их перейти на 'else', который не входит в их сферу? – RealSkeptic

+0

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

1

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

+0

Не будет ли обновление сетки позаботиться об этом? – jay

+0

вы должны использовать первый сетка как есть, применяют правила игры для каждой ячейки (i, j), а затем сохраняют результат в ячейке (i, j) второй сетки. –

+0

в порядке, но как бы я это сделал? мне нужно создать новую в и если да, какой бы он был? Мне жаль, новичок, поэтому я новичок во всем этом – jay

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