JavaScript语法问题

时间:2013-08-12 03:36:33

标签: javascript jquery syntax formula puzzle

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

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%的随机随机播放都是无法解决的。所以我为这个游戏找到了math formula at 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();
    }            
}                
}

问题是一样的:

怎么了?二维数组不起作用。如果你有任何问题 - 请问。

只是为了说清楚:fori的2个j循环应该像这样[ this is " var i" -->[1,3,4,5,7], this is "var i" too-->[5,7,9,14,15]]制作一个二维数组。每个i内都有j。带for的{​​{1}}循环应计算每个var aj的数量。如果i的数量是偶数,则代码完成并且已完成随机播放,否则应再次进行随机播放。

3 个答案:

答案 0 :(得分:0)

  var nextId = cerIdNum + j;

在那个小提琴中,我没有看到cerIdNum宣布&amp;既不是本地变量也不是全局变量,我想这是curIdNum

答案 1 :(得分: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();
        }            
    }                
}

答案 2 :(得分: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();
}            
}