カードゲームで使えそうな技

(動作保証なし.サポート対象外.)

カードのシャッフル等...どーする?

カードを配る時に, カード番号を乱数によって生成すれば簡単だが, それだと同じカードが重複してしまうことになる. そこで,現実世界でのカードゲームと同様に, カード列をランダムに並べ替えるとよい.

...
#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);

	...
}

(c) 2014, yanagawa@kushiro-ct.ac.jp