2008/11/27

麻雀シミュレータを作ってみる(1)

目的

「統計データに基づいた知識を得て麻雀生活に役立てたい」的な。

麻雀の楽しいところは、運の要素が勝敗に少なからず絡んでくるため
素人とベテランが混じっても圧倒的大差にならずにいい勝負ができたりする所かなと思っています。

それでも、長期的には運の要素が相殺されるため、確率をより正しく推定できる人が強かったりします。

そこでひとつ、
こんな方法ではどんな勝率になるのかとか、
こういうときはこうなる可能性が高いとか、
そういった統計データに基づいた知識を見つけていこうかなといったところです。

例えば、中盤以降は全探索して得失点の期待値が最大になる捨て牌が計算できちゃうんじゃないかとか、
そのような打ち方を勉強して自分の推定精度を改善するとか、いろんなことができそうな気がして楽しみです。



先人の例

かなり研究されてるみたいです。商用ゲームの AI とか、もっと進んでいたりするかもです。





とりあえず実装

まずはゲームの進行をシミュレートする基本的な部分。

今日の実装は


  • 実装の手間を考えて Python で
  • ランダムに牌を切る SimpleAI が4人
  • 鳴きなし
  • ドラ、赤牌なし
  • リーチなし
  • 和了り判定なし
  • 得点計算なし


という、とりあえずみんなランダムに捨てていって流局というしょぼいものです。

いまのところコードは 130 行です。

↓序盤、プレイヤー「3」が中をツモって打3筒の図



=== Tumo 3 中
=== Da 3 ③
-- Board state --
Yama:
⑨⑥⑦九二七6③⑧七五7八3



⑤西南中③二⑧九⑦白白
三③67⑨四2七143九五⑦北北8
9發1白①6南二西⑥四5八⑨9三5
5一①8⑤三4八②東⑧四1⑤②④1

0 Hand: 二七①⑥⑦2346東白發發
1 Hand: 一四①④4799東東北中中
2 Hand: 一三六九②④⑨238南南發
3 Hand: 一五六六②⑧2578西西中

0 Kawa: ⑥八
1 Kawa: 北⑤
2 Kawa: 六④
3 Kawa: 五③





今後?


  • 和了り判定、向聴数計算
  • 見えている牌の情報を使ってなるべく早く和了る AI
  • 点数計算
  • 得点の期待値が最大になるような手を選ぶ AI
  • 他家も効率的な打ち手だと仮定したときの AI(確率分布の修正、攻め/ベタオリの行動決定)
  • ...など?


Cygwin のコンソールから

「二七①⑥⑦2346東白發發」

とか出てくると、ついニヤけてしまいます。