0

抱歉,如果这个问题很愚蠢,我认为这不是因为我找不到直接的答案。我正在尝试实现标准的 Fisher-Yates shuffle,但是在jQuery 包装的 DOM 元素数组上。 即通常的“交换”算法。

这个想法是实施洗牌一副牌。

我最初的简单(但 hacky)解决方案:

1)为每个DOM元素分配一个索引属性,同时创建一个索引列表。

indices = [];
deck.each(function(i){
    $(this).attr('index',i);
    indices[i] = i;        
});

2) 打乱索引数组,

for(i=0;i<indices.length;i++){
    temp = indices[i]; 
    j = Math.floor((Math.random()*i));
    indices[i]=indices[j];
    indices[j]=temp; 
}

并遍历它们,使用类似的东西,我不知道,说:

for(i=0;i<indices.length;i++){
     randomCard = $('[index='+indices[i]+']');
     //do amazing game-like things
}

但是......我讨厌这个解决方案,感觉非常hacky。我宁愿操纵包装好的套装。


所以...

再一次,这里是 Fisher-Yates shuffle 的伪代码。

deck.each(function(i){ 
    temp = deck[i]; //except that I want deck[i] to be a **wrapped object**

    j = Math.floor((Math.random()*i));

    deck[i]=deck[j]; //and deck[j] should find a wrapped object in the 'elements' set with index j

    deck[j]=temp; //and this should perform the swap.

    alert("I can haz swapburgers!!!");  //yay.
});

我不明白如何做的部分是通过其索引设置 jQuery 包装对象中元素的值。我应该将索引和父元素传递给交换函数吗?就像是

swap($(this).parent(),i,j);

如果有人可以帮我解决这个问题,我将不胜感激。我希望这一切都清楚。请让我知道它是否令人困惑,我会尽力澄清。

4

1 回答 1

1

就交换而言,您似乎可以将 jquery 选择视为普通数组。

function swap(obj, index1, index2) {
    var temp = obj[index1];
    obj[index1] = obj[index2];
    obj[index2] = temp;
}
于 2012-08-08T01:17:27.000 回答