Deal cards for FreeCell: Difference between revisions

Content added Content deleted
No edit summary
(→‎{{header|C}}: colors; just one array)
Line 32: Line 32:
#include <stdlib.h>
#include <stdlib.h>
#include <locale.h>
#include <locale.h>

wchar_t s_suits[] = L"♣♦♥♠", s_nums[] = L"A23456789TJQK";
wchar_t s_suits[] = L"♣♦♥♠", s_nums[] = L"A23456789TJQK";

#define RMAX32 ((1U << 31) - 1)
#define RMAX32 ((1U << 31) - 1)
#define RMAX ((1U << 15) - 1)
#define RMAX ((1U << 15) - 1)
static int seed = 1;
static int seed = 1;
int rnd(void) { return (seed = (seed * 214013 + 2531011) & RMAX32) >> 16; }
int rnd(void) { return (seed = (seed * 214013 + 2531011) & RMAX32) >> 16; }
void srnd(int x) { seed = x; }
void srnd(int x) { seed = x; }

void show(int *c)
int card[52];
void show(void)
{
{
int i;
int i;
for (i = 0; i < 52; i ++)
for (i = 0; i < 52; c++) {
printf("%lc%lc%s",
printf(" \033[%dm%lc\033[m%lc", 32 - (1 + *c) % 4 / 2,
s_suits[card[i] % 4], s_nums[card[i] / 4],
s_suits[*c % 4], s_nums[*c / 4]);
((i + 1) % 8) ? " " : "\n");
if (!(++i % 8) || i == 52) putchar('\n');
}
putchar('\n');
}
}

void deal(int s)
void deal(int s, int *t)
{
{
int i, j, n, t[52];
int i, j;
srnd(s);
for (i = 0; i < 52; i++) t[i] = i;


for (i = 0; i < 52; i++) t[i] = 51 - i;
srnd(s);
for (j = 0, n = 52; n; ) {
for (i = 0; i < 51; i++) {
i = rnd() % n--;
j = 51 - rnd() % (52 - i);
card[j++] = t[i];
s = t[i], t[i] = t[j], t[j] = s;
t[i] = t[n];
}
}
printf("Deal %d\n", s);
show();
}
}

int main(int c, char **v)
int main(int c, char **v)
{
{
int s;
int s, card[52];
if (c < 2 || (s = atoi(v[1])) <= 0) s = 11982;

setlocale(LC_ALL, "");
setlocale(LC_ALL, "");


deal(s, card);
if (c < 2 || (s = atoi(v[1])) <= 0) s = 11982;
printf("Hand %d\n", s);
show(card);


deal(s);
return 0;
return 0;
}</lang>
}</lang>