2017-06-02 5 views
1

私はカードをパックを作成する宿題があり、ボーナスとしてランダム化します。 3枚のカードが同じスーツを持たないようにランダム化する必要があります。私はFisher-Yates Methodを使用してそれらをランダム化しました。JavaScriptシャッフルデッキなので3つの同じスーツなし

これはほとんどの場合動作しますが、3枚のカードに同じスーツを連続して装着できる可能性はまだあります。

3つのカードを同じスーツかどうか確認するために、ループを実行して3つのカードをスキャンすると、どうすればランダム化機能を再度実行できますか?ここで

は私のコードです:

var suits = ["Hearts", "Diamonds", "Spades", "Clovers"]; 
var faces = ["Ace", 2, 3, 4, 5, 6, 7, 8, 9, 10, "Jack", "Queen", "Kings", "Joker"] 
var a = " of " 
var deck = []; 
var temp = null; 

//Looping through arrays, combining faces to each suit 
//Faces is length-1 to not insert all jokers 
for (i = 0; i < suits.length; i++) { 
    for (j = 0; j < faces.length-1; j++) { 
    //Looping through each of the suits 
    deck.push(faces[j] + a + suits[i]) 
    } 
} 
//Inserting 1 joker to the deck 
deck.push(faces[13]) 
console.log(deck) 

//Shuffle the deck, using Fisher-Yates shuffle 
//Researched from Frank Mitchell: https://www.frankmitchell.org/2015/01/fisher-yates/ 

for (k = deck.length - 1; k > 0; k -= 1) { 
    m = Math.floor(Math.random() * (k + 1)) 
    temp = deck[k] 
    deck[k] = deck[m] 
    deck[m] = temp 
} 

console.log("^^^^^^^^^^^^^^^^^^^^^") 
console.log("---Shuffling Deck----") 
console.log("vvvvvvvvvvvvvvvvvvvvv") 
console.log(deck) 

注:各スーツの種類のループのために行うことですので、最高の私が推測することができるものとして、私はそれがより多くのプロセスが必要になります知っている(この探索ループ4を実行していますindexOf(suits [i])を使用して、デッキ[i + 1]と[i + 2]を比較するにはどうすればよいですか?私が探しているスーツとデッキのスーツの比較を作成するにはどうしたらいいですか? 「スペードの5」

答えて

2

、「ダイヤのエース」あなたはそれが簡単にオブジェクト{Suit:'Hearts', Face:'Ace'}として各カードを表現するために見つけることがあります。

また、カードの要素がアレイで命名されています。これにより、文字列の操作をせずにカードがどのようなスーツかを簡単に判断できます。文字列を使ってカードを表現するという厳しい要求がある場合は、正規表現を使用して、exapmle内のofの後に単語を抽出することができます。

同じスーツの3つを探すという点では、個々のスーツを個別に探す必要はありません。一度に1枚のカードを見て、そのスーツがi-1i-2のものと合っているかどうかを見てください(もちろん最初のカードには注意してください)。

+0

だから私はそれらを文字列にするという要件を扱っています。どのようにして部分文字列を抽出すればよいのですか? –

+0

@ as.beaulieu、 "私はどのように部分文字列を抽出するのですか"と答えました。 (正規表現を使用してください)問題がある場合は、問題を具体的に質問してください。 –

+0

データを文字列ではなくオブジェクトとして処理し、文字列要件のためにデータを処理しないで、最後に文字列として返すのはなぜですか? – David

関連する問題