カードを混ぜる

shuffle は、1 組 52 枚のカードを混ぜるサブルーチンです。

rand 関数か List::Util モジュールの shuffle 関数を利用して、1 組のカードを混ぜています。


#カードを混ぜる
sub shuffle(\@) {
  my ($stack) = @_;
  my (@deck); #1 組 52 枚のカード
  my (@ndeck);#NDECK デックのカード

  foreach my $s ('S', 'H', 'D', 'C') {#カードの印 spade, heart, diamond, club
    for ( 1 ..  9) {#カードの数字
      push(@deck, "$s" . "0$_");
    }
    for (10 .. 13) {#カードの数字
      push(@deck, "$s" .  "$_");
    }
  }

  for (my $n = 0; $n < NDECK; $n++) {
    foreach (@deck) {
      push(@ndeck, $_);
    }
  }

  if ($] >= 5.008) {#特殊変数 $] は、Perl のバージョンを識別する文字列
    use List::Util;

    @$stack = List::Util::shuffle(@ndeck);
  } else {
    #擬似乱数を初期化する
    srand;

    #@ndeck から 1 枚ずつ @stack に移動する
    while ($#ndeck >= 0) {
      #rand の引数に数値 X を指定→0 以上 X 未満の小数を返す
      #rand の引数を省略         →0 以上 1 未満の小数を返す
      push(@$stack, splice(@ndeck, int(rand($#ndeck + 1)), 1));
    }
  }
}