ポーカーの表示が正しく出ない
ポーカーの役判定がうまくいかない
例)
phpでポーカーの役判定を打ち込んでいる最中です
問題点としては、本来ストレートフラッシュを表示させたいところ、判定ではフラッシュと表示されてしまうので、なんのコードが足りないか、どこに付け足せばいいのかわからないのでどなたかご教授願います。(尚他の判定はクリアしている)
今回のポーカーの条件
// ジョーカー1枚のみ、suitをjoker、numberを0と表す。
// 上記以外は不正として処理してください。
// 追加された役
// 「フォーカード」+ジョーカーは「ファイブカード」
// 判定は強い役を優先してください。組み合わせの強さ順は以下とする。
// ロイヤルストレートフラッシュ > ストレートフラッシュ > ファイブカード > フォーカード > フルハウス > フラッシュ > ストレート > スリーカード > ツーペア > ワンペア
// ジョーカーが出た時点で最低でも「ワンペア」となること
該当するソースコード
// 絵柄不正(joker)ok
// $cards = [
// ['suit'=>'heart', 'number'=>7],
// ['suit'=>'joker', 'number'=>0],
// ['suit'=>'joker', 'number'=>1],
// ['suit'=>'diamond', 'number'=>8],
// ['suit'=>'club', 'number'=>6],
// ];
// 数字の0の不正 ok
// $cards = [
// ['suit'=>'heart', 'number'=>12],
// ['suit'=>'joker', 'number'=>0],
// ['suit'=>'heart', 'number'=>0],
// ['suit'=>'heart', 'number'=>10],
// ['suit'=>'heart', 'number'=>13],
// ];
//ロイヤルストレートフラッシュ ok
// $cards = [
// ['suit'=>'heart', 'number'=>12],
// ['suit'=>'joker', 'number'=>0],
// ['suit'=>'heart', 'number'=>1],
// ['suit'=>'heart', 'number'=>10],
// ['suit'=>'heart', 'number'=>13],
// ];
// ストレートフラッシュ ×
$cards = [
['suit'=>'heart', 'number'=>12],
['suit'=>'joker', 'number'=>0],
['suit'=>'heart', 'number'=>9],
['suit'=>'heart', 'number'=>10],
['suit'=>'heart', 'number'=>13],
];
//ファイブカード ok
// $cards = [
// ['suit'=>'heart', 'number'=>12],
// ['suit'=>'joker', 'number'=>0],
// ['suit'=>'spade', 'number'=>12],
// ['suit'=>'diamond', 'number'=>12],
// ['suit'=>'club', 'number'=>12],
// ];
//フォーカード ok
// $cards = [
// ['suit'=>'heart', 'number'=>12],
// ['suit'=>'joker', 'number'=>0],
// ['suit'=>'spade', 'number'=>9],
// ['suit'=>'diamond', 'number'=>12],
// ['suit'=>'club', 'number'=>12],
// ];
//フルハウス ok
// $cards = [
// ['suit'=>'heart', 'number'=>12],
// ['suit'=>'joker', 'number'=>0],
// ['suit'=>'spade', 'number'=>1],
// ['suit'=>'diamond', 'number'=>12],
// ['suit'=>'club', 'number'=>1],
// ];
//ストレート ok
// $cards = [
// ['suit'=>'heart', 'number'=>9],
// ['suit'=>'joker', 'number'=>0],
// ['suit'=>'heart', 'number'=>10],
// ['suit'=>'spade', 'number'=>13],
// ['suit'=>'heart', 'number'=>12],
// ];
//フラッシュ ok
// $cards = [
// ['suit'=>'heart', 'number'=>12],
// ['suit'=>'joker', 'number'=>0],
// ['suit'=>'heart', 'number'=>9],
// ['suit'=>'heart', 'number'=>2],
// ['suit'=>'heart', 'number'=>13],
// ];
//スリーカード ok
// $cards = [
// ['suit'=>'heart', 'number'=>10],
// ['suit'=>'joker', 'number'=>0],
// ['suit'=>'heart', 'number'=>9],
// ['suit'=>'spade', 'number'=>10],
// ['suit'=>'club', 'number'=>12],
// ];
// // ツーペア ok
// $cards = [
// ['suit'=>'heart', 'number'=>6],
// ['suit'=>'joker', 'number'=>0],
// ['suit'=>'heart', 'number'=>5],
// ['suit'=>'spade', 'number'=>2],
// ['suit'=>'club', 'number'=>2],
// ];
//ワンペア ok
// $cards = [
// ['suit'=>'heart', 'number'=>10],
// ['suit'=>'joker', 'number'=>0],
// ['suit'=>'heart', 'number'=>9],
// ['suit'=>'spade', 'number'=>1],
// ['suit'=>'club', 'number'=>12],
// ];
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);
//jokerありのストレートの時の手札
$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_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);
// 役判定
//jokerありの判定
if (in_array(['suit'=>'joker', 'number'=>0], $cards)){
if ((count(array_intersect($royal,$cards_num)) == 4) && (count($count_suit) == 2)) {
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 {
//jokerなしの判定
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>
自分で試したこと
前の記事にも、似たような件で質問をさせていただき、何人かの方のアドバイスによって、もう一度コードを変更してここまできました。
(今回このプログラムに2週間かけてしまっていたので、もっと早くに聞いておけばよかったと後悔しております(泣))
0