0

我试图在 jQuery 中随机处理 8 张卡片,但是每当我在处理完 8 张卡片后运行我的代码时,浏览器就会崩溃。它说我的 while 循环中的第 144 行有问题。我做了这个while循环来处理八张独特的随机牌。

var n = 0
var card = [{id: 1}, {id: 2}, {id: 3}, {id: 4}, {id: 5}, {id: 6}, {id: 7}, {id: 8}];
var arr = [];
var n = Math.floor((Math.random() * 7) + 1);

doOne(0, n);

function doOne(index, rand) {
    var thisCard = card[index];
    var p = $("#hand1_" + thisCard.id);
    var offset = p.offset();
    var zindex = p.css('z-index');
    if (thisCard) {
        $('#card' + rand).css('z-index', zindex);

        $('#card' + rand).animate({
            top: offset.top,
            left: offset.left,
            }, 
            function() {
                arr.push(rand);
                k = Math.floor((Math.random() * 8) + 1);
                // line 144 i have a problem here
                while (exist(arr, k) == true || arr.length == 8) {
                    k = Math.floor((Math.random() * 8) + 1);
                }
                doOne(index + 1, k);
            });
     }
}

function exist(arr, obj) {
    for (var i = 0; i < arr.length; i++) {
        if (arr[i] == obj)
            return true;
    }
}
});

任何帮助将不胜感激。谢谢。

4

2 回答 2

6

while只要arr.length==8评估为真,您的循环就会一直循环。在while循环中,您不会更改的项目数arr,因此一旦项目数达到 8,它将永远循环。

编辑:它可能仍然会崩溃,因为Math.random()返回一个介于 0 和 1 之间的数字。如果将此数字乘以 8 并加 1,则该数字基本上始终介于 1 和 8 之间,包括。该域由 8 个整数组成,与循环永远循环时数组中的元素数相同。由于您的数组中有 8k个数字并且每次都是 1 到 8 之间的数字,k因此将始终是您的数组中已经存在的数字。因此它开始永远循环。如果您想发超过 8 张牌,则必须创建一个函数,该函数可以产生 1 到 8 范围之外的数字。

于 2013-05-15T18:56:33.507 回答
0

你可以做:

var n = 0
var card = [{id: 1}, {id: 2}, {id: 3}, {id: 4}, {id: 5}, {id: 6}, {id: 7}, {id: 8}];
var arr = [];
var n = Math.floor((Math.random() * 7) + 1);

doOne(0, n);

function doOne(index, rand) {
    var thisCard = card[index];
    var p = $("#hand1_" + thisCard.id);
    var offset = p.offset();
    var zindex = p.css('z-index');
    if (thisCard) {
        $('#card' + rand).css('z-index', zindex);

        $('#card' + rand).animate({
            top: offset.top,
            left: offset.left,
        }, 
        function() {
            arr.push(rand);
            k = Math.floor((Math.random() * 8) + 1);
            // line 144 i have a problem here
            while (exist(arr, k) == true && arr.length < 8) {
                k = Math.floor((Math.random() * 8) + 1);
            }
            doOne(index + 1, k);
        });
     }
}

function exist(arr, obj) {
    for (var i = 0; i < arr.length; i++) {
        if (arr[i] == obj)
            return true;
}
}
});
于 2013-05-15T21:59:30.870 回答