#include <stdio.h>
static int Counts[14], SumOfCounts; /* 既知のカードの数 */
static int Opened[14]; /* 場に存在する既知のカードの数 */
static int Cards[52], NumberOfCards; /* 場に存在する既知のカード */
static int LastCard; /* 最後に開いたカード */
/* カードを表す文字 */
static char* Characters[14] = {
"_", "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K" };
/* 開く */
static int OpenCard(int number)
{
LastCard = number;
++Counts[number];
++SumOfCounts;
++Opened[number];
Cards[NumberOfCards++] = number;
printf ("%sが出た\n", Characters[number]);
return number;
}
/* 最悪のカードを出す(その1) */
static int NewCard1(void)
{
int i;
for (i = 1; i <= 13; ++i) {
if (Opened[i] == 0 && Counts[i] != 4) {
return OpenCard(i);
}
}
for (i = 1; i <= 13; ++i) {
if (Counts[i] != 4) {
return OpenCard(i);
}
}
LastCard = 0;
return 0;
}
/* 最悪のカードを出す(その2) */
static int NewCard2(void)
{
int i;
for (i = 1; i <= 13; ++i) {
if (i != LastCard && 1 <= Opened[i] && Counts[i] != 4) {
return OpenCard(i);
}
}
for (i = 1; i <= 13; ++i) {
if (i != LastCard && Counts[i] != 4) {
return OpenCard(i);
}
}
if (Counts[LastCard] != 4) {
return OpenCard(LastCard);
}
LastCard = 0;
return 0;
}
/* 指定されたカードが取れるなら取る */
int CaptureCards(int number)
{
int i, j, k;
if (Opened[number] < 2) {
return 0;
}
Opened[number] -= 2;
for (i = 0; i < 2; ++i) {
for (j = NumberOfCards - 1; j >= 0; --j) {
if (Cards[j] == number) {
Cards[j] = 0;
for (k = j; k + 1 < NumberOfCards; ++k) {
Cards[k] = Cards[k + 1];
}
break;
}
}
--NumberOfCards;
}
printf("%sを取った\n", Characters[number]);
return 1;
}
/* カードを表示する */
void Display(void)
{
int i = 0;
for (i = 0; i < NumberOfCards; ++i) {
printf("%s ", Characters[Cards[i]]);
}
for (i = NumberOfCards; i < 52 - (SumOfCounts - NumberOfCards); ++i) {
printf("* ");
}
printf("\n");
}
/* シミュレーション */
int main(int argc, char* argv[])
{
int i, j, n;
for (i = 0; i < 52 && !(NumberOfCards == 0 && SumOfCounts == 52); ++i) {
printf("<%d手目>\n", i + 1);
Display();
if (NewCard1()) {
if (!CaptureCards(LastCard)) {
n = LastCard;
if(NewCard2()) {
if (n == LastCard) {
CaptureCards(LastCard);
}
}
}
} else {
for (j = 1; j <= 13; ++j) {
if (CaptureCards(j)) {
break;
}
}
}
printf("\n");
}
getchar();
return 0;
}