実現したいこと
PHPを使ってポーカーの役を判定するプログラムを作成中です。
大半の役判定プログラムは完成したのですが、「(ジョーカーを含む)ワンペア」の判定だけがうまくいきません。
手持ちのカードが以下の場合、
$cards = [ ['suit' => 'heart', 'number' => 10], ['suit' => 'joker', 'number' => 0], ['suit' => 'spade', 'number' => 1], ['suit' => 'diamond', 'number' => 13], ['suit' => 'club', 'number' => 9], ];
実行すると、
手札は heart10joker0spade1diamond13club9 役はストレートです。
と表示されてしまいます。
本来は「ワンペア」と表示されたい。
該当のソースコード
PHP
1<?php 2$cards = [ 3 ['suit' => 'heart', 'number' => 10], 4 ['suit' => 'joker', 'number' => 0], 5 ['suit' => 'spade', 'number' => 1], 6 ['suit' => 'diamond', 'number' => 13], 7 ['suit' => 'club', 'number' => 9], 8]; 9 10function judge($cards) 11{ 12 $joker = 0; 13 14 if (count($cards) != 5) { 15 exit('不正です'); 16 } 17 $card_numbers = array_column($cards, 'number'); 18 $suit_count = array_count_values(array_column($cards, 'suit')); 19 $number_count = array_count_values($card_numbers); 20 $unique_hands = array_unique($cards, SORT_REGULAR); 21 $hands = count($unique_hands); 22 if ($hands < 5) { 23 exit('不正です'); 24 } 25 26 $suits = ['heart', 'spade', 'diamond', 'club', 'joker']; 27 foreach ($cards as $key => $val) { 28 if (!(in_array($val['suit'], $suits))) { 29 exit('不正です'); 30 } 31 } 32 33 foreach ($cards as $key => $val) { 34 if ($val['number'] >= 14 || $val['suit'] != "joker" && $val['number'] < 1) { 35 exit('不正です'); 36 } elseif ($val['number'] == 0) { 37 $joker++; 38 } 39 } 40 foreach ($cards as $card) { 41 if ($card["suit"] == "joker") { 42 if ($card["number"] != 0) { 43 exit('不正です'); 44 } 45 } 46 } 47 48 array_multisort($card_numbers, SORT_ASC, $cards); 49 $max = max($card_numbers); 50 $min = min($card_numbers); 51 52 //フラッシュ 53 $Flush = (count($suit_count) == 1); 54 $Flush_j = (count($suit_count) == 2); 55 56 //ペア 57 $pair = [1 => 0, 2 => 0, 3 => 0, 4 => 0, 5 => 0]; 58 foreach ($number_count as $v) { 59 $pair[$v]++; 60 } 61 62 //ストレート 63 $straight = ($pair[1] == count($cards) && ($max - $min) <= 4); 64 $straight_j = ($pair[1] == count($cards) && ($max - $min) <= 13); 65 66 //ロイヤル 67 $roy = ($card_numbers[0] == 1 && $card_numbers[1] == 10 && $card_numbers[2] == 11 && $card_numbers[3] == 12 && $card_numbers[4] == 13); 68 69 if ($Flush && $roy) { 70 return "ロイヤルストレートフラッシュ"; 71 } elseif ($Flush && $straight) { 72 return "ストレートフラッシュ"; 73 } elseif ($pair[5] == 1 || $pair[4] == 1 && $joker == 1 || $pair[3] == 1 && $joker == 2 || $pair[2] == 1 && $joker == 3 || $joker >= 4) { 74 return "ファイブカード"; 75 } elseif ($pair[4] == 1 || $pair[3] == 1 && $joker == 1 || $pair[2] == 1 && $joker == 2 || $joker == 3) { 76 return "フォーカード"; 77 } elseif ($pair[2] == 1 && $pair[3] == 1 || $pair[2] == 2 && $joker == 1 || $pair[3] == 1 && $joker == 2) { 78 return "フルハウス"; 79 } elseif ($Flush || $Flush_j && $joker == 1) { 80 return "フラッシュ"; 81 } elseif ($roy || $straight || $straight_j && $joker == 1) { 82 return "ストレート"; 83 } elseif ($pair[3] == 1 || $pair[2] == 1 && $joker == 1 || $joker == 1) { 84 return "スリーカード"; 85 } elseif ($pair[2] == 2) { 86 return "ツーペア"; 87 } elseif ($pair[2] == 1 || $joker == 1) { 88 return "ワンペア"; 89 } else { 90 return "なし"; 91 } 92} 93 94?> 95<!DOCTYPE html> 96<html lang="ja"> 97 98<head> 99 <meta charset="utf-8"> 100 <title>ポーカー役判定</title> 101</head> 102 103<body> 104 <p>手札は</p> 105 <p><?php foreach ($cards as $card) : ?><?= $card['suit'] . $card['number'] ?><?php endforeach; ?></p> 106 <p>役は<?= judge($cards) ?>です。</p> 107</body> 108 109</html>
ご教授いただけると幸いです。よろしくお願い致します。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/11/17 13:18
2022/11/18 00:23