我在做“十五拼图”游戏。我只是一个初学者,所以我选择了这个项目来实现。我的问题是洗牌算法:
function shuffle() {
$('td').empty();
var p = 0;
var f = 0;
do {
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15];
var rand = arr[Math.floor(Math.random() * arr.length)];
if ($('#' + rand).is(':empty')) {
p = p + 1;
document.getElementById(rand).textContent = p
var f = $('td').not(":empty").length;
} else {}
} while (f < 15)
这很酷,但我听说像我这样的随机洗牌几乎有 50% 是无法解决的。所以我在 wikipedia.org上找到了这个游戏的数学公式,解释了如何避免这种情况。
这是修改后的算法,也不起作用。我知道它的方式是alert
:它只启动 2 次而不是 31 次。
array = [];
function algorithm (){
// alert('works')
for (var c=16; c<17; c++){
document.getElementById(c).textContent = '100';
}
for (var i=1; i<16; i++){
var curId = document.getElementById(i).id;
var curIdNum = Math.floor(curId);
alert('works')
var curIn = document.getElementById(i).textContent;
var curInNum = Math.floor(curIn);
array.push(i);
array[i] = new Array();
for (var j=1; j<15; j++){
var nextId = curIdNum + j; //curIdNum NOT cerIdNum
var nextIn = document.getElementById(nextId).textContent;
//alert('works')
if (nextId < 16){
var nextInNum = Math.floor(nextIn);
if (curInNum > nextInNum){
array[i].push(j)
}
}
}
var sum = 0;
for (var a=0; a<15; a++){
var add = array[a].length;
sum = sum + add;
}
var end = sum + 4;
if (end % 2 == 0){
document.getElementById('16').textContent = "";
}
else {
shuffle();
}
}
}
问题是一样的:
怎么了?二维数组不起作用。如果您有任何问题 - 问。
只是为了说清楚:2个for
循环i
和j
应该组成一个像这样的二维数组[ this is " var i" -->[1,3,4,5,7], this is "var i" too-->[5,7,9,14,15]]
。每个里面i
都有j
。for
循环var a
应该计算j
每个 s 中的数量i
。如果j
s 的数量是偶数,则代码完成并完成 shuffle,否则应再次进行 shuffle。