0

jQuery で 8 枚のカードをランダムに配ろうとしていますが、8 枚のカードが配られた後にコードを実行すると、ブラウザがクラッシュします。while ループの 144 行目に問題があると表示されます。この while ループを作成して、8 枚の一意のランダム カードを配りました。

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

trueと評価さwhileれる限り、ループはループし続けます。ループarr.length==8内では、アイテムの数を変更していないため、アイテムの数が 8 に達すると、永遠にループし続けます。whilearr

編集: 0 と 1 の間の数値を返すため、おそらくまだクラッシュMath.random()します。この数値に 8 を掛けて 1 を足すと、この数値は基本的に常に 1 と 8 の間になります。このドメインは、ループが無限にループし続ける場合の配列の要素数と同じ 8 つの整数で構成されます。配列には 8 つの数字があり、k毎回 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 に答える