*All archives* |  *Admin*

<<09  2017/10  1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31  11>>
一人麻雀計算機制作計画その1・計画案とシャンテン数計算
ちょっと前からつくりたいと思っていたのが、一人麻雀計算機。

すでにあらさんやcritterさんが先陣を切って作っていらっしゃいますが、
これと同じような機能に加え、四人麻雀への拡張や麻雀AI制作にまで発展できたらうれしいなぁ、なんて考えています。

制作の手順を言語化してまとめておけば先の展望も見えてきます。
まぁまずは基本的なところからの積み上げですね。

◎Step0・麻雀の基本ルール関連
○Step0-1・シャンテン数計算
○Step0-2・上がり時のメンツ切り分け
○Step0-3・得点計算

◎Step1・従来モデルの一人麻雀計算機制作

◎Step2・モンテカルロシミュレーションによる一人麻雀計算機制作

◎Step3・四人麻雀への拡張

◎Step4・鳴き・点棒状況も考慮した四人麻雀への拡張

◎Step5・ベタ降りの打牌選択

◎Step6・全ツorベタ降り麻雀AI制作

◎Step7~・より複雑な麻雀AI制作

どこかで頓挫する可能性もあるけれど、今のところはこのような予定。うまくいくといいなぁ。
先のことはまだよくわからないので、ざっくりとしたStep分けです。


○Step0-1・シャンテン数計算
一番基本的なやつ。
今日はここまでできました。

参考にさせていただいたのが、「麻雀C言語プログラム集」のコードです。
参考にしたというか、ほぼ丸パクリしています。
いつも私が使ってるVBの言語の文法に合うようにちょっとだけ作り替えただけです。

自力で作ってもバグとかでボロが出そうなので、先人の知恵はありがたく借りることにしましょう。
文法がCとVBでは多少違うので、ある程度はプログラムの流れは理解しておく必要があります。単純な丸パクだけではうまくいかないです。

今日の成果物。
161026-01.png
161026-02.png
161026-03.png

上のテキストボックスに14枚の手牌情報を入力して(文法は東風荘のmjscore形式に準じる。)、
シャンテン数計算ボタンを押すと、シャンテン数などが計算されると。

テキストボックスのすぐ下にある4つの数字は左側から
国士のシャンテン数、チートイのシャンテン数、メンツ手のシャンテン数、副露数です。

シャンテン数計算ボタンの下にあるリストボックスは各牌の番号(マンズが1~9番+赤5mが10番、ピンズが11番~20番、ソーズが21番~30番、字牌が31番~37番)ごとに手牌にある枚数で、
4つある数字のうち左から
鳴いた牌も含めた枚数(赤は区別する)
鳴いた牌も含めた枚数(赤は区別しない)
鳴いた牌を含めない枚数(赤は区別する)
鳴いた牌を含めない枚数(赤は区別しない)

一番上は7s引いて69m引いたら字牌の単騎待ちだから二向聴で合ってる。
二番目は2mを切れば69m待ちの聴牌だから合ってる。(赤5mも正しく処理できている。)
三番目は北を切ればカン5s待ちの聴牌だから合ってる。(副露についても正しく処理できている。)

天鳳の牌理ツールでいくつかテストしてみましたが今のところ間違ったシャンテン数を返してはいないです。
いやー、素晴らしいですねー。これが最先端の科学の力か。

○Step0-2・上がり時のメンツ切り分け
○Step0-3・得点計算
こちらも上記サイトのコードを流用させていただく予定。
手間はかかるけど、ここまでは問題ないでしょう。

◎Step1・従来モデルの一人麻雀計算機制作
再帰式によってツモのみを考慮した和了率と局収支を出す計算プログラム。
この辺から私の力量が問われるでしょう。

◎Step2・モンテカルロシミュレーションによる一人麻雀計算機制作
どの牌を切るかを毎順分岐させて一番局収支が高いものを選択していくみたいな。
この辺はできるかどうかよくわからない。
計算量が発散しそうな気がして、できるかどうかやや悲観的ではあるが。
このStepがクリアできればその先の展望が見えてきます。

◎Step3・四人麻雀への拡張
◎Step4・鳴き・点棒状況も考慮した四人麻雀への拡張
今の局収支シミュレータと同様、パラメータを牌譜解析から得てそれをパーツごとに組み込んでいくみたいな。
今のところは場に出てる枚数とか牌の種類(端寄り中寄り)とかその牌をその他家がすでに切ってるかどうかくらいを考慮できればいいかなーと。山読み的なのはできるかもしれないけど今のところは考えてないです。
ここまでいければすべて全ツッパAIが1個完成します。

◎Step5・ベタ降りの打牌選択
他家攻撃に対してベタ降りするプログラムを別途作ります。
単純に現在切る牌の危険度だけでなく、安全牌の水増し的なことも考えなくてはいけないので、そこまで事は単純ではないです。
さすがに全ツAIよりは簡単だとは思いますが。

◎Step6・全ツorベタ降り麻雀AI制作
◎Step7~・より複雑な麻雀AI制作
後は全ツAIとベタ降りAIを組み合わせれば、最低限麻雀ができる(攻撃と防御ができる)AIが1個完成します。
ここまでいけば後はお楽しみタイムですね。
例えば、
・AIと対戦できる麻雀ゲームを作る
・AIどうしの対戦で牌譜を採取する
・他家から鳴ける牌が出た時の選択
・回し打ち的なAI作り
・どの牌を引いたら降りるか
・染め手やトイトイ狙いのAI

夢が膨らみますねぇ。

やはり最難関はStep1と2ですね。
一人麻雀計算のノウハウを持っていないので、その部分はかなり苦労しそうですが、
その先はすでに今の局収支シミュレータ作りのノウハウを活かせそうなので、なんとかなりそうな予感がします。
スポンサーサイト

コメントの投稿

Secret
(非公開コメント受付中)

コメント

プロフィール

nisi5028

Author:nisi5028
FC2ブログへようこそ!

最新記事
最新コメント
最新トラックバック
月別アーカイブ
カテゴリ
FC2カウンター
フリーエリア
検索フォーム
RSSリンクの表示
リンク
ブロとも申請フォーム

この人とブロともになる

QRコード
QRコード