康威生活游戏javascript(最好的解决方案

时间:2012-06-28 17:23:46

标签: javascript web

我正在为康威生命游戏写一个代码......我正在服用2>数组一代。和一个2代。

**规则是:生命游戏的宇宙是方形单元的无限二维正交网格,每个正方形单元处于两种可能状态之一,活着或死亡。每个细胞与其八个邻居相互作用,这八个邻居是水平,垂直或对角相邻的细胞。在每个步骤中,发生以下转换:** 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")
    }

**

1 个答案:

答案 0 :(得分:3)

我在JSHint中搜索了你的代码并解决了所有问题,在浏览器中编写了一些胶水来测试它,结果如下:jsfiddle

看起来它对我有用,所以我认为问题肯定是由于JSHint标记的数十个警告之一。

回复:你断言这个问题是由角落引起的,这就是这些线的用途:

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

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

我们从中吸取的教训是什么?掌握小问题,重大问题将照顾好自己。