-4

私はコンウェイ ライフ ゲームのコードを書いています。第 2 世代用と 1 つ。

**ルール: ライフ ゲームの宇宙は、正方形のセルの無限の 2 次元の直交グリッドであり、それぞれのセルは、生きているか死んでいるかの 2 つの可能な状態のいずれかになります。すべてのセルは、水平、垂直、または斜めに隣接するセルである 8 つの隣接セルと相互作用します。時間内の各ステップで、次の遷移が発生します。 **1.人口不足が原因であるかのように、生きている隣接セルが 2 つ未満の生きているセルは死にます。

2.2 つまたは 3 つの生きた隣人を持つ生きた細胞は、次の世代に生き続けます。

3.3 つ以上の生きている隣人を持つ生きているセルは、過密状態のように死にます。

4.ちょうど3つの生きた隣人を持つ死んだ細胞は、あたかも再生するかのように、生きた細胞になります.**

初期パターンは、システムのシードを構成します。最初の世代は、上記のルールをシード内のすべてのセルに同時に適用することによって作成されます。誕生と死は同時に発生し、これが発生する個別の瞬間はティックと呼ばれることもあります (つまり、各世代は、前のもの)。規則は繰り返し適用され続け、さらに世代が作成されます。**

ここにコードがあります

私は解決策を取得していますが、コーナーの隣人をチェックしていないため、正しい解決策が得られないと思います。私はその部分をマークしました

**

    window.conway =
    {
    };
    window.conway.maingame =
    {
    };
    conway.maingame = function(width, height)
    {
        window.a = [];
        this.width = width;
        this.height = height;
        this.map = new Array(width);
        for( i = 0; i < this.width; i++)
        {
            this.map[i] = new Array(height);
        }
        console.log(this.map, "map")
    }
    conway.maingame.prototype.randomize = function()
    {
        for( y = 0; y < this.height; y++)
        {
            //console.log("enter for loop")
            for( x = 0; x < this.width; x++)
            {
                if(Math.random() > .5)
                {
                    i =true;
                }
                else
                {
                    i = false;
                }
                //console.log("enter function")
                this.set(x, y, i);
            }
        }
    }
    conway.maingame.prototype.set = function(x, y, val)
    {
        x = x % this.width;
        y = y % this.height;
        this.map[x][y] = val;
        console.log(this.map, "map2");
    }
    conway.maingame.prototype.get = function(x, y)
    {
        x = x % this.width;
        y = y % this.height;
        return this.map[x][y];
    }
    *********************************************************************************
conway.maingame.prototype.neighbors = function(x, y)
    {
        count = 0;
        if(x > 0 && y > 0 && this.get(x + 1, y + 1))
        {
            console.log(this.get(x + 1, y + 1), "value neighbor");
            count++;
            console.log(count);
        }
        if(x > 0 && y > 0 && this.get(x + 1, y))
        {
            console.log(this.get(x + 1, y), "vallue neighbor");
            count++;
            console.log(count);
        }

        if(x > 0 && y > 0 && this.get(x + 1, y - 1))
        {
            console.log(this.get(x + 1, y - 1), "vallue neighbor");
            count++;
            console.log(count);
        }

        if(x > 0 && y >=0 && this.get(x, y - 1))
        {
            console.log(this.get(x + 1, y - 1), "vallue neighbor");
            count++;
            console.log(count);
        }

        if(x > 0 && y > 0 && this.get(x - 1, y - 1))
        {
            console.log(this.get(x + 1, y - 1), "vallue neighbor");
            count++;
            console.log(count);
        }

        if(x > 0 && y > 0 && this.get(x - 1, y))
        {
            console.log(this.get(x + 1, y - 1), "vallue neighbor");
            count++;
            console.log(count);
        }

        if(x > 0 && y > 0 && this.get(x - 1, y + 1))
        {
            console.log(this.get(x + 1, y - 1), "vallue neighbor");
            count++;
            console.log(count);
        }

        if(x > 0 && y > 0 &&this.get(x, y + 1))
        {
            console.log(this.get(x + 1, y - 1), "vallue neighbor");
            count++;
            console.log(count);
        }

        return count;
    }***
    conway.maingame.prototype.newgeneration = function()
    {
        var newMap = new Array(this.width);
        for( i = 0; i < this.width; i++)
        {
            newMap[i] = new Array(this.height);
        }
        for(var y = 0; y < this.height; y++)
        {
            for(var x = 0; x < this.width; x++)
            {
                console.log("enter all for");
                newMap[x][y] = this.get(x, y);
                console.log(newMap, "newarray");
                //Rule 1: any live cell with fewer than two live neighbors dies
                if(this.get(x, y) == true && this.neighbors(x, y) < 2)
                {
                    newMap[x][y] = false;
                    console.log("rule1");
                }
                //Rule 2: Any live cell with two or three live neighbours lives on to the next generation
                if(this.get(x, y) == true && this.neighbors(x, y) == 2 || this.neighbors(x, y) == 3)
                {
                    newMap[x][y] = true
                    console.log("rule2");
                }
                //Rule 3: any live cell with more than three live neighbors dies
                if(this.get(x, y) == true && this.neighbors(x, y) > 3)
                {
                    newMap[x][y] = false;
                    console.log("rule3");
                }
                //Rule 4: any dead cell with exactly three live neighbors becomes a live cell
                if(this.get(x, y) == false && this.neighbors(x, y) == 3)
                {
                    newMap[x][y] = true;
                    console.log("rule4");
                }
            }
        }
        this.map = newMap;
    console.log(this.map,"new generation")
    }

**
4

1 に答える 1

3

私はあなたのコードを JSHint で調べ、すべての問題を修正し、ブラウザでテストするための接着剤を書きました。結果はjsfiddleです。

私にはうまくいっているように見えるので、問題は JSHint がフラグを立てた数十の警告の 1 つが原因だったに違いないと思います。

Re: 問題はコーナーが原因であるというあなたの主張、それがこれらの行の目的です:

  x = x % this.width;
  y = y % this.height;

私のテスト ケースでは 10 x 10 を使用しているので、その隣人をチェックするときは(9,9)(10, 10)is(10 % 10, 10 % 10)(0, 0)見て、配列の外を見ることを避けます。これがトロイダルアレイと呼ばれるものだと思います。

これから私たちが学ぶ教訓は?小さな問題を把握しておくと、大きな問題は自然に解決します。

于 2012-06-28T20:08:47.783 に答える