(動作保証なし.サポート対象外.)
カードのシャッフル等...どーする?
カードを配る時に, カード番号を乱数によって生成すれば簡単だが, それだと同じカードが重複してしまうことになる. そこで,現実世界でのカードゲームと同様に, カード列をランダムに並べ替えるとよい.
...
#include <stdlib.h>
#include <time.h>
// データ構造
typedef struct {
char suit; // S H C D
char rank; // A 2 3 4 5 6 7 8 9 0 J Q K
// (0 は 10 を意味する,という手抜き)
} Card;
// カードの初期化(順序良く並べておく)
void InitCard(Card *card)
{
char *suit = "SHCD";
char *rank = "A234567890JQK";
int i, j;
for (i = 0; i < 4; i++) {
for (j = 0; j < 13; j++) {
card->suit = suit[i];
card->rank = rank[j];
card++;
}
}
}
// 整数乱数(min 以上,max 以下)
int Rand(int min, int max)
{
return (min + (int)((max - min + 1.0)*rand()/(RAND_MAX + 1.0)));
// 正しい乱数の使用方法
// return (min + rand%(max - min + 1)); // 簡易的な乱数の使用方法
}
// カードの交換(card[a] と card[b])
void SwapCard(Card *card, int a, int b)
{
Card tmp;
tmp = card[a];
card[a] = card[b];
card[b] = tmp;
}
// カードのシャッフル(n 回)
void Shuffle(Card *card, int n)
{
int i;
for (i = 0; i < n; i++) {
SwapCard(card, Rand(0, 51), Rand(0, 51));
}
}
int Game()
{
Card card[52]
srand(time(NULL));
InitCard(card);
Shuffle(card, 100);
...
}