0

私はactionscript3.0を初めて使用し、カードのデッキをシャッフルしようとしています。これで成功しましたが、問題はカードが繰り返されているため、シャッフル後に52枚のカードデッキに同じカードの複製があります。テキサスホールデムゲームを作成しようとしています。

このディスカッションでは、配列をランダム化またはシャッフルしましたが、Fisher-Yatesアルゴリズムをコードに組み込む方法がわかりません。私はここで提案されたいくつかの異なる方法を試しましたが、ウェブ上で何も機能していません(問題は私の経験不足であると考えてください)。

誰かがこれを私のコードに組み込む方法の例、またはこれを正しく行う方法を説明する場所へのリンクを教えてもらえますか?

前もって感謝します。

ポール

package src.CardDeck
{
    public class CardDeck
    {
        public var allCards:Array = [];
        public var cardNames:Array;
        public var cardValues:Array;
        public var gameType:String;
        public var drawnCards:uint = 0;

        public function CardDeck(game:String)
        {
            gameType = game;
            cardNames = ["Ace","Two","Three",
                         "Four","Five","Six",
                         "Seven","Eight","Nine",
                         "Ten","Jack","Queen","King"];
            if(gameType == "texasholdem")
            {
                cardValues = [1,2,3,4,5,6,7,8,9,10,10,10,10];
            }
            makeSuit("Spade");
            makeSuit("Heart");
            makeSuit("Diamond");
            makeSuit("Club");
        }

        private function makeSuit(suitString:String):void
        {
            var card:Object;

            for(var i:uint = 0; i < cardNames.length; i++)
            {
                card = {};
                card.cardType = suitString;
                card.cardName = cardNames[i];
                card.cardValue = cardValues[i];
                card.isDrawn = false;
                allCards.push(card);
            }
        }

        public function shuffle():Array
        {
            var shuffledArray:Array = [allCards.length];
            var randomCard:Object;
            do
            {
                randomCard = getRandomCard();
                if(shuffledArray.indexOf(randomCard) == -1)
                {
                    shuffledArray.push(randomCard);
                }
            }
            while(shuffledArray.length < allCards.length)
                return shuffledArray;
        }

        private function getRandomCard():Object
        {
            var randomIndex:int = Math.floor(Math.random()* allCards.length);
            return allCards[randomIndex];
        }
    }
}
4

2 に答える 2

5

バグ注:

var shuffledArray:Array = [allCards.length];

shuffledArray [0]=allCards.lengthである単一の要素で配列を作成します。実際、事前に割り当てる必要はありません。次のように言ってください。

var shuffledArray: Array = []; 

これが古典的なフィッシャー-イェーツ版です。

public function shuffleFisherYates():Array {
var shuffledArray:Array = [];
var randomCardIndex: int;
    do {
        randomCardIndex = Math.floor(Math.random()* allCards.length);
        shuffledArray.push(allCards[randomCardIndex]); // add to mix
        allCards.splice(randomCardIndex,1); // remove from deck
    }while(allCards.length); // Meaning while allCards.length != 0
    return shuffledArray;
}

Durstenfeldの(インプレース)バージョンは次のとおりです。

public function shuffleDurstenfeld():Array {
var swap:Object;
var countdown:int = allCards.length-1;
var randomCardIndex: int;
    for(i = countdown; i > 0; i--){
        randomCardIndex = Math.floor(Math.random()* countdown);
        swap = allCards[countdown];
        allCards[countdown] = allCards[randomCardIndex];
        allCards[randomCardIndex]= swap;
    }
    return allCards; // shuffled in place
}
于 2013-03-23T22:01:47.890 に答える
0

シャッフルコードに問題がないと仮定すると、カードが繰り返されるのは、getRandomCard()メソッド内で、描画されたカードを考慮していないためだと思います。ランダムにインデックスを生成し、配列内のカードを返します。ただし、そのカードはまだ配列内にあり、同じインデックスが再度ランダムに生成され、同じカードが返される可能性があります。

于 2013-03-23T22:29:30.033 に答える