2

現在、クラス用に C# で Conways の生活を書いています。私は言語とゲーム プログラミング全般に慣れるために小さなステップを踏んでいますが、2D char 配列を印刷する際に問題が発生しました。現在、私は 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();
        }
4

3 に答える 3

0

期待どおりに機能しなかった理由について詳しく説明しますが、配列を作成したときに配列のサイズを単に offspring() に渡し、それらの値を印刷時に使用しました。その小さな変更が完了すると、期待どおりの出力が得られました。

 *  
  * 
****
于 2013-02-10T23:23:05.050 に答える
0

関数に off-by-one エラーがありますoffspring。関数で正しく実行していることに注意してくださいbigBang

while をループしていx < GetLength()-1ます。が必要なだけx < GetLength()ですx == GetLength()

類似のループ:

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

出力:

0
1
2
3

于 2013-02-07T22:35:52.570 に答える
0

私はゲームの原理に詳しくありませんが、あなたのoffspringやり方には問題があります。

y < universe.GetLength(1)-1

y < 3 - 1これはorに変換されy < 2、反復を y = 0 から 1 にします。

修正するには、 の 2 つのオカレンスを削除するだけです-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]);

の最終出力を与える

++*
*+*
+**
++*
于 2013-02-07T22:44:08.383 に答える