コンウェイの人生ゲームのコードを書いています。私は2つの配列を取ります。1 つは旧世代用、もう 1 つは 2 世代用です。ルールを実装しようとすると、コンソールにエラーが表示されます:
TypeError: Cannot read property '-1' of undefined
値が -1 の隣接セルを削除できるようにするには、コードをどのように変更すればよいですか?教えてください。
ルールは次のとおりです。
ライフ ゲームの宇宙は、正方形のセルの無限の 2 次元の直交グリッドであり、それぞれのセルは、生きているか死んでいるかという 2 つの可能な状態のいずれかになります。すべてのセルは、水平、垂直、または斜めに隣接するセルである 8 つの隣接セルと相互作用します。各ステップで、次の遷移が発生します。
生きている隣人が 2 つ未満の生きているセルは、人口不足が原因であるかのように死にます。
2 つまたは 3 つの生きた隣人を持つ生きたセルは、次の世代に生き続けます。
生きている隣人が 3 つ以上いる生きているセルは、過密状態のように死にます。
ちょうど 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;
}