カードを交換する

カードを交換する

change は、カードを交換するサブルーチンです。

捨てるカードを標準入力から受取り、代わりにカードの山から補充します。


#カードを交換する
sub change(\@\@) {
  my ($player, $stack) = @_;
  my ($nflag);#真の flag の数
  my (@flag); #カードの交換フラグ

  #配列を初期化する
  $nflag = 0;
  for (0 .. $#$player) {
    $flag[$_] = 0;
  }

  #交換するカードを決定する
  while (1) {
    my ($i);#入力文字列

    print "Please select the card(s) you want to change (1 - 5). ";
    print "To finish, input 0.\n";
    chomp($i = <STDIN>);

    if      ($i =~ /^[1-M]$/) {
      if ($flag[$i - 1]) {
        next;
      } else {
        $flag[$i - 1] = 1;
      }

      last if (++$nflag == N);
#    } elsif ($i =~ /^0$/) {
    } elsif ($i eq '0') {#正規表現より処理が早い
      last;
    } else {
      print "Input Error!\n";
    }
  }

  #カードを交換する
  for (0 .. $#$player) {
    $$player[$_] = shift(@$stack) if ($flag[$_]);
  }
}