日本だんでぃ協会
Japan Dandy Association

中の人プロフィール
だんでぃ
web拍手作った人
プログラマーでミュージシャンだと言い張って聞かない37才

おこんてんつ
  トップ
プログラミング (12)
デカ文字ジェネレータ
  音楽 (7)
  ポーカー (1)
  雑記 (1)

リンク
ろじっくぱらだいす
老舗のプログラム系テキストサイト。web拍手を思い付くきっかけをいただいたサイトです。ワタナベさんラヴ!

■ポーカーの役判定プログラムを作ってみよう!

2017/04/09 01:13 作成
2017/04/11 22:13 更新
最近ポーカーにハマってまして。

ポーカーと言っても、日本で一般的な
「5枚ずつカードを配って、いらないカードを交換して・・・」
というポーカーではなく、
いわゆる「テキサスホールデム」というやつなんですが、
詳しいルールはここでは省きますけど、
計7枚のカードから最も強い役ができる5枚を使うというユニークなルールがあります。

このサイトで何かプログラミング講座っぽいことを書きたいな~と思っていたので、
せっかくですし、「テキサスホールデムの役判定プログラム」を作ってみたいと思います。

要件としては
・トランプのカード複数枚のデータを渡したら、それが何の役なのかを返してくれる関数を作る。
・使用する言語はjavascript
・最大で渡されるカードは7枚
・複数の役が成立していたら、最も強い役を返す
・役が何かだけで、Aハイフラッシュとか、10ハイストレートとかまで細かくは判定しない
・同じカードが複数枚あるとか、1~13以外のカード(ハートの14)とかみたいな例外はフォローしない

こんなところでしょうか。

あ、ちなみに、僕は普段はC#かPHPでプログラミングをしているので、
javascriptの命名規則とかお作法が変だったらご指摘いただけると嬉しいです><

~~~~~~~~~~

さて、考えていってみましょう。

まず最初に考えなければいけないのは、
「1枚のカードをどういう形式のデータで表現するか」
なんですけど、

僕が普段使い慣れてるC#だと
class Card{
	
	public enum Suit{
		Spade, Heart, Dia, Club
	}

	public Suit suit;
	public int number;
}
とかやって、classでカードを管理すると思うんですが、
javascriptだとclassって無いのかな?最近実装されたのかな?されつつあるのかな?
この辺の情報がよく分からなかったので、素人っぽいのですが配列でやってしまいましょう。

ということで、カードは以下の感じで管理したいと思います。
card["Mark"] = "Spade";
card["Number"] = 1;
これで「スペードのA」を表現する感じになります。

ポーカーのプレイヤーは複数枚のカードを持っているので、
それは以下の感じで表現しましょう。
card[0]["Mark"] = "Spade";
card[0]["Number"] = 1;
card[1]["Mark"] = "Spade";
card[1]["Number"] = 13;
こんな感じの配列になります。
ちなみにこれはAKスートですね!オールインハンドですね!今日これで致命傷を負って負けたよ!

んで、上記のカードの配列が何の役なのかを判定するプログラムを作るわけですが、
まずは一番判定が簡単そうな「フラッシュ」の役判定を作ってみましょう。
上記の形式で渡された複数枚のカードが、
フラッシュが成立していたら「Yes」、成立していなかったら「No」と応えてくれる関数を作ります。

何故簡単かと言うと、
「同じマークが5枚以上あれば成立」
という条件判定がコード的にシンプルに書けそうだな~と感じたからです。

コード的には以下の感じになります。
function IsFlush( targetCards ){

	//マークを数える入れ物を用意
	var suits = { "Spade":0, "Heart":0, "Dia":0, "Club":0 };

	//引数として渡されたカードのマークをカウントしていく
	for( var i=0; i<targetCards.length; i++ ){
		suits[targetCards[i]["Mark"]]++;
	}

	//カウントし終わったマークを検証していって、5枚同じマークがあったらtrueをリターン
	for( var Key in suits ){
		
		if( suits[Key]>=5 ){
			return true;
		}
	}

	//ここまで到達でフラッシュは成立していない
	return false;
}
こんな感じですね。

この関数の使用例は以下の感じです。
var cards = [
	{ "Mark":"Spade", "Number":1 },
	{ "Mark":"Spade", "Number":3 },
	{ "Mark":"Spade", "Number":5 },
	{ "Mark":"Spade", "Number":9 },
	{ "Mark":"Spade", "Number":11 },
	{ "Mark":"Heart", "Number":2 },
	{ "Mark":"Dia",   "Number":3 },
];

console.log( IsFlush( cards ) );
こんな感じで、カードのデータを渡してあげると
「true」か「false」が返ってくるわけですね。
このサンプルコードだと、スペードのフラッシュが成立しているので
「true」が返ってきます。

この要領で、ポーカーの全ての役の判定ができる関数が出来上がれば、
「ポーカーの役判定プログラム」が完成することになります。

今回はここまで!
次回は他の役の判定プログラムを作りたいと思います。



前の記事 cronで毎分以下の間隔に設定する時の注意点
次の記事 ポーカーの役判定 数字の重なり編
関連記事
ポーカーの役判定 最終回
ポーカーの役判定 ストレート編
ポーカーの役判定 ツーペア、フルハウス編
ポーカーの役判定 数字の重なり編
ポーカーの役判定プログラムを作ってみよう!

2017 日本だんでぃ協会 All Rights Reserved.