配列を反復処理する必要のヘルプは、ポーカーAIのための2つの可能性、ノー繰り返しを取得します
質問
私は本当に言葉に良い方法でこの質問、また良いタイトルを考えることはできません、そしておそらく答えは、私はそれをしないのですように途方もなく簡単です。私はポーカーAIに取り組んでいます、と私はより良い私よりある存在の手の数を計算します。私はそれをどのように理解し、しかし、私が把握することはできませんと、カードのグループを反復処理するための最良の方法です。
私はフロップでいますので、私は私の2枚のカードが何であるかを知っている、と3枚のカードがボード上にあります。以前にAを計算しているのであれば、あなたはそこに47枚の未知のカードがあると私はあなたが同じランクとスーツの2枚のカードを持つことができないように、2つは、アウト渡されることを想定したもの47枚のカードのすべての可能な組み合わせを反復処理したい、と私は時間を無駄にされますので、あなたは、再びそれを超える行うにはしたくない、これは何度も呼び出されます設定します。あなたが理解していない場合は、私が教えてください、私はより明確にしてください求めていたいです。だから、私はその要素が1に等しい場合、それは、それは私の手ではなくボード上にないことを意味し、各訴訟のための4、および各ランクのための13、このような何かを設定することができます。 。 setOfCards[4][13]
//remove cards I know are in play from setOfCards by setting values to zero
for(int i = 0; i < 4; i++)
for(int j = 0; j < 13; j++)
for(int k = 0; k < 4; k++)
for(int l = 0; l < 4; l++)
//skip if values equal zero
card1 = setOfCards[i][j]
card2 = setOfCards[k][l]
//now compare card1, card2 and set of board cards
だから、これは実際には、たとえば、多くの値を繰り返すように起こっている:カード1 = AceOfHearts、カード2 = KingOfHeartsはカード1 = KingOfHearts、カード2 = AceOfHeartsと同じです。また、私の計算を変更します。どのように私はこれを避けて行くべきですか?また、この技術の名前はありますか?ありがとうございます。
解決
あなたが
と言うことができ、ちょうど52枚のカードののシングルの配列を持つことが容易になるだろうfor (int i=0; i<52; i++)
for (int j=i+1; j<52; j++)
あなたは何の繰り返しを取得していないので、今j
は常に、i
よりも高くなります。あなたは、2次元配列についても同様のことを行うことができますが、それはビットトリッキーです:
for (int k=i; ...)
for (int l=j+1; ...)
内側の2つのループではそれを行うべきです。