Playing cards: Difference between revisions
Content added Content deleted
m (→{{header|PARI/GP}}: lang tag) |
(→{{header|C}}: saner code) |
||
Line 276: | Line 276: | ||
=={{header|C}}== |
=={{header|C}}== |
||
<lang C>#include <stdio.h> |
|||
See [[Playing Cards/C]] |
|||
#include <stdlib.h> |
|||
#include <locale.h> |
|||
int locale_ok = 0; |
|||
wchar_t s_suits[] = L"♠♥♦♣"; |
|||
/* if your file can't contain unicode, use the next line instead */ |
|||
//wchar_t s_suits[] = L"\x2660\x2665\x2666\x2663"; |
|||
char *s_suits_ascii[] = { "S", "H", "D", "C" }; |
|||
char *s_nums[] = { "WHAT", |
|||
"A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", |
|||
"OVERFLOW" |
|||
}; |
|||
typedef struct { int suit, number, _s; } card_t, *card; |
|||
typedef struct { int n; card_t cards[52]; } deck_t, *deck; |
|||
void show_card(card c) |
|||
{ |
|||
if (locale_ok) |
|||
printf(" %lc%s", s_suits[c->suit], s_nums[c->number]); |
|||
else |
|||
printf(" %s%s", s_suits_ascii[c->suit], s_nums[c->number]); |
|||
} |
|||
deck new_deck() |
|||
{ |
|||
int i, j, k; |
|||
deck d = malloc(sizeof(deck_t)); |
|||
d->n = 52; |
|||
for (i = k = 0; i < 4; i++) |
|||
for (j = 1; j <= 13; j++, k++) { |
|||
d->cards[k].suit = i; |
|||
d->cards[k].number = j; |
|||
} |
|||
return d; |
|||
} |
|||
void show_deck(deck d) |
|||
{ |
|||
int i; |
|||
printf("%d cards:", d->n); |
|||
for (i = 0; i < d->n; i++) |
|||
show_card(d->cards + i); |
|||
printf("\n"); |
|||
} |
|||
int cmp_card(const void *a, const void *b) |
|||
{ |
|||
int x = ((card)a)->_s, y = ((card)b)->_s; |
|||
return x < y ? -1 : x > y; |
|||
} |
|||
card deal_card(deck d) |
|||
{ |
|||
if (!d->n) return 0; |
|||
return d->cards + --d->n; |
|||
} |
|||
void shuffle_deck(deck d) |
|||
{ |
|||
int i; |
|||
for (i = 0; i < d->n; i++) |
|||
d->cards[i]._s = rand(); |
|||
qsort(d->cards, d->n, sizeof(card_t), cmp_card); |
|||
} |
|||
int main() |
|||
{ |
|||
int i, j; |
|||
deck d = new_deck(); |
|||
locale_ok = (0 != setlocale(LC_CTYPE, "")); |
|||
printf("New deck, "); show_deck(d); |
|||
printf("\nShuffle and deal to three players:\n"); |
|||
shuffle_deck(d); |
|||
for (i = 0; i < 3; i++) { |
|||
for (j = 0; j < 5; j++) |
|||
show_card(deal_card(d)); |
|||
printf("\n"); |
|||
} |
|||
printf("Left in deck "); show_deck(d); |
|||
/* freeing the data struct requires just free(), but it depends on the |
|||
* situation: there might be cards dealt out somewhere, which is not |
|||
* in the scope of this task. |
|||
*/ |
|||
//free(d); |
|||
return 0; |
|||
}</lang>output<lang>New deck, 52 cards: ♠A ♠2 ♠3 ♠4 ♠5 ♠6 ♠7 ♠8 ♠9 ♠10 ♠J ♠Q ♠K ♥A ♥2 ... |
|||
Shuffle and deal to three players: |
|||
♦3 ♦Q ♥2 ♣J ♣9 |
|||
♥3 ♠5 ♣5 ♠A ♦6 |
|||
♣8 ♥J ♠4 ♠3 ♣A |
|||
Left in deck 37 cards: ♥8 ♣10 ♣K ♦2 ♦A ♥10 ♥6 ♥Q ♠6 ♦4 ♥9 ♠9 ♣6 ♦K ♦8 ♠7 ♣7 ♠K ♠2 ♣4 ...</lang> |
|||
See also [[Playing Cards/C]] |
|||
=={{header|C++}}== |
=={{header|C++}}== |