カードを混ぜる

shuffle は、1 組 52 枚のカードを混ぜる関数です。

rand 関数を利用して、1 組のカードを混ぜています。


/* カードを混ぜる */
void shuffle(char **stack) {
  int  i, n;
  char deck[IMAX][CMAX] = {/* 1 組 52 枚のカード */
    "S01", "S02", "S03", "S04", "S05", "S06", "S07", "S08", "S09", "S10",
    "S11", "S12", "S13", /* spade */
    "H01", "H02", "H03", "H04", "H05", "H06", "H07", "H08", "H09", "H10",
    "H11", "H12", "H13", /* heart */
    "D01", "D02", "D03", "D04", "D05", "D06", "D07", "D08", "D09", "D10",
    "D11", "D12", "D13", /* diamond */
    "C01", "C02", "C03", "C04", "C05", "C06", "C07", "C08", "C09", "C10",
    "C11", "C12", "C13"  /* club */
  };
  char deckn[IMAX][CMAX];/* NDECK デックのカード */

  for (n = 0; n < NDECK; n++) {
    for (i = 0; i < IMAX; i++) {
      strcpy(deckn[n * NDECK + i], deck[i]);
    }
  }

  /* time 関数により擬似乱数を初期化する */
  srand((unsigned)time(NULL));

  /* deckn から 1 枚ずつ stack に移動する */
  for (i = 0; i < IMAX * NDECK; i++) {
    int index;/* カード番号 */

    /* 未使用カードを探す */
    do {
      /* rand は 0 以上 RAND_MAX 以下の整数を返す */
      index = (int)((float)IMAX * NDECK * rand() / (RAND_MAX + 1.0));
    } while (deckn[index][0] == '\0');

    /* カードを設定する */
    strcpy(stack[i], deckn[index]);

    /* 使用済にする */
    deckn[index][0] = '\0';
  }
}