麻雀の副露判断アルゴリズム(4)

麻雀の副露判断アルゴリズム(3) - koba::blog で喰い仕掛けで手を完成させることができるようになったが、打牌を見ていると無駄がありそうである。例えば

一萬二萬六萬六萬三筒赤五筒六筒七筒八筒赤五索五索六索八索九筒

の場合、打 九筒三萬六萬四筒四索五索七索 の6種20枚待ち、打 八索 だとそれに加えて 七筒 3枚も待ちになるが、七筒八筒九筒 の面子が完成するのでタンヤオに移行できなくなってしまう。打 九筒 であれば、六萬五索 ポン、四筒七索 チーでも手を進めることができる。

続きを読む

麻雀の副露判断アルゴリズム(3)

麻雀の副露判断アルゴリズム(2) - koba::blog で役ありの向聴数が計算できるようになったので、基本的には向聴数が減る場合に鳴けばよいのであるが、実際に動かしてみると以下の問題があった。

  • オリている最中でも鳴いて手詰まりを起こしてしまう
  • オリているのに暗槓、加槓をして立直者に裏ドラを乗せてしまう
  • さかんに大明槓する*1

今回はこれを調整する。

*1:これは大明槓する条件を「向聴数が増えないとき」にしていたから

続きを読む

麻雀の副露判断アルゴリズム(2)

麻雀の副露判断アルゴリズム(1) - koba::blog で準備ができたので、今回は特定の役に対する向聴数計算ルーチンを実装していく。

日本の麻雀では以下の役について向聴数が計算できればすべての喰い仕掛けがカバーできる。

  1. 翻牌*1
  2. 断幺九
  3. 対々和*2
  4. 混一色*3
  5. 全帯幺*4
  6. 三色同順一気通貫
  7. 三色同刻三槓子

5以下はレアケースなので、1〜4の向聴数計算ルーチンを実装することにした*5

*1:小三元大三元は翻牌の特殊ケース

*2:混老頭字一色清老頭対々和の特殊ケース

*3:清一色、四喜和、緑一色は混一色の特殊ケース

*4:純全帯幺九は混全帯幺九の特殊ケース

*5:全帯幺九についてもトライしたのだが、難しくて断念した

続きを読む

麻雀の副露判断アルゴリズム(1)

電脳麻将 ver.0.6 では喰い仕掛けを実装した。基本的に向聴数が減るように鳴いていけばいずれ聴牌する*1のであるが、やみくもに鳴くと役なし聴牌となり和了できない状態になってしまう。実は以前から向聴数の減るときに鳴くという処理は実装済みなのだが封印してあったのだ。*2

役なし聴牌を回避するアイデアとして、特定の条件のときにのみに鳴くという方法が考えられる。例えば「役牌は鳴いてよい」、「幺九牌のないときに中張牌は鳴いてよい」などであるが、いかにも付け焼き刃な方法で一貫性がない。それより汎用的な方法として、

  • 特定の役に対する向聴数を計算し、その向聴数が減る場合に鳴く

という方法を思いついたので、それにしたがって実装することにした。

*1:実際には向聴数の変わらない鳴きも重要なのであるが、これは後回しにする

*2:副露した状態の試験をしたいときに封印を解いていた

続きを読む

電脳麻将 ver.0.6 公開

f:id:xlc:20161211143954p:plain:w240:right

電脳麻将 を ver.0.6 にバージョンアップしました。

今回のバージョンアップでは

  • AIが喰い仕掛けで手作りできる

ようになりました。

これでようやく麻雀ゲームとしては一人前になりました。

ver.0.7 ではAIの改良は一旦中断し、牌譜エディタの機能を追加しようと考えています。

ベタオリのアルゴリズム

電脳麻将 ver.0.5 では立直に対するベタオリを実装した。ベタオリするためにはまず牌の危険度を評価する必要があるが、現代麻雀技術論 - 押し引き論13.ベタオリ を参考に以下の値とした。

牌の種類 無スジ片スジスジ生牌2枚見3枚見ラス牌
字牌 3 2 1 0
一・九牌 6 3
二・八牌 8 4
三・七牌 8 5
四・五・六牌 12 8 4

続きを読む

麻雀の打牌選択アルゴリズム(3)

麻雀の打牌選択アルゴリズム(1) - koba::blog麻雀の打牌選択アルゴリズム(2) - koba::blog で待ち受けを広くする打牌はある程度選択できるようになったのだが、孤立牌の打牌に問題が残っていた。

例えば

一萬八萬八萬三筒三筒四筒六筒七筒八筒九筒一索一索三索赤五萬

の牌姿の場合、打 一萬赤五萬 ともに 八萬三筒五筒一索二索 の5種14枚の待ちとなるのだが、赤ドラかつ中張牌でくっつきの可能性が高い 赤五萬 を打牌してしまう(評価が同じ場合手牌の右側から切るため)。

今回は牌の評価値を求めることで中張牌やドラを残すよう改善する。

続きを読む

麻雀の打牌選択アルゴリズム(2)

麻雀の打牌選択アルゴリズム(1) - koba::blog の続き。前回は打牌選択の基準を待ちの牌種重視から枚数重視としたが、今回はその枚数を実際に「見えていない枚数」*1としてみる。

このためには配牌、自摸、打牌、副露、槓のタイミングで枚数をカウントする必要があるので、これを行うクラス Majiang.SuanPai*2を新たに追加した。

*1:他者の手牌もしくは山に眠っている枚数

*2:算牌: 中国語では牌読みのような意味になるはず

続きを読む

麻雀の打牌選択アルゴリズム(1)

麻雀AIを作る場合、まずは和了に向かう手作りができるようにする必要があるのだが、これは比較的簡単。向聴数計算ルーチンさえあれば向聴数が下がるように手を進めていくことでいずれ聴牌し、立直すれば役を考慮しなくても和了ることができる。

向聴数が下がるのは自摸および鳴きをした場合のみであるので、鳴きなしとすると、打牌時に向聴数を上げない(手戻りさせない)ように考慮すればよい。

電脳麻将 では打牌選択はMajiang.Playerクラスのメソッドselect_dapai()で行っているが、ver.0.3.2 での実際の打牌選択を行う部分のコードは以下の通り。

続きを読む