2014-09-12 86 views
0

我基本上正在尝试做生命游戏。一切似乎都很好,大多数情况下它按我的意愿工作。但由于某些原因,当我打印出来并使其播放时,它会并排打印数组的两个不完整部分。一半左右的细胞在右边,另一半在左边。我不知道自己做错了什么,我之前用类似的方法打印2d数组,所以这让我很困惑。下面的代码。C#打印二维数组打印分割

class Program 
{ 
    static void Main(string[] args) 
    { 
     GameOfLife myGame = new GameOfLife(); 
     myGame.Start(); 
    } 
} 
class GameOfLife 
{ 
    private int[,] grid = { 
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, 
    { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}; 

    private int[,] tempGrid; 

    public GameOfLife() 
    { 
     tempGrid = new int[grid.GetLength(0), grid.GetLength(1)]; 
    } 

    public void Start() 
    { 
     Setup(); 

     do 
     { 
      Thread.Sleep(30); 
      UpdateGrid(); 
      CopyTempGridToGrid(); 
      PrintGrid(); 
     } while (!Console.KeyAvailable); 

     Console.WriteLine(); 
    } 

    private void UpdateGrid() 
    { 
     for(int r = 0; r < grid.GetLength(0); r++) 
     { 
      for(int c = 0; c < grid.GetLength(1); c++) 
      { 
       tempGrid[r, c] = UpdateCell(r, c); 
      } 
     } 
    } 

    private void CopyTempGridToGrid() 
    { 
     Array.Copy(tempGrid, grid, tempGrid.Length); 
    } 

    private void PrintGrid() 
    { 
     Console.CursorTop = 2; 

     for (int r = 0; r < grid.GetLength(0); r++) 
     { 
      for (int c = 0; c < grid.GetLength(1); c++) 
      { 
       if (grid[r, c] == 0) 
       { 
        Console.BackgroundColor = ConsoleColor.Blue; 
        Console.ForegroundColor = ConsoleColor.Blue; 
        Console.Write("."); 
       } 
       else 
       { 
        Console.ForegroundColor = ConsoleColor.Yellow; 
        Console.ForegroundColor = ConsoleColor.Yellow; 
        Console.Write("."); 
       } 
      } 
     } 
    } 

    private int GetNeighbors(int row, int col) 
    { 
     int neighbors = 0; 
     try 
     { 
      if (grid[row - 1, col - 1] == 1) 
       neighbors++; 
      if (grid[row - 1, col] == 1) 
       neighbors++; 
      if (grid[row - 1, col + 1] == 1) 
       neighbors++; 
      if (grid[row, col - 1] == 1) 
       neighbors++; 
      if (grid[row, col + 1] == 1) 
       neighbors++; 
      if (grid[row + 1, col - 1] == 1) 
       neighbors++; 
      if (grid[row + 1, col] == 1) 
       neighbors++; 
      if (grid[row + 1, col + 1] == 1) 
       neighbors++; 
     } 
     catch (IndexOutOfRangeException) { } 
     return neighbors; 
    } 

    private int UpdateCell(int row, int col) 
    { 
     int n = GetNeighbors(row, col); 

     if (n <= 1) 
      return 0; 
     if (n == 2) 
      return grid[row, col]; 
     if (n == 3) 
      return 1; 
     else 
      return 0; 
    } 

    private void Setup() 
    { 
     Console.Clear(); 
     Console.CursorVisible = false; 
     Console.WriteLine("Press any key to stop"); 
     PrintGrid(); 
    } 
} 
+1

对稀疏数组进行硬编码是错误的。我会编写插入简单的基元(现在你只有4行),初始化空白数组,然后做4行插入(x,y,长度)。当你想研究不同的[人生游戏原始游戏](http://en.wikipedia.org/wiki/Conway's_Game_of_Life#Examples_of_patterns)随着时间的推移,你会感谢你自己。 – Neolisk 2014-09-12 15:01:47

+0

是的,当然,我的计划是做不同的事情,但我想先解决另一个问题。你认为这是阵列打印并列的根源吗? – user3066571 2014-09-12 15:07:54

+0

'阵列的根部并排分割?'< - 我不明白你的问题。请详细说明。 – Neolisk 2014-09-12 15:10:17

回答

3

虽然内PrintGrid()中的环具有内表面和外嵌套循环,它们不输出每一行后换行。我会尝试内部和外部循环之间的Console.Writeln(“”)。

+0

你是先生,是个天才 – user3066571 2014-09-12 15:13:53