ポーカーの役判定でテスト
ポーカーの役判定で強い順から並べてテストした結果、うまく表示できない。
例)
phpでポーカーの役判定でプログラムは組めたのですが、判定がうまく出ないため困っています。アドバイスお願いいたします。
まず決まりとしてポーカープログラムにジョーカーを追加してください。
// ジョーカー1枚のみ、suitをjoker、numberを0と表す。
// 上記以外は不正として処理してください。
// 追加された役
// 「フォーカード」+ジョーカーは「ファイブカード」
// 判定は強い役を優先してください。組み合わせの強さ順は以下とする。
// ロイヤルストレートフラッシュ > ストレートフラッシュ > ファイブカード > フォーカード > フルハウス > フラッシュ > ストレート > スリーカード > ツーペア > ワンペア
// ジョーカーが出た時点で最低でも「ワンペア」となること
これらを前提とする
発生している問題・エラー
この場合だとジョーカーも入れて同じ数字が3枚なっているため
スリーカードの判定が出ないといけないがワンペアのままになっている
該当するソースコード
// 絵柄不正(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],
// ];
//ロイヤルストレートフラッシュ ×
// $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],
// ];
//ファイブカード ×
// $cards = [
// ['suit'=>'heart', 'number'=>12],
// ['suit'=>'joker', 'number'=>0],
// ['suit'=>'spade', 'number'=>12],
// ['suit'=>'diamond', 'number'=>12],
// ['suit'=>'club', 'number'=>12],
// ];
//フォーカード ○
// $cards = [
// ['suit'=>'heart', 'number'=>12],
// ['suit'=>'joker', 'number'=>0],
// ['suit'=>'spade', 'number'=>9],
// ['suit'=>'diamond', 'number'=>12],
// ['suit'=>'club', 'number'=>12],
// ];
//フルハウス ○
// $cards = [
// ['suit'=>'heart', 'number'=>12],
// ['suit'=>'joker', 'number'=>0],
// ['suit'=>'spade', 'number'=>1],
// ['suit'=>'diamond', 'number'=>12],
// ['suit'=>'club', 'number'=>1],
// ];
//ストレート ×
// $cards = [
// ['suit'=>'heart', 'number'=>9],
// ['suit'=>'joker', 'number'=>0],
// ['suit'=>'heart', 'number'=>10],
// ['suit'=>'spade', 'number'=>13],
// ['suit'=>'heart', 'number'=>12],
// ];
//フラッシュ ×
// $cards = [
// ['suit'=>'heart', 'number'=>12],
// ['suit'=>'joker', 'number'=>0],
// ['suit'=>'heart', 'number'=>9],
// ['suit'=>'heart', 'number'=>2],
// ['suit'=>'heart', 'number'=>13],
// ];
//スリーカード ×
// $cards = [
// ['suit'=>'heart', 'number'=>10],
// ['suit'=>'joker', 'number'=>0],
// ['suit'=>'heart', 'number'=>9],
// ['suit'=>'spade', 'number'=>10],
// ['suit'=>'club', 'number'=>12],
// ];
// // ツーペア ×
// $cards = [
// ['suit'=>'heart', 'number'=>6],
// ['suit'=>'joker', 'number'=>0],
// ['suit'=>'heart', 'number'=>2],
// ['suit'=>'spade', 'number'=>2],
// ['suit'=>'club', 'number'=>12],
// ];
//ワンペア ×
// $cards = [
// ['suit'=>'heart', 'number'=>10],
// ['suit'=>'joker', 'number'=>0],
// ['suit'=>'heart', 'number'=>9],
// ['suit'=>'spade', 'number'=>1],
// ['suit'=>'club', 'number'=>12],
// ];
function judge($cards) {
// この関数内に処理を記述
$cover = array_unique($cards,SORT_REGULAR);
$unique = count($cover);
foreach($cards as $card){
if($card['number']> 13 || $card['number'] < 0){
return "手札が不正";
}elseif($card['suit'] !='heart' && $card['suit'] !='spade'&& $card['suit'] !='diamond'&& $card['suit'] !='club'&& $card['suit'] !='joker'){
return "手札が不正";
}elseif($unique<5){ //重複分が削除されていた場合不正を返す
return "手札が不正";
}elseif ($card['suit']=="joker" && $card['number']!= 0) {
return '手札は不正';
}elseif($card['suit'] !='joker' && $card['number']==0){
return "手札が不正";
}
}
// カードの並び替え
$sortNum= array_column($cards,'number');
sort($sortNum);
$royal = [1,10,11,12,13];
$suit_array = array_column($cards,'suit');
$min = $sortNum[0];
$rangeNum= range($min,$min + 4);
$countNum = array_count_values($sortNum);//同じ数をカウント
$serch ='joker';
$j_check = in_array($serch,$suit_array);//'joker'がsuitに含まれるかチェック
// ロイヤルストレートフラッシュ > ストレートフラッシュ > ファイブカード > フォーカード > フルハウス > フラッシュ > ストレート > スリーカード > ツーペア > ワンペ
// 役判定
if (($sortNum == $royal) && (count(array_unique($suit_array)) == 1)) {
$result = 10; // ロイヤルストレートフラッシュ
} elseif (($sortNum == $rangeNum) && (count(array_unique($suit_array)) == 1)) {
$result = 9;// ストレートフラッシュ
} elseif (((count($countNum) == 4) && (array_keys($countNum,4)))&&($j_check)) {
$result = 8;//役はファイブカード
} elseif (((count($countNum) == 4) || (array_keys($countNum,3)))&&($j_check)) {
$result = 7;//役はフォーカード
} elseif ((count($countNum) == 3)||(($j_check))) {
$result = 6;//役はフルハウス
} elseif ((count(array_unique($suit_array)) == 1)&& ($j_check)) {
$result = 5;// フラッシュ
} elseif ($sortNum == $rangeNum){
$result = 4;// ストレート
} elseif ((count($countNum) == 3) && (array_keys($countNum,3))|| (count($countNum) == 4) && ($j_check)) {
$result = 3;//スリーカード
} elseif (count($countNum) == 3|| (count($countNum) == 3) && ($j_check)) {
$result = 2;//ツーペア
} elseif ((count($countNum) == 1) || (count($countNum) == 0)&&($j_check)){//またはジョーカーを引いた時
$result = 1;//ワンペア
} else {
$result = 0;//役なし
}
// ロイヤルストレートフラッシュ > ストレートフラッシュ > ファイブカード > フォーカード > フルハウス > フラッシュ > ストレート > スリーカード > ツーペア > ワンペ
// 結果を返す
switch ($result) {
case 10:
return "役はロイヤルストレートフラッシュ";
break;
case 9:
return "役はストレートフラッシュ";
break;
case 8:
return "役はファイブカード";
break;
case 7:
return "役はフォーカード";
break;
case 6:
return "役はフルハウス";
break;
case 5:
return "役はフラッシュ";
break;
case 4:
return "役はストレート";
break;
case 3:
return "役はスリーカード";
break;
case 2:
return "役はツーペア";
break;
case 1:
return "役はワンペア";
break;
case 0:
return "役はなし";
break;
}
}
?>
<!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>
自分で試したこと
恥ずかしながらポーカーのルールも知らなかったのでルールから覚えました。
資料「【すぐ出来る】ポーカーのルールを世界一わかりやすくプロギャンブラーが解説します。【テキサスホールデム】」
世界のヨコサワ
https://www.youtube.com/watch?v=tGoA4OWzzAk
あとはプロゲートなどで基本から立ち返ってみましたが、なかなかわからず
今の段階で検証をするためにテストをしたが、(ロイヤルストレートフラッシュ ストレートフラッシュ ファイブカード ストレート フラッシュ スリーカード ツーペア ワンペア)が読み込めていない
ジョーカーはどのカードにでもなりえるのでやはり、ジョーカーのコードが悪いのかもはや、どこを直せばいいのかわからないので、どなたかアドバイスや考え方をお願いいたします