タイトルの通り、ポーカーの役を判定するプログラムをJavaScriptで考えてみました。実はこのネタは、以前このブログでExcel VBAバージョンで書いたのですが、JavaScriptでは別の書き方ができるのではと思い実験してみました。
実際のプログラムは以下の通り
実際書いてみたプログラムは以下です。
function poker(){
var hands;
var isFlush = true;
var isStraight = true;
var isRoyalStraight = false;
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で別の書き方がないかなぁと思って探し、一応候補になるものはあったのですが、そんなに記述量を減らせるわけではなさそうだったので、以前書いたものに落ち着きました。
以上です。フラッシュとストレート以外の判定の部分、もっと短く書けるスマートな書き方はないものだろうか。