どうでもいいプログラム研究所

とある編集者によるIT、Web、ソフトウェア、プログラミングに関する雑記と覚え書き

JavaScriptでポーカーの役を判定するプログラムを書いてみた

f:id:tdyu5021:20191011031708j:plain

タイトルの通り、ポーカーの役を判定するプログラムをJavaScriptで考えてみました。実はこのネタは、以前このブログでExcel VBAバージョンで書いたのですが、JavaScriptでは別の書き方ができるのではと思い実験してみました。

実際のプログラムは以下の通り

実際書いてみたプログラムは以下です。

 

function poker(){
var hands;
var isFlush = true;
var isStraight = true;
var isRoyalStraight = false;

//二次元配列を作って適当に手札を作る(数字とスーツの組み合わせを格納する)
//s:スペード/h:ハート/c:クローバー/d:ダイヤ
var arr = new Array();
arr = [
  {suit:"s",num:12},
  {suit:"d",num:13},
  {suit:"h",num:11},
  {suit:"s",num:1},
  {suit:"d",num:10}
];

//ソート
arr.sort(function(a,b){
  if(a.num<b.num) return -1;
  if(a.num > b.num) return 1;
  return 0;
});

//フラッシュとストレートかを判定
for(var i = 0; i<arr.length-1; i++){
  flg1 = (arr[i].suit == arr[i+1].suit);
  flg2 = ((arr[i+1].num - arr[i].num) ==1);
  if(!flg1) isFlush = false;
  if(!flg2) isStraight = false;
  }
  isRoyalStraight = (arr[0].num==1&&arr[1].num==10&&arr[2].num==11&&arr[3].num==12&&arr[4].num==13);

  //すべて判定
if(isFlush) {  
  hands ="Flush";
  if(isStraight) hands ="StraightFlush";
  if(isRoyalStraight) hands ="RoyalStraightFlush";
  return hands;
}else{
  if(isStraight||isRoyalStraight) {
    return hands = "Straight";
  }else{
      var cnt =0;
      for(var max = 3; max>=0; max--){
        var i = 3 -max; 
        for(var j=1; j<=max+1; j++){
          if(arr[i].num==arr[i+j].num) cnt++;
        }
      }
      switch(cnt){
        case 6:
          return hands= "FourCards";
        case 4:
          return hands= "FullHouse";
        case 3:
          return hands= "ThreeCards";
        case 2:
          return hands= "TwoPairs";
        case 1:
          return hands= "OnePair";
        default:
          return hands = "NoPair";
      }    
  }
}
}

このプログラムでは、成立した役名の文字列を返すようにしています。上記のサンプルコードだとストレートが成立するので、関数を実行すると、”Straight”という文字列が返るようになっています。以下、手順と要点です。 

手札の数字とスーツを配列に格納

本来ならランダムに生成させるのですが、上記のコード内では取り急ぎ決め打ちで入れています。スーツと数字を二次元配列で管理しています。ここはVBAと違って本当に楽ですね~。

手札を昇順にソートする

役を判定するにはまず手札をソートする必要がありますが、JavaScriptには標準でソートのメソッドがあるので非常に楽です。これを知ったときはちょっと感動しました(当然ながらVBAでは用意されていないので。なので誰かがWebに上げてたクイックソートをコピペして使いました)

といいつつ、私はまだこのSortメソッドの使い方を知らず、以下の記事をみてコピペしただけですので、まぁまた必要なときに勉強します・・・

qiita.com

最初にフラッシュとストレートを判定するフラグを立てる

フラッシュやストレートを判定するロジックをif文の条件式の中に組み込んでもよいのですが、そうすると煩雑になりそうなので、

isFlush
isStraight
isRoyalStraight

などの変数を設け、フラッシュやストレートが成立するかを予め格納しておきました。

フラッシュ、ストレート以外の 判定

ここはVBA編で書いたものと同じロジックですので詳しくはVBA編を参照してください。当初、JavaScriptで別の書き方がないかなぁと思って探し、一応候補になるものはあったのですが、そんなに記述量を減らせるわけではなさそうだったので、以前書いたものに落ち着きました。

 

以上です。フラッシュとストレート以外の判定の部分、もっと短く書けるスマートな書き方はないものだろうか。