0

ランダムな 5 枚のカードを生成するポーカー プログラムを作成しようとしています。私が遭遇した問題の 1 つは、プログラムが同じカードを 2 回生成することがあるということです。

これを修正するために私が考えた最善の方法は、次のような while ループを実装することです。

while (randFace == randFace2 && randSuit == randSuit2) || (randFace2 == randFace3 && randSuit2 == randSuit3) { 

randSuit2 = Math.round(Math.random()*3);                    
randFace2 = Math.round(Math.random()*13);   

}

ただし、これは while ループの構文を壊し、実行を拒否します。

多くの複雑な条件を持つ上記のような while ループを作成する方法はありますか?構文的に有効なのは 1 つだけですか?

ありがとう!

4

4 に答える 4

0

XY問題のように聞こえるので、この回答は質問の件名ではなく、問題自体に返信していることに注意してください。

まず、Math.floorMath.roundを使用する必要があります。これは、不均一な分布が得られるためです。

function randomInt(max) {
    return Math.floor(Math.random() * (max + 1))
} 

次に、このすべての値をどこかに保存する必要がありますよね? では、なぜオブジェクトや配列を使用しないのでしょうか? 52枚のカードのデッキを使用していると思います。次のような規則がある場合:

  • ハート: インデックス 0 - 12
  • ダイヤモンド: インデックス 13 - 25
  • クラブ: インデックス 26 - 38
  • スペード: インデックス 39 - 51

次に、「デッキ」表現は単なるintの配列です。

var deck = [];
for (var i = 0; i < 52; i++)
  deck.push(i);

これで、通常のデッキをシャッフルするだけで「デッキ」を作成できます。

// Using the Fisher Yates shuffle: http://en.wikipedia.org/wiki/Fisher-Yates_shuffle

function shuffle(array) {
  var len = array.length;
  var shuffled = array.slice();

  while (len--) {
    random = randomInt(len + 1);
    // swap
    shuffled[len] = [shuffled[random], shuffled[random] = shuffled[len]][0];
  }

  return shuffled;
}

// creating a new, shuffled deck from the original
var playingDeck = shuffle(deck);

を使用してplayingDeck、実際にカードを配布します。最初の 5 枚のカードをプレイヤー 1 に渡したいとします。

var player1Hand = playingDeck.splice(0, 5);

次に、player1Hand は 5 つの要素の配列になり、要素は「プレイ中のデッキの一番上」(最初の 5 つの要素) からのトークンになります。したがって、今クエリを実行している場合playingDeck.length、 は になります47。他の 5 枚のカードをプレイヤー 2 に渡しますか? 同じコード:

var player2Hand = playingDeck.splice(0, 5);

そして、ゲームの途中でカードをシャッフルしたい場合は?をシャッフルしてplayingDeck、それ自体に割り当てます。

playingDeck = shuffle(playingDeck);

上から 1 枚のカードを引くこともできます。

var card = playingDeck.shift();

(この場合、これはカードのリスト (配列) ではなく、カード自体 (番号) であることに注意してください。)

基本的には、実際のデッキをシミュレートして、必要な配列メソッドを使用します。

シミュレートされたカードを処理するより自然な方法であることがわかるように、カードを引くためにループ内で多くの条件を連結する必要はありません。

最初に述べた規則を使用しますが、カードの別の表現が必要な場合でも問題ないことを覚えておいてください。説明した方法は引き続き機能し、コードを変更する必要はありません。配列の値のみが異なるため、デッキの生成のみです。たとえば、次の文字列を使用できます。

var deck = ["1H", "2H", /*etc*/, "10H", "JH", "QH", "KH", /* etc */];

最後の文字がスートで、残りがカードの値です。または、実際にオブジェクトも使用できます。

var deck = [{"suit": "Hearts", "face": "1"}, /* etc */];

それは本当に問題ではありません。対処しやすくするもの。ただし、残りのアプローチは同じです。

それが役に立てば幸い!

于 2013-04-12T16:26:41.103 に答える