正确打印2D阵列?

时间:2013-02-07 22:28:09

标签: c# multidimensional-array

目前正致力于用C#写一个Conways生活。我一直在采取一些小步骤来完成语言和游戏编程,并且在打印我的2D字符数组时遇到了麻烦。目前我正在使用GetLength - 1来不越过边界,但它无法打印出数组中的最后一个字符。

我的初始文件是什么样的

 +*++
 ++*+
 ****

读入后放入Char(我相信)

 *  
  * 
****

最终打印的内容

  *

**



using System;
using System.IO;
using System.Collections.Generic;
using System.Text;

namespace ConwaysLife
{
    class Program
    {
        static char[,] universe;
        static void bigBang(int h, int w, List<string> grid)
        {
            universe = new char[h,w];

            int row = 0;

            foreach (string line in grid)
            {

                for (int i = 0; i < line.Length; i++)
                {
                    if (line.ToCharArray()[i] == '*')
                    {
                        universe[row, i] = '*';
                    }
                }
                row++;
            }
        }

         //How I'm attempting to print out my 2D char array
        static void offspring()
        {
            StringBuilder cellLine = new StringBuilder();
            for (int y = 0; y < universe.GetLength(1)-1; y++)
             {
                for (int x = 0; x < universe.GetLength(0)-1; x++)
                {
                    Console.Write(universe[y, x]);
                }
                Console.WriteLine();                
            }
            //pause
            Console.ReadLine();
        }

        static void Main(string[] args)
        {
            List<string> tempLine = new List<string>();

            //Console.WriteLine("File Path?");
            int width = 0;
            int height = 0;

            //read file into List
            using (StreamReader r = new StreamReader("life.txt"))
            {
                while (r.Peek() >= 0)
                {
                    tempLine.Add(r.ReadLine());

                    //compare current width to new width
                    if (tempLine[height].Length >= width) { width = tempLine[height].Length; }

                    //increase height when going to next row
                    height++;
                }
                bigBang(height, width, tempLine);
            }
            offspring();
        }
    }
}

更新后代()

static void offspring()
        {
            StringBuilder cellLine = new StringBuilder();
            for (int x = 0; x <= universe.GetLength(1); x++)
            {
                for (int y = 0; y <= universe.GetLength(0); y++)
                {
                    Console.Write(universe[x, y]);
                }
                Console.WriteLine();
            }
            //pause
            Console.ReadLine();
        }

3 个答案:

答案 0 :(得分:0)

您的offspring功能中有一个错误的错误。请注意,您在bigBang函数中正确执行了此操作。

您正在x < GetLength()-1进行循环播放。您只需要x < GetLength(),因为这排除了x == GetLength()时的情况。

一个类似的循环:

for (i = 0; i < 4; i++) 
   Console.WriteLine(i);

输出:

  

0
  1
  2
  3

答案 1 :(得分:0)

我不熟悉游戏原则,但您的offspring方法存在问题。

y < universe.GetLength(1)-1

这会转换为y < 3 - 1y < 2,使您的迭代从y = 0变为1.

要修复,只需删除-1的两个出现。

        for (int y = 0; y < universe.GetLength(1); y++)
        {
            for (int x = 0; x < universe.GetLength(0); x++)
            {

此外,当您访问universe时,您的指数会被反转。

Console.Write(universe[y, x]);

你正在使用y变量访问行,x用于列。反过来应该这样做:

Console.Write(universe[x, y]);

给出

的最终结果
++*
*+*
+**
++*

答案 2 :(得分:0)

虽然我会深入研究为什么它没有像我预期的那样工作,但是当我将它创建到我的后代()并在打印时使用这些值时,我只是简单地传递了数组的大小。一旦完成那么小的改变,输出就会按预期发出。

 *  
  * 
****