yopisan
@yopisan (kota)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

ポーカーの表示が正しく出ない

ポーカーの役判定がうまくいかない

例)
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

1Answer

判定で「フラッシュ」と表示されるのであれば、少なくともストレートフラッシュの条件に合っていないのでしょう。
どのように判定しようとしているのか分からないので、ひとまず原因だけ記載しておきます。

記載のコードから抜粋
$cards = [
   ['suit'=>'heart', 'number'=>12],
   ['suit'=>'joker', 'number'=>0],
   ['suit'=>'heart', 'number'=>9],
   ['suit'=>'heart', 'number'=>10],
   ['suit'=>'heart', 'number'=>13],
];

$cards_suit = array_column($cards,'suit');
$count_suit = array_count_values($cards_suit);

//ストレートの時の手札
$cards_num = array_column($cards,'number');

//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];

foreach( $cards as $value) {
  $number_cards[] = $value['number'];
}
array_multisort($number_cards, SORT_ASC, SORT_REGULAR, $cards);


if (in_array(['suit'=>'joker', 'number'=>0], $cards)){
    var_dump($j_str_num); // [8, 9, 10, 11, 12]
    var_dump($cards_num); // [12, 0 , 9, 10, 13]
    var_dump(count(array_intersect($j_str_num,$cards_num))); // 3
    var_dump(count($count_suit)); // 2
}

上記の結果を見ると、ストレートフラッシュ判定の左側の条件に合っていないようですね。

count(array_intersect($j_str_num,$cards_num)) == 4

$j_str_numの値は想定どおりでしょうか?

0Like

Comments

  1. @yopisan

    Questioner

    やはり、想定通りには動いていなかったみたいです。
    なので、count(array_intersect($j_str_num,$cards_num)) == 3に変えたら
    ストレートフラッシュが表示されました。

Your answer might help someone💌