4

私は C# を使用するクラスを受講しており、最初の課題はコンウェイのライフ ゲームを実装することです。これを行うには、次のような形式のテキスト ファイルを読み込む必要があります。

 *
  *
***

          ***

次に、次の 10 世代を画面に表示する必要があります。ファイルを文字列配列に読み取ってから、それを別の配列にコピーします。次に、文字ごとに調べて、コピーした配列を変更して、次の世代がどうあるべきかを一致させます。私の問題は、生きている隣人を数えなければならないコードが機能せず、その理由がわからないことです。画面上の各セルのライブ ネイバーの数を表示しましたが、その約半分が間違っています。「ボード」の端にあるセルでエラーが発生していることはわかっていますが、修正方法がわかりません。

さて、私はすべてを私のために書いてほしくありません。それは少し無意味です。自分の論理がどこからずれているのかわかりません。どんな助けでも大歓迎です。また、私のコードが全体的にかなり貧弱であることも承知しています。これが私がそれを理解できる唯一の方法でした。ごめん。

 class Program
{
    static void Main(string[] args)
    {
        //gets file name from command arguments
        //checks to make sure file exists, exits if file does not exist
        if (!File.Exists(Environment.GetCommandLineArgs()[1])) { System.Environment.Exit(1); }

        //gets file name from command arguments then reads file into array of strings
        string[] gen0 = File.ReadAllLines(Environment.GetCommandLineArgs()[1]);

        string[] gen1 = gen0;
        char alive = '*';
        char dead = ' ';

        //displays first generation
        foreach (string s in gen0)
        {
            Console.WriteLine(s);
        }
        Console.WriteLine("=====================================");
        //counts live neighbors of a cell
        int count = 0;
        for (int i = 0; i < gen0.Length; i++)
        {
            count = 0;
            for (int j = 0; j < gen0[i].Length; j++)
            {
                //check top left neighbor
                if (i > 0 && j > 0 && j < gen0[i-1].Length )
                {
                    if (gen0[i - 1][j - 1] == alive) { count++; }
                }
                //check above neighbor
                if (i > 0 && j < gen0[i-1].Length)
                {
                    if (gen0[i - 1][j] == alive) { count++; }
                }
                //check top right neighbor
                if (i > 0 && j + 1 < gen0[i - 1].Length)
                {
                    if (gen0[i - 1][j + 1] == alive) { count++; }
                }
                //check left neighbor
                if (j > 0)
                {
                    if (gen0[i][j - 1] == alive) { count++; }
                }
                //check right neighbor
                if (j + 1 < gen0[i].Length)
                {
                    if (gen0[i][j + 1] == alive) { count++; }
                }
                //check bottom left neighbor
                if (i + 1 < gen0.Length && j > 0 && j < gen0[i+1].Length)
                {
                    if (gen0[i + 1][j - 1] == alive) { count++; }
                }
                //check below neighbor
                if (i + 1 < gen0.Length && j < gen0[i+1].Length)
                {
                    if (gen0[i + 1][j] == alive) { count++; }
                }
                //check bottom right neighbor
                if (i + 1 < gen0.Length && j + 1 < gen0[i].Length && j + 1 < gen0[i+1].Length)
                {
                    if (gen0[i + 1][j + 1] == alive) { count++; }
                }

                //Console.WriteLine(count); 
                //kills cells
                if (count < 2 || count > 3) 
                {
                    gen1[i] = gen1[i].Remove(j, 1);
                    gen1[i] = gen1[i].Insert(j, dead.ToString()); 
                }
                //births cells
                if (count == 3)
                {
                    gen1[i] = gen1[i].Remove(j, 1);
                    gen1[i] = gen1[i].Insert(j, alive.ToString());
                }
            }
        }
        foreach (string s in gen1)
        {
            Console.WriteLine(s);
        }
    } 
}
4

2 に答える 2