" while loop"在" for循环" shuffle数组(as3)

时间:2014-11-26 17:41:53

标签: actionscript-3 for-loop while-loop

非常感谢你的时间!

function shuffleDeck()
{

    var chosenCard:int = 0;

    trace("DECK LENGTH " + deck.length);

    for (var i = 0; i < deck.length; i++)
    {
        chosenCard = int(Math.random() * deck.length);

        while (shuffledDeck[chosenCard] != null)
        {

            chosenCard = int(Math.random() * deck.length);

        }

        shuffledDeck[chosenCard] = deck[i];
        trace(shuffledDeck[chosenCard]);
        if (shuffledDeck.length == deck.length)
        {
            break;
        }
    }

    trace(shuffledDeck);

} //End ShuffleDeck

如果我删除调用break的if语句,程序将挂起并卡住。我不明白......你可以看到下面的洗牌过程是乱七八糟的,由于某种原因,改组后的牌组变得“空白”.... 更糟糕的是,是洗牌( )函数以某种方式被称为TWICE,事件虽然我删除了eventlistener,并且找不到任何其他地方它被调用--- 跟踪语句低于

Shuffling Now
DECK LENGTH 7
1 
2
3
4
5
3,1,,,2,4,5
Shuffling Now
DECK LENGTH 7
1 
3,1,1,,2,4,5

**EDIT**

Shuffling Now
DECK LENGTH 7
DECK: 37,38,39,40,41,42,43
Shuffled Deck: 38,37,,41,39,40,42
Shuffling Now
DECK LENGTH 7
DECK: 37,38,39,40,41,42,43
Shuffled Deck: 38,37,37,41,39,40,42

如您所见,我跟踪了deck.length,然后是甲板阵列本身。然后是shuffledDeck数组。第一次通过它忽略最后一个元素,然后函数重复(不知道为什么)并在shuffledDeck [1]和[2]中插入一个37。

再次选择不同的卡片。

DECK LENGTH 7
DECK: 41,42,43,44,45,46,47
Shuffled Deck: ,,,,,41,42
Shuffling Now
DECK LENGTH 7
DECK: 41,42,43,44,45,46,47
Shuffled Deck: ,,41,,,41,42

没有if语句导致中断;

Shuffling Now
DECK LENGTH 7
DECK: 1,2,3,9,10,11,18
Shuffled Deck: ,,1
Shuffled Deck: ,2,1
Shuffled Deck: ,2,1,,3
Shuffled Deck: 9,2,1,,3
Shuffled Deck: 9,2,1,10,3
Shuffled Deck: 9,2,1,10,3,,11
Shuffled Deck: 9,2,1,10,3,18,11

所以这里:它完全符合我的要求(有点),但是HANGS(冻结)。

1 个答案:

答案 0 :(得分:0)

我建议以不同的方式随机化顺序。不要在for循环中使用while循环,而是使用单个while循环和数组切片。

  • 创建一个空的临时数组
  • 循环,而卡阵列大于0
  • 选择介于0和卡阵列长度之间的随机值
  • 对卡片阵列进行切片,删除随机值,然后将其插入临时数组
  • 卡片阵列将缩短一张卡片,这将重复,直到卡片阵列为空

这是一篇讨论这个和其他分类技术的文章:

http://code.tutsplus.com/tutorials/quick-tip-how-to-randomly-shuffle-an-array-in-as3--active-8776