0

我在做“十五拼图”游戏。我只是一个初学者,所以我选择了这个项目来实现。我的问题是洗牌算法:

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循环ij应该组成一个像这样的二维数组[ this is " var i" -->[1,3,4,5,7], this is "var i" too-->[5,7,9,14,15]]。每个里面i都有jfor循环var a应该计算j每个 s 中的数量i。如果js 的数量是偶数,则代码完成并完成 shuffle,否则应再次进行 shuffle。

4

3 回答 3

0
  var nextId = cerIdNum + j;

在那个小提琴中,我没有看到这个cerIdNum声明和定义既不是局部变量也不是全局变量,我想那是curIdNum

于 2013-08-12T04:59:58.873 回答
0

请使用以下定义algorithm并让我们知道这是否有效。基本上,警报消息只会出现两次,因为使用了未定义的变量。出于说明的目的,我在出现问题的地方发表了评论。由于这些问题,您的脚本将突然停止执行,从而导致您描述的行为。

哦,顺便说一句 - 我没有时间浏览提供的 Wiki 链接 - 因此您必须验证您的逻辑是否正确。但是,我肯定已经解决了导致您观察到的行为的错误。

顺便说一句 - 考虑使用 jQuery,你的代码会更干净......

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);
            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.push(j) //array[i].push does not make sense
                }
            }
        }            

        var sum = 0; 
        for (var a=0; a<15; a++){
            var add = array.length; //array[1].length does not make sense
            sum = sum + add;
        }            
        var end = sum + 4;
        if (end % 2 == 0){
            document.getElementById('16').textContent = "";
        }            
        else {       
            shuffle();
        }            
    }                
}
于 2013-08-12T05:17:15.970 回答
0

我通过完全重写代码找到了解决方案。感谢大家的帮助!

以下是有效的方法:

function shuffle (){
press = 1;
$('td').empty().removeClass();
p=0;
var f;

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){
    winChance();
}

}
function winChance (){
array = [];
for (i=1;i<16;i++){
    array[i]= new Array();
    var currentId = $('#' + i).attr('id');
    var currentIn = $('#' + i).html()

    var currentIdNum = parseInt(currentId, 10);
    var currentInNum = parseInt(currentIn, 10);
    for (j=1;j<16;j++){
        var nextId = currentIdNum + j;
        if (nextId < 16){
            var nextIn = $('#' + nextId).html();
            var nextInNum = parseInt(nextIn, 10);
            if (currentInNum > nextInNum){
                array[i].push(j);
            }
        }
    }
}
checkSum();
}

function checkSum(){
var sum = 0; 
for (var a=1; a<16; a++){
    var add = array[a].length;
    sum = sum + add;
}            
var end = sum + 4;
if (end % 2 == 0){}            
else {       
    shuffle();
}            
}
于 2013-08-12T15:38:59.753 回答