スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
[ --/--/-- --:-- ] スポンサー広告 | TB(-) | CM(-)

JavaScriptでポーカー その2

それでは、感想も最後に置きつつ、コードの簡単な解説をしていきたいと思います。

興味ない方は読んでもよく分らないまま終わっていきそうなので、そういった方は全体の流れだけ読んでもらえればと思います。

まず、コードです。



相変わらずへぼったいコードでごめんなさい(泣)

さて、全体の流れなのですが、その前に言葉の意味の確認です。「スート」と「位」だけですが
ハートのキングの 「スート」はハート、「位」は13
以上。

さて、話を進めましょう。
大雑把な流れは、

カードを用意→カードを引く→カード交換→役の判定→役の決定

です。
これではリアルでするポーカーの説明以下なのでもう少し。

カードを用意・・・カードを表す配列を用意し、トランプのスート、位と対応させる。

カードを引く・・・同じカードの重複に気をつけながら手札にカードを入れていく。(引くことと配られることは実質同じなので、細かいことは気にしない)

カード交換・・・手札のなかからカードを選び、抜き去る。そして別のカードを補充。

役判定・・・手札を分析し、どの役に合致しているか判定する

こんな感じです。交換なしで次々カードを引きたい場合はループ処理を行うだけでOKです。

さて、細かい流れを見ていきましょう。


行程は全体の流れと同じです。


[カードを用意]

○トランプと配列 : [0,1,2,……,51] を1対1対応させます。
このとき対応のさせ方はとりあえず2通りあって、

カード番号対応表
その1
位番号
・・・ 13
スート番号 ・・・ 48 カード番号
・・・ 49
・・・ 50
・・・ 51

カード番号対応表
その2
位番号
・・・ 13
スート番号 ・・・ 12 カード番号
13 14 ・・・ 25
26 27 ・・・ 38
39 40 ・・・ 51

このうち、その1を使います。
理由は、カード配列を数値でソートしたとき、同位札が隣に来てくれるからです。

○カード使用配列 : [1,1,・・・,1] (52個) を用意します。
これは山札からカードがなくなったときに、それと対応する要素を0にすることで同じカードを引くことを防ぐ役割があります。

○手札配列・・・手札を表す配列。初期は[-1,-1,-1,-1,-1]で、-1は持っていないことを表します。

○スート配列・・・手札を見て、スート別に集計したものをここに入れます。
例えば、手札がスペード2枚、ハート1枚、ダイヤ0枚、クラブ2枚だったとき [2,1,0,2]となります。
カード番号を4で割った余りでスート番号は出せます( n%4 )

○位配列・・・スート配列と同じように、今度は位別に集計したものを入れます。
例えば1、2、2、4、5 だったとき [1,2,0,1,1,0,0,0,0,0,0,0,0]となります。
カード番号を4で割ったものに1を加えた整数部分で位番号は出せます。 ( Math.floor( n/4 + 1 ) )


[カードを引く]
0から51までのランダムな整数を取ってきて、手札配列に入れます。このとき、引いてきたカードの使用配列の対応要素を0にします。これを手札が埋まるまでします。
このとき、カード使用配列が0のカードは引かないようにします。
例: 最初に引いたのがスート番号1、位2(カード番号5)だった場合 手札:[5,-1,-1,-1,-1] カード使用配列:[1,1,1,1,1,0,1,・・・,1](52個) 以下、繰り返し


[カード交換]
手札配列の該当箇所を-1にしてもう一度カードを引きます。


[役の判定]
●フラッシュ系・・・スート配列に5があるか調べて終わり。スート配列[5,0,0,0]は全て同じスートであることをいっているから。

●フルハウス系(4カード、2ペアなど)・・・位配列に2、3、4が入っているかを調べていってそれぞれに対応した戻り値をつくる。
判定の例 値配列:[4,1,0,0,……,0](13個)のとき1(A)のフォーカード
値配列:[2,0,3,0,……,0](13個)のとき1(A)が2枚、3が3枚のフルハウス


●ストレート系・・・値配列を使います。
最初に1が入っているところから隣の要素が1であるかを順次調べていき、4回調べてそれも1だった場合はストレートと判定します。また、10、11、12、13、1のストレート判定は例外的に行います(ロイヤル判定のために戻り値別)
例 値配列array:[0,0,1,1,1,1,1,0,0,0,0,0,0] のとき、インデックス2(==array.indexOf(1))からスタート array[2]+array[3]==2 のとき array[3]+array[4]==2 を調べて、繰り返す。
4回繰り返せたらそれはストレートである。


[役の決定]
手札に対して役の判定を行う。このときフルハウス系であることが分かったときストレート系の判定はしない。

そして、結果表示。



こんな感じです。ストレートの判定なんですが、カードの位だけを取ってきた配列(手札が2,3,5,8,8のとき[2,3,5,8,8])をもう一個用意すればよかったのかもしれませんね。位配列を使ったおかげでだいぶ苦労しました。
ストレートじゃないやつまでストレートと判定されまくりなのが多かったです(泣)


あと、今回初めてJavaScriptでクラスの概念を使いました。
というわけで使い慣れてません。コードの変なところがあった場合はそれのせいです。
基本、通ればいいやと思っているのでテキトーですね(笑)
そしてfunciton便利すぎやしないかと思いますね。なんでもできちゃう。functionおよびJavaScript大好きです♪

・・・長くなってきましたね。

今日はこのへんで失礼したいと思います。
それでは!

関連記事
[ 2011/11/30 08:25 ] プログラミング JavaScript | TB(0) | CM(4)

ブロ友ありがとうございます。
Javaスクリプトですか。
いいですね~やってみたくなりました。
[ 2011/11/30 23:03 ] [ 編集 ]

>satoshiさん
こちらこそありがとうございます!
JavaScriptいいですよ。何しろ使い勝手がいいですからね。
Cの処理速度には遠く及ばないですが・・・(笑)
[ 2011/12/01 15:36 ] [ 編集 ]

初めまして。

ブログがとてもキレイだったので、
思わず覗いてしまいました。(*^^*)

ブログの更新は順調ですか?
ワタシは今、ダイエット中なんですっ(^ー^)ノ

日記を付けているので、
是非覗いて見てください\(^o^)/

コメント頂けたらありがたいで~す(*^^*)
[ 2011/12/01 22:08 ] [ 編集 ]

>星野早希さん

ご訪問ありがとうございます!
ブログの更新はまさしく気ままですね(笑)

ダイエット日記ですか。
頑張ってください!
またちょくちょく遊びに行きます!
[ 2011/12/02 22:46 ] [ 編集 ]

コメントの投稿













管理者にだけ表示を許可する

トラックバック

この記事のトラックバックURL
http://kiyoshiroom.blog.fc2.com/tb.php/28-ae4a5c67









上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。