Javascript棋盘游戏 - 寻找船上的可能位置

时间:2013-04-28 13:28:38

标签: javascript math

我正在用Javascript开发HTML5桌面游戏。

我如何找到(递归)我可以获得的骰子数量?

示例: 我从骰子得到 4 ,我的位置 11 。可能的地方是 22 15 7

Example shows that I'm at position 11 and positions I can get to are 22, 15 and 7

我试过这个;它工作得很好,但将错误的号码返回到控制台:

$(function(){
    // Initialize
    var pos = 11;
    var dice = 4;
    var diceMax = 4;
    var postPlaces = [];
    var places = [];

    // List of gameboard's numbers: from where to where
    numbers = {
        1   : [25,21,2],
        2   : [1,3],
        3   : [2,4],
        4   : [3,5],
        5   : [4,6],
        6   : [5,19,7],
        7   : [6,8],
        8   : [7,9],
        9   : [10,8],
        10  : [11,9],
        11  : [10,12],
        12  : [11,13],
        13  : [12,14],
        14  : [13,15,22],
        15  : [14,16],
        16  : [15,17],
        17  : [16,20,18],
        18  : [17,19],
        19  : [18,6],
        20  : [17,21],
        21  : [1,20],
        22  : [14,23],
        23  : [22,24],
        24  : [23,25],
        25  : [24,1]
    };

    // List all numbers where is possible to go with dice number we got
    function findPlaces(number){
        dice -= 1;
        $.each(numbers[number],function(i,v){
            if(postPlaces.indexOf(v) == -1){
                postPlaces.push(v);
                if(dice>0){
                    findPlaces(v);
                }else{
                    places.push(v);
                }
            }
        });
        dice = diceMax;
    }

    // When the button get pressed
    $("button").click(function(){
        postPlaces = [];
        places = [];
        dice = diceMax;
        findPlaces(pos);
        console.log(places);
    });
});

2 个答案:

答案 0 :(得分:5)

findPlaces()中存在少量错误 - 以下代码应该有效,请参阅注释

function findPlaces(number){
    dice -= 1;

    // moved here so that initial number (11) gets
    // stored to postPlaces and we do not step on that number again
    postPlaces.push(number);

    $.each(numbers[number],function(i,v){
        if(postPlaces.indexOf(v) == -1){
            if(dice>0){
                findPlaces(v);
            }else{
                places.push(v);
            }
        }
    });

    // we are going back one level higher,
    //      must remove the 'number' from postPlaces
    // AND  increase the dice (number of steps to go)
    postPlaces.pop();
    dice += 1;
}

当然,13个数字邻居错误,因为@plaix指出

答案 1 :(得分:1)

对于每个相邻位置,请查看除前一个位置之外的每个相邻位置。

var move = (function () {
    var adj = {
         1: [25, 21,  2],  2: [ 1,  3]    ,  3: [ 2,  4],  4: [ 3,  5]    ,  5: [ 4,  6],
         6: [ 5, 19,  7],  7: [ 6,  8]    ,  8: [ 7,  9],  9: [10,  8]    , 10: [11,  9],
        11: [10, 12]    , 12: [11, 13]    , 13: [12, 14], 14: [13, 15, 22], 15: [14, 16],
        16: [15, 17]    , 17: [16, 20, 18], 18: [17, 19], 19: [18,  6]    , 20: [17, 21],
        21: [ 1, 20]    , 22: [14, 23]    , 23: [22, 24], 24: [23, 25]    , 25: [24,  1]
    };
    function move(current, steps_remaining, prev) {
        var arr = [], i = adj[current].length;
        prev || (prev = 0); // if there wasn't a previous position, choose impossible
        if (steps_remaining) { // if we can still move
            while (i--) // for each adj tile
                if (adj[current][i] !== prev) // that isn't where we just came from
                    arr = arr.concat( // concat together
                        move(adj[current][i], steps_remaining - 1, current)
                    ); // recursion from adjacent tiles
            return arr; // return recursion
        }
        // else return current tile
        return [current];
    }
    return move;
}());

然后

move(11, 4); // [22, 15, 7]

添加奖金:您不需要任何额外的全局变量