2013-05-08 2 views
2

Это функция, которую я создал, чтобы попытаться разрешить n карт из класса колоды карт. Когда раздаётся карточка, она должна быть «удалена» из колоды (т. Е. Не может быть снова обработана). Я решил, что решил это, используя указатели, и вытащив из задней части колоды минус количество карт, которые я до сих пор использовал. Если я снова вызову функцию, мне нужно рисовать из колоды с отсутствующими картами, и, поскольку я не перетасовываю колоду в любой момент, я думал, что этот метод будет работать.Работа с колодой карт (не повторяющихся карт)

«dealt» определен ранее в моем коде и начинается с 0. Карта - это класс, который содержит определенный костюм и значение.

я положил пример вывода из рук дело, когда я вызвать функцию dealNumber 6 раз и п = 5.

ST CK D3 HJ D9
HK DK SA SQ DT
HK S4 D2 С9 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 CK ST

Первая рука, котор я держу правильно, но другие нет. «сдавать» следует переносить через класс колоды, независимо от того, где я буду ошибаться?

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; 
+3

В чем вопрос? – user1118321

+0

Извините. Я пытаюсь понять, что я сделал неправильно в своем коде, чтобы не правильно раздавать карты. – user2105982

+0

Вам нужно использовать массивы для этого? Использование чего-то типа 'std :: stack' или' std :: vector' для хранения ваших карт, вероятно, будет намного проще. – Xymostech

ответ

0

У вас ошибка совсем по одному в вашей второй цикл:

for (int i = 0; i < 52 /* change from 51 to 52 */ - dealt; i++){ 
    deck[i] = oldDeck[i]; 
} 
0

Я бы выбрал совершенно другой подход, используя 2 массива. Первый массив содержит колоду, а второй массив содержит разрешенный/не подписанный флаг.

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

Затем выбирается случайное число от 0-51, убедитесь, что dealtFlag [randNum] равен нулю, и использовать эту карту, если она равна нулю. Если это 1, получите новое случайное число и повторите попытку.

+3

Это было бы очень неэффективно при работе с последними картами - например, при выборе между двумя последними картами было бы действительно только 4% случайных чисел. – Patashu

+0

Хорошая точка, ее эффективность, конечно же, уменьшается по мере выпуска карт. Но если вы не планируете заниматься всей колодой, я полагаю, что это не так беспокоит. –

+0

Когда алгоритмы, которые не нарушаются дизайном, так легко кодировать, зачем выбирать что-то с таким низким асимптотическим поведением? – Patashu

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 для вашей цели будет гораздо проще. Но лично я предпочел бы стек, используя связанный список или аналогичный.

Смежные вопросы