-3

重複の可能性:
JavaScript でのコンウェイ ゲーム オブ ライフ ( best sol

コンウェイの人生ゲームのコードを書いています。私は2つの配列を取ります。1 つは旧世代用、もう 1 つは 2 世代用です。ルールを実装しようとすると、コンソールにエラーが表示されます:

TypeError: Cannot read property '-1' of undefined

値が -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)
    {
        n = 0;
        if(this.get(x + 1, y + 1))
        {
            n++;
        }
        if(this.get(x + 1, y))
        {
            n++;
        }
        if(this.get(x + 1, y - 1))
        {
            n++;
        }
        if(this.get(x, y - 1))
        {
            n++;
        }
        if(this.get(x - 1, y - 1))
        {
            n++;
        }
        if(this.get(x - 1, y))
        {
            n++;
        }
        if(this.get(x - 1, y + 1))
        {
            n++;
        }
        if(this.get(x, y + 1))
        {
            n++;
        }
        return n;
    }

    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);

                if(this.neighbors(x, y) = undefined)
                {
                    for( k = 0; k < this.width+1; k++)
                    {
                        arr[k]=[];
                        for( f = 0; f < this.height+1; f++)
                        {
                                arr[j]=this.neigbors(x,y);
                                arr.pop();
                        }
                    }
                }
 //Error is in this part of the code    
                //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;
                }

                //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

                }

                //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;
                }

                //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;
                }
            }
        }

        this.map = newMap;
    }

もたらされた変化

このコードの変更後でも、私の答えは正しくありません。どうしてか言ってくれない?

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), "vallue 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;
}
4

2 に答える 2

2

比較に使用==します (または===)。課題に使用=します。

この行は間違っています:

if(this.neighbors(x, y) = undefined)

割り当てではなく、比較する必要があります。

編集:2番目のエラーを修正するには

あなたがマークした行が問題を引き起こしている行ではないことは 99% 確信しています。コンソール エラーを確認し、回線番号を注意深く確認してください。

存在しないセルを参照しようとしているため、問題が発生していると確信しています。エッジの周りのセルを考えてみましょう。外側には隣接セルはありません。コードを変更して、配列の範囲外に移動していないことを確認する必要があります。

    ...

    if (y > 0 && this.get(x, y - 1)) {
        n++;
    }

    ... etc. ...

おまけのヒント: 開き括弧は常に同じ行に置きます。

于 2012-06-28T12:11:36.947 に答える
2

編集:この質問の複製に関する私の回答を参照してください。

jsHintのような検査ツールを使用してコードを実行する価値があります。

Line 11: window.a = []; 

Missing "use strict" statement.


Line 19: console.log(this.map, "map") 

Missing semicolon.


Line 20: } 

Missing semicolon.


Line 24: for( y = 0; y < this.height; y++) 

Missing "use strict" statement.


Line 26: console.log("enter for loop") 

Missing semicolon.


Line 29: if(Math.random() > .5) 

A leading decimal point can be confused with a dot: '.5'.


Line 37: console.log("enter function") 

Missing semicolon.


Line 42: } 

Missing semicolon.


Line 46: x = x % this.width; 

Missing "use strict" statement.


Line 51: } 

Missing semicolon.


Line 56: x = x % this.width; 

Missing "use strict" statement.


Line 59: } 

Missing semicolon.


Line 63: n = 0; 

Missing "use strict" statement.


Line 97: } 

Missing semicolon.


Line 102: var newMap = new Array(this.width); 

Missing "use strict" statement.


Line 112: console.log("enter all for") 

Missing semicolon.


Line 115: if(this.neighbors(x, y) = undefined) 

Expected a conditional expression and instead saw an assignment.


Line 129: if(this.get(x, y) == true && this.neighbors(x, y) < 2) 

Expected '===' and instead saw '=='.


Line 135: if(this.get(x, y) == true && this.neighbors(x, y) == 2 || this.neighbors(x, y) == 3) 

Expected '===' and instead saw '=='.


Line 135: if(this.get(x, y) == true && this.neighbors(x, y) == 2 || this.neighbors(x, y) == 3) 

Expected '===' and instead saw '=='.


Line 135: if(this.get(x, y) == true && this.neighbors(x, y) == 2 || this.neighbors(x, y) == 3) 

Expected '===' and instead saw '=='.


Line 137: newMap[x][y] = true 

Missing semicolon.


Line 142: if(this.get(x, y) == true && this.neighbors(x, y) > 3) 

Expected '===' and instead saw '=='.


Line 148: if(this.get(x, y) == false && this.neighbors(x, y) == 3) 

Expected '===' and instead saw '=='.


Line 148: if(this.get(x, y) == false && this.neighbors(x, y) == 3) 

Expected '===' and instead saw '=='.


Line 156: } 

Missing semicolon.


Line 8: conway.maingame = function(width, height) 

'conway' is not defined.


Line 15: for( i = 0; i < this.width; i++) 

'i' is not defined.


Line 15: for( i = 0; i < this.width; i++) 

'i' is not defined.


Line 15: for( i = 0; i < this.width; i++) 

'i' is not defined.


Line 17: this.map[i] = new Array(height); 

'i' is not defined.


Line 19: console.log(this.map, "map") 

'console' is not defined.


Line 22: conway.maingame.prototype.randomize = function() 

'conway' is not defined.


Line 24: for( y = 0; y < this.height; y++) 

'y' is not defined.


Line 24: for( y = 0; y < this.height; y++) 

'y' is not defined.


Line 24: for( y = 0; y < this.height; y++) 

'y' is not defined.


Line 26: console.log("enter for loop") 

'console' is not defined.


Line 27: for( x = 0; x < this.width; x++) 

'x' is not defined.


Line 27: for( x = 0; x < this.width; x++) 

'x' is not defined.


Line 27: for( x = 0; x < this.width; x++) 

'x' is not defined.


Line 31: i = true; 

'i' is not defined.


Line 35: i = false; 

'i' is not defined.


Line 37: console.log("enter function") 

'console' is not defined.


Line 38: this.set(x, y, i); 

'x' is not defined.


Line 38: this.set(x, y, i); 

'y' is not defined.


Line 38: this.set(x, y, i); 

'i' is not defined.


Line 44: conway.maingame.prototype.set = function(x, y, val) 

'conway' is not defined.


Line 49: console.log(this.map, "map2"); 

'console' is not defined.


Line 54: conway.maingame.prototype.get = function(x, y) 

'conway' is not defined.


Line 61: conway.maingame.prototype.neighbors = function(x, y) 

'conway' is not defined.


Line 61: 

Too many errors. (38% scanned).

ここには、特定の問題に絞り込むにはあまりにも多くの間違いがあります...

于 2012-06-28T12:12:46.590 に答える