ポーカー役判定うまく表示できない
ポーカーの表示が思い通りにいかないので、どなたかご教授お願いいたします。
(ルール)
// 「algorithm5」で作成したポーカープログラムにジョーカーを追加してください。
// ジョーカー1枚のみ、suitをjoker、numberを0と表す。
// 上記以外は不正として処理してください。
// 追加された役
// 「フォーカード」+ジョーカーは「ファイブカード」
// 判定は強い役を優先してください。組み合わせの強さ順は以下とする。
// ロイヤルストレートフラッシュ > ストレートフラッシュ > ファイブカード > フォーカード > フルハウス > フラッシュ > ストレート > スリーカード > ツーペア > ワンペア
// ジョーカーが出た時点で最低でも「ワンペア」となること
一つ目
https://i.gyazo.com/270b0cd8b60a20b7c04b349337fbe19d.png
こちらはこちらは、ストレートフラッシュになるのが正解です。
ですが役なしと表示されてしまう。
二つ目
https://gyazo.com/3598d5d09a8d7469ce24de8eff44cb39
こちらは、不正になるのが正解です。
なぜなら、カードの数は13以上の数字が存在しないから。
該当するソースコード
$cards = [
['suit'=>'heart', 'number'=>15],
['suit'=>'spade', 'number'=>15],
['suit'=>'joker', 'number'=>0],
['suit'=>'diamond', 'number'=>20],
['suit'=>'club', 'number'=>20],
];
function judge($cards) {
//絵札の枚数
$cards_suit = array_column($cards,'suit');
$count_suit = array_count_values($cards_suit);
//ストレートの時の手札
$cards_num = array_column($cards,'number');
$num_min = $cards_num[0];
$str_num = range($num_min , $num_min+4);
$j_num_min = $cards_num[2];
$j_str_num = [$j_num_min-1,$j_num_min,$j_num_min+1,$j_num_min+2,$j_num_min+3];
//数字の枚数
$count_num = array_count_values($cards_num);
//ロイヤルストレートフラッシュの数字
$royal = [1,10,11,12,13];
// カードの不正チェック
if (count(array_unique($cards,SORT_REGULAR)) < 5) {
return "不正";
}
elseif ((count(array_keys($cards_suit,'joker'))) >= 2) {
return "不正";
}
elseif ((count(array_keys($cards_suit,'joker'))) >= 2) {
return "不正";
}
elseif ((count(array_keys($cards_num,0))) >= 2) {
return "不正";
}
// カードの並び替え
foreach( $cards as $value) {
$suit_cards[] = $value['suit'];
$number_cards[] = $value['number'];
}
array_multisort($number_cards, SORT_ASC, SORT_REGULAR, $cards);
// 判定
if (in_array(['suit'=>'joker', 'number'=>0], $cards)){
if ((count(array_intersect($royal,$cards_num)) == 4) && (count($count_suit) == 4)) {
return "ロイヤルストレートフラッシュ";
}
elseif ((count(array_intersect($j_str_num,$cards_num)) == 4) && (count($count_suit) == 2)){
return "ストレートフラッシュ";
}
elseif (count($count_num) == 2) {
return "ファイブカード";
}
elseif ((count($count_num) == 3) && (max($count_num) == 3)) {
return "フォーカード";
}
elseif (count($count_num) == 3) {
return "フルハウス";
}
elseif (count(array_intersect($j_str_num,$cards_num)) == 4) {
return "ストレート";
}
elseif (count($count_suit) == 2) {
return "フラッシュ";
}
elseif (count($count_num) == 4) {
return "スリーカード";
}
else {
return "ワンペア";
}
}
else {
if (($cards_num == [1,10,11,12,13]) && (count(array_unique($cards_suit)) == 1)) {
return "ロイヤルストレートフラッシュ";
}
elseif (($cards_num == $str_num) && (count(array_unique($cards_suit)) == 1)) {
return "ストレートフラッシュ";
}
elseif (array_keys($count_num,4)) {
return "フォーカード";
}
elseif (count($count_num) == 2) {
return "フルハウス";
}
elseif (count($count_suit) == 1) {
return "フラッシュ";
}
elseif ($cards_num == $str_num) {
return "ストレート";
}
elseif ((count($count_num) == 3) && (array_keys($count_num,3))) {
return "スリーカード";
}
elseif (count($count_num) == 3) {
return "ツーペア";
}
elseif (count($count_num) == 4) {
return "ワンペア";
}
else {
return "なし";
}
}
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>ポーカー役判定(ジョーカーあり)</title>
</head>
<body>
<section>
<p>手札は</p>
<p><?php foreach($cards as $card): ?><?=$card['suit'].$card['number'] ?><?php endforeach; ?></p>
<p>役は<?=judge($cards) ?>です。</p>
</section>
</body>
</html>
自分で試したこと
自分で試したこととして
一つ目は
elseif ((count(array_intersect($j_str_num,$cards_num)) == 5) && (count($count_suit) == 2)){
return "ストレートフラッシュ";
}
の($j_str_num,$cards_num)) == 5) の数字を5に変えたなぜなら、同じマークかつ連番のため単純に5に変えるだけなのかなと思い変えた
二つ目はカードの不正チェックに
foreach($cards as $card){
if($card['number']> 13 || $card['number'] < 0){
return "手札が不正";
}
コードを入れ込んだら解消されるかと思い取り組んだが、Unexpected 'EndOfFile'.syntax error, unexpected end of fileが表示されているので、
}を付け足したりしたがエラーは解消されませんでした。
長々となりましたが、これらの条件にあうコードやアドバイスなどお願いいたします。