在网格上查找空白空间的算法

时间:2014-08-19 22:56:22

标签: javascript algorithm

所以我正在创建一个蛇游戏,你可以在这里看到:http://jaminweb.com/snake_TEST_PHP.php

当蛇的头撞到一块食物时,食物再次出现在棋盘上的其他地方,某处不在蛇身上。我处理这个问题的功能就是在板上尝试随机位置,直到。但我意识到当蛇几乎占据了整个电路板时,这可能涉及大量的计算。

这是我的功能,应该是不言自明的:

this.moveFood = function(bbf) {
    /*
        bbf: bounding box for the food
    */
    var tx = randInt(0, C_w / this.linkSize - 1) * this.linkSize - bbf.x;
    var ty = randInt(0, C_h / this.linkSize - 1) * this.linkSize - bbf.y;
    var fcopy = this.food;
    fcopy.translate(tx, ty);
    if (!this.hitSnake(fcopy)) {
        this.food.translate(tx, ty);
    } else {
        this.moveFood(bbf);
    }
}

有没有人有更好的想法,或者任何人都可以指导我到一个资源,我可以在那里了解我需要改进的任何类型的算法?

4 个答案:

答案 0 :(得分:1)

除非你有一些简单的方法来获取所有空的瓷砖,否则你的方法是唯一真正的方法。我建议将它包装在do while循环中,以避免递归:

this.moveFood = function(bbf) {
/*
    bbf: bounding box for the food
*/
    do{
        var tx = randInt(0, C_w / this.linkSize - 1) * this.linkSize - bbf.x;
        var ty = randInt(0, C_h / this.linkSize - 1) * this.linkSize - bbf.y;
        var fcopy = this.food;
        fcopy.translate(tx, ty);
        if (!this.hitSnake(fcopy)) {
            this.food.translate(tx, ty);
        }
   }while(this.hitSnake(this.food);
}

更好的解决方案是保留或生成所有空单元格的列表,然后只需从该列表中选择一个随机单元格,如果没有可用空间,将避免潜在的无限循环。

答案 1 :(得分:0)

简单的方法是找到所有占用的瓷砖并将所有未占用的瓷砖放入列表中,然后在列表中选择并编制索引作为放置食物的下一个瓷砖。

答案 2 :(得分:0)

如果您没有做出完全随机的事情,但有轻微的偏见,您可以执行以下操作:

  1. 生成随机行,并将行保存为init_row。
  2. 遍历所有列,将任何空单元格推送到数组中。
  3. 如果是array.length,则选择该数组的随机元素,返回(row,col)。
  4. 否则,使用换行增加行(row =(row + 1)%C_w)
  5. 如果row!= init_row转到第2步。
  6. 否则,不要更换食物 - 没有空方格,下一步会死蛇,或者应该赢,等等。

    var empty_y;
    var max_x = C_w / this.linkSize - 1) * this.linkSize - bbf.x;
    var max_y = C_h / this.linkSize - 1) * this.linkSize - bbf.y;
    init_tx = randInt(0, C_w / this.linkSize - 1) * this.linkSize - bbf.x;
    tx = init_tx;
    do {
        empty_y = [];
        for( y=0; y<max_y; y++) {
            var fcopy = this.food;
            fcopy.translate(tx, y);
            if(!this.hitSnake(fcopy)) {
                empty_y.push(y);
            }
        }
        if( empty_y.length > 0 ) {
            int r = randInt(0,empty_y.length);
            this.food.translate(tx,empty_y(r));
            return;
        }
        tx = (tx+1) % max_x;
    } while( tx != init_tx );
    // handle case where there is no open spots left
    
  7. 该算法更有可能在一个空白点很少的行中选择一个空白点,但它会&#34;看起来&#34;随机。 (如果在检查empty_y数组之前遍历所有tx,它将是真正随机的,但它不是必需的。)

    看起来.translate()和.copy()例程看起来很繁重......你可能想要创建一个[max_y,max_x]数组并标记/取消标记占用的正方形,这样你就可以更快地检查。

答案 3 :(得分:0)

您可以为每个名为&#34;占用&#34;的瓷砖添加一个属性。并且当蛇在那里时将其设置为true,或者制作空的瓦片的数组并且仅从那里随机选择,但是这可能需要更多的计算,因为它需要不断地检查蛇的位置。