2012-04-11 2 views
0

Я пишу программу игры Жизни в C#. Я использую 2D-массив структур. Кажется, когда я показываю метод Random, что алгоритм соседей или что-то не так. Когда он проходит через поколения, случайные клетки приходят «живыми», когда они не должны. Любая помощь?Ошибка игры в жизни

public struct cellDetail 
{ 
    public int curGenStatus; 
    public int nextGenStatus; 
    public int age; 

} 
public class Class1 
{ 

    static cellDetail[,] Generations(cellDetail[,] cells) 
    { 

     int neighbours = 0; 

     for (int i = 0; i < 40; i++) 
      for (int j = 0; j < 60; j++) 
       cells[i, j].nextGenStatus = 0; 

     for (int row = 0; row < 39; row++) 
      for (int col = 0; col < 59; col++) 
      { 
       neighbours = 0; 

       if (row > 0 && col > 0) 
       { 
        if (cells[row - 1, col - 1].curGenStatus > 0) 
         neighbours++; 
        if (cells[row - 1, col].curGenStatus > 0) 
         neighbours++; 
        if (cells[row - 1, col + 1].curGenStatus > 0) 
         neighbours++; 

        if (cells[row, col - 1].curGenStatus > 0) 
         neighbours++; 
        if (cells[row, col + 1].curGenStatus > 0) 
         neighbours++; 

        if (cells[row + 1, col - 1].curGenStatus > 0) 
         neighbours++; 
       } 

       if (cells[row + 1, col].curGenStatus > 0) 
        neighbours++; 
       if (cells[row + 1, col + 1].curGenStatus > 0) 
        neighbours++; 

       if (neighbours < 2) 
        cells[row, col].nextGenStatus = 0; 
       if (neighbours > 3) 
        cells[row, col].nextGenStatus = 0; 
       if ((neighbours == 2 || neighbours == 3) && cells[row, col].curGenStatus > 0) 
        cells[row, col].nextGenStatus = 1; 
       if (neighbours == 3 && cells[row, col].curGenStatus == 0) 
        cells[row, col].nextGenStatus = 1; 
      } 

     for (int i = 0; i < 40; i++) 
      for (int j = 0; j < 60; j++) 
       cells[i, j].curGenStatus = cells[i, j].nextGenStatus; 

     return cells; 
    } 

    static void PrintCells(cellDetail[,] cells) 
    { 
     for (int row = 0; row < 40; row++) 
     { 
      for (int col = 0; col < 60; col++) 
      { 
       if (cells[row, col].curGenStatus != 0) 
       { 
        cells[row, col].curGenStatus = (char)30; 
        Console.Write((char)cells[row, col].curGenStatus); 
       } 
       else 
        Console.Write(" "); 
      } 
     } 
    } 

    public static void Random(int numOfGenerations) 
    { 
     cellDetail[,] cells = new cellDetail[40,60]; 
     Random rand = new Random(); 

     for (int row = 0; row < 40; row++) 
      for (int col = 0; col < 60; col++) 
       cells[row, col].curGenStatus = rand.Next(0, 2); 

     for (int i = 0; i < numOfGenerations; i++) 
     { 
      Console.ForegroundColor = (ConsoleColor.Green); 
      Generations(cells); 
      Console.SetCursorPosition(0, 3); 
      PrintCells(cells); 
     } 

    } 
} 
+0

Если у этого есть домашняя бирка? – Servy

+2

Я не смотрел достаточно внимательно, чтобы понять, является ли это вашей основной проблемой, но вы не должны создавать множество объектов «Случайный» за короткий промежуток времени. По умолчанию они посеяны текущим временем. Короткий ответ - просто создайте «Случайный» один раз и сохраните его, чтобы вы могли неоднократно вызывать «.Next». – Servy

+0

Да, должна быть домашняя бирка. Я отметил его. –

ответ

5

Случайный объект должен быть создан только один раз и используется всеми объектами class.By объявляющих его как статический член класса это может быть achieved.A лучшим вариантом было бы создать одноплодной вспомогательный класс для случайного объекта.

+3

Позволяет использовать правильную терминологию, чтобы не путать людей. «Static» имеет определенное значение в C#. Я считаю, что вы намереваетесь «один экземпляр». –

+0

Из описания проблемы я не думаю, что это единственная проблема, и, вероятно, не тот, о котором спрашивает ОП, но все еще настоящая проблема, которую он имеет. – Servy

+0

@Boo В этом случае метод, использующий его, является статическим, поэтому он должен быть статическим полем. –

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