Javascript棋盘游戏-寻找棋盘上可能的位置
我正在用Javascript开发HTML5棋盘游戏 我如何(递归地)找到我能得到的骰子数 示例: 我从骰子中得到4,我的位置是11。可能的位置是22、15和7 我已经试过了;它工作正常,但在控制台中返回错误的数字:Javascript棋盘游戏-寻找棋盘上可能的位置,javascript,math,Javascript,Math,我正在用Javascript开发HTML5棋盘游戏 我如何(递归地)找到我能得到的骰子数 示例: 我从骰子中得到4,我的位置是11。可能的位置是22、15和7 我已经试过了;它工作正常,但在控制台中返回错误的数字: $(function(){ // Initialize var pos = 11; var dice = 4; var diceMax = 4; var postPlaces = []; var places = []; /
$(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);
});
});
findPlaces()中几乎没有bug-下面的代码应该可以工作,请参阅注释
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;
}
当然,正如@plaix所指出的,13个数字的邻域是错误的对于每个相邻位置,请查看每个相邻位置,前一个位置除外
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;
}());
然后
额外的好处:您不需要任何额外的全局变量到目前为止,我可以看出
13:[13,14],
是错误的。但仍在寻找;)谢谢你的提示。3.13是不吉利的数字;)
move(11, 4); // [22, 15, 7]