2

これは、カードのデッキ クラスから n 枚のカードを配ろうとするために作成した関数です。カードが配られると、デッキから「取り除かれる」ことになっています (つまり、再度配られることはありません)。ポインターを使用して、これまでに配ったカードの量を差し引いたデッキの後ろからドローすることで、これを解決したと思いました。この関数を再度呼び出す場合は、カードが欠落しているデッキからドローする必要があります。デッキをシャッフルしていないので、このメソッドが機能すると思いました。

「dealt」は私のコードの前半で定義されており、0 から始まります。Card は、特定のスーツと値を保持するクラスです。

dealNumber 関数を 6 回呼び出し、n = 5 にした場合のハンドのサンプル出力を示します。

ST CK D3 HJ D9
HK DK SA SQ DT
HK S4 D2 C9 H5
HK H6 H7 H2 H4
HK HK SK S8 C5
HK H9 S3 D8 H8

ただし、「デッキ」は次のように並べられています。

S6 S2 S7 D7 S9 CQ D4 CA CJ SJ HQ DQ D5 HA DA C4 HT H3 CT D6 C2 S5 H8 D8 S3 H9 C7 C5 S8 SK HK C8 H4 H2 H7 H6 C3 H5 C9 D2 S4 C6 DT SQ SA DK DJ D9 HJ D3 CKST

最初の手札は正しいが、他の手札は正しくない。「ディール」はデッキ クラスに引き継がれるべきですが、どこが間違っているのでしょうか?

Hand* Deck::dealingNumber(int p){   

Card* dealtCards = new Card[p];
Card* oldDeck = deck;

for (int i = 0; i<n; i++){
    dealtCards[i] = deck[(51-dealt)-i];
}

dealt = dealt+n;
deck = new Card[52-dealt];

for (int i = 0; i < 51-dealt;i++){
deck[i] = oldDeck[i];
}

delete[] oldDeck;

PokerHand* hand = new PokerHand(dealtCards);

return hand;
4

3 に答える 3

0

2 番目の for ループに 1 つずつずれているエラーがあります。

for (int i = 0; i < 52 /* change from 51 to 52 */ - dealt; i++){
    deck[i] = oldDeck[i];
}
于 2013-05-08T04:04:53.937 に答える
0

これ自体が問題なのかわからない。とにかくこれは問題です: 修正

for (int i = 0; i < 51-dealt;i++){
deck[i] = oldDeck[i];
}

for (int i = 0; i < 52-dealt;i++){
deck[i] = oldDeck[i];
}

目的に合わせて STL クラスを使用すると、はるかに簡単になります。しかし、個人的には、リンクされたリストなどを使用したスタックを好みます。

于 2013-05-08T04:06:04.997 に答える
0

私は 2 つの配列を使用して非常に異なるアプローチを取ります。最初の配列はデッキを保持し、2 番目の配列は配られた/配られていないフラグを保持します。

char cards[52][3]; // 52 cards @ 3 characters each
int dealtFlag[52]; // 0=not dealt, 1=dealt

次に、0 ~ 51 の乱数を選択し、dealtFlag[randNum] がゼロであることを確認し、ゼロの場合はそのカードを使用します。1 の場合は、新しい乱数を取得して再試行します。

于 2013-05-08T03:49:08.667 に答える