役を確認する
check は、役を確認するサブルーチンです。
手札を配列として、種類と数字毎の枚数を数えて、以下のどの系統の役か判別します。
- フラッシュ系
- ストレート系
- ペア系
#役を確認する
sub check {
local($i, $j, $s, $n, $flag_f, $flag_s, $flag_3, $npair, @suits, @numbers);
for (0 .. 4) {
#0 から 51 までの番号をカードに換算する
($s, $n) = &calc($player[$_]);
#換算したカードの種類と数字の枚数を追加する
$suits[$s]++;
$numbers[$n]++;
}
#フラッシュ系
for (0 .. 3) {
if ($suits[$_] == 5) {
$flag_f = 1;
last;
}
}
#ストレート系
for ($i = 0; $i < 10; $i++) {#ストレートの低位の数字は 1 から 10 まで
$flag_s = 1;
for ($j = 0; $j < 5; $j++) {
if ($numbers[($i + $j) % 13] != 1) {#13 は 1 と連なる
$flag_s = 0;
last;
}
}
if ($flag_s == 1) {
if (($i == 9) && ($flag_f == 1)) {
return(9);#ロイヤル・ストレート・フラッシュ
} elsif ($flag_f == 1) {
return(8);#ストレート・フラッシュ
} else {
return(4);#ストレート
}
last;
}
}
return(5) if ($flag_f == 1);#フラッシュ
#ペア系
for (0 .. 12) {
if ($numbers[$_] == 4) {
return(7);#フォーカード
} elsif ($numbers[$_] == 3) {
$flag_3 = 1;
} elsif ($numbers[$_] == 2) {
$npair++;
}
}
if ($flag_3) {
if ($npair == 1) {
return(6);#フルハウス
} else {
return(3);#スリーカード
}
} else {
if ($npair == 2) {
return(2);#ツーペア
} elsif ($npair == 1) {
return(1);#ワンペア
}
}
return(0);#ノーペア
}







