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東白發發」

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

2008/11/13

Hello Renderer

Photorealistic 指向なレンダラを書いています。



HISTORY

まずは球。シェーダは法線を RGB にするもの。
しばらくは球プリミティブだけで行きます。
画像出力は、float RGBA をバイナリで書き出して、Imagemagick で png などに変換します。

convert -depth 32 -define quantum:format=floating-point -size ${W}x${H} -define quantum:scale=65536.0 -endian lsb RGBA:fb out.png


20080909

シーンファイルを JSON にして雪だるま的な物体にしてみる。
JSON ライブラリは YAJL を使用。
交差判定のアクセラレータはなし。総当たり。
20080918

phong shader 的なもの。点光源。局所照明。
20081006_0

光源を4つにしてみる。
20081006_1

影光線を追加。
20081007

反射を追加。左のでかい球が鏡面反射。
20081015

エリアライトを追加。ちょっとそれっぽくなった。
Light->Eye (LE) をどう描画すればいいか、よくわからん。
20081111



TODO

あとはこの辺りを実装して、何か動画でも作れたらおもしろいかなと。


  • Texture
  • Bump mapping
  • Image based lighting
  • Motion blur
  • Depth of field
  • Local coordinate system
  • Blinn shading
  • Path tracing
  • Triangle intersection
  • 別途 scene generator ... blender のプラグイン


blender ってオブジェクト同士の積、差を計算できたりするんでしょうか。