php ジョーカー追加 出力

実現したいこと

手札は
heart2 heart5 heart3 heart4 joker0
役はストレートフラッシュです と出力したいのですが、
手札は
heart2 heart5 heart3 heart4 joker0
役はなしです と表示されてしまいます。

発生している問題・分からないこと

役が成立している場合:
手札は
heart2 heart5 heart3 heart4 joker0
役はストレートフラッシュです と出力したいのですが、コードでジョーカーを追加し出力すると
手札は
heart2 heart5 heart3 heart4 joker0
役はなしです と表示されてしまいます。
また・役が成立していない場合:
手札は
heart1 spade2 diamond11 club13 heart9
役はなしです 
・不正の場合:
heart1 heart1 heart3 heart4 joker1
手札は不正です   と$cardsの配列を差し替えても出力結果が変わるようにしたいです。

該当のソースコード

php

1// 手札2$cards = [3 ['suit'=>'heart', 'number'=>2],4 ['suit'=>'heart', 'number'=>5],5 ['suit'=>'heart', 'number'=>3],6 ['suit'=>'heart', 'number'=>4],7 ['suit'=>'joker', 'number'=>0],8];9 10function judge($cards) {11 // カードの不正チェック12 $validSuits = ['heart', 'spade', 'diamond', 'club', 'joker'];13 $validNumbers = range(0, 13);14 $seenCards = [];15 16 foreach ($cards as $card) {17 if (!in_array($card['suit'], $validSuits) || !in_array($card['number'], $validNumbers)) {18 return "手札が不正です";19 }20 if ($card['suit'] !== 'joker' && $card['number'] !== 0) {21 $cardKey = $card['suit'] . '-' . $card['number'];22 if (isset($seenCards[$cardKey])) {23 return "手札が不正です";24 }25 $seenCards[$cardKey] = 1;26 }27 }28 29 // カードの並び替え30 usort($cards, function ($a, $b) {31 return $a['number'] - $b['number'];32 });33 34 // 役判定35 $suits = array_column($cards, 'suit');36 $numbers = array_column($cards, 'number');37 $numCounts = array_count_values($numbers);38 $numUnique = count(array_unique($numbers));39 $numMax = max($numbers);40 $numMin = min($numbers);41 $isFlush = count(array_unique($suits)) === 1;42 $isStraight = $numUnique === 5 && ($numMax - $numMin === 4 || ($numMax === 13 && $numMin === 1 && count(array_intersect($numbers, [2, 3, 4, 5])) === 4));43 44 // ジョーカーを考慮した役判定45 if ($isFlush) {46 $flushCards = array_filter($cards, function ($card) {47 return $card['suit'] !== 'joker';48 });49 $isFlush = count(array_unique(array_column($flushCards, 'suit'))) === 1;50 }51 52 if ($isStraight && $isFlush) {53 return "役はストレートフラッシュです";54 } elseif (in_array(4, $numCounts)) {55 return "役はフォーカードです";56 } elseif (in_array(3, $numCounts) && in_array(2, $numCounts)) {57 return "役はフルハウスです";58 } elseif (in_array(3, $numCounts)) {59 return "役はスリーカードです";60 } elseif ($isFlush) {61 return "役はフラッシュです";62 } elseif ($isStraight) {63 return "役はストレートです";64 } elseif ($numUnique === 3) {65 return "役はツーペアです";66 } elseif ($numUnique === 4) {67 return "役はワンペアです";68 } else {69 return "役はなしです";70 }71}72 73$result = judge($cards);74if ($result !== "役はなしです") {75 echo "手札は" . "\n";76 foreach ($cards as $card) {77 echo $card['suit'] . $card['number'] . ' ';78 }79 echo $result;80} else {81 echo "手札は" . "\n";82 foreach ($cards as $card) {83 echo $card['suit'] . $card['number'] . ' ';84 }85 echo "\n" . "役はなしです";86}

試したこと・調べたこと

上記の詳細・結果

chat gptで修正箇所など調べて、コードを変更してみたのですが、出力結果は変わらず 役はなしですと表示されます。

補足

特になし

コメントを投稿

0 コメント