-4

我正在为康威生命游戏编写代码......我正在使用 2> 数组一个 fr 老一代。一个用于第二代。

**规则是:生命游戏的宇宙是一个由正方形单元组成的无限二维正交网格,每个单元都处于两种可能的状态之一,活着或死去。每个单元格都与其八个相邻单元格交互,这些相邻单元格是水平、垂直或对角相邻的单元格。在时间的每个步骤中,都会发生以下转换: **1. 任何少于两个活邻居的活细胞都会死亡,好像是由人口不足引起的。

2.任何有两三个活邻居的活细胞都可以活到下一代。

3.任何有超过三个活邻居的活细胞都会死亡,就像过度拥挤一样。

4.任何只有三个活邻居的死细胞都会变成活细胞,就像通过繁殖一样。**

初始模式构成系统的种子。第一代是通过将上述规则同时应用于种子中的每个细胞而创建的——出生和死亡同时发生,而发生这种情况的离散时刻有时被称为滴答声(换句话说,每一代都是前一个)。这些规则将继续重复应用以创造更多的世代。**

这是代码

我得到了一个解决方案,但我想它没有给我正确的解决方案,因为它没有检查角落的邻居。我已经标记了那部分

**

    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 标记的数十个警告之一。

回复:您断言问题是由于角落造成的,这就是这些行的用途:

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

在我的测试用例中,我使用的是 10 x 10,因此在检查它的邻居时,(9,9)它会查看(10, 10)and (10 % 10, 10 % 10)is (0, 0),从而避免查看数组外部。我相信这就是所谓的环形阵列。

我们从中吸取的教训?把小问题放在首位,大问题就会自己解决。

于 2012-06-28T20:08:47.783 回答