天鳳の牌譜形式を解析する(2)

天鳳の牌譜形式を解析する(1) - koba::blog の続き。前回は天鳳の牌譜形式のXML要素・属性の意味を説明したので、今回はそれを解析するプログラムについて。

「牌番号」「面子コード」は複数の要素で使われているが、これを 麻雀の手牌の文字列表現 - koba::blog の形式に変換する。

続きを読む

天鳳の牌譜形式を解析する(1)

天鳳の牌譜は http://tenhou.net/0/log/ から取得することができる。第五期 天鳳名人戦 最終節 最終戦 であれば以下のURLになる。

形式はXMLっぽいが、要素名自体がデータになっていたり入れ子構造がなかったりでXMLの特性を生かしているとは言いがたい。何よりぱっと見て対局内容を想像することができない。天鳳の牌譜で麻雀研究をしようとする場合、この複雑怪奇な牌譜形式が大きな障害になっていると思う*1。そこで天鳳の牌譜を電脳麻将牌譜形式に変換するプログラムをPerlで作ってみた。

*1:意図的に分かりにくくしているフシもあるが

続きを読む

電脳麻将 ver.0.8 公開

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

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

牌譜エディタの公開を目標にしていましたが、まだ当分かかりそうなので、まずは「牌譜ビューア」として公開します。

具体的な修正は以下の通りです。

  • 牌譜ビューアを追加
  • 牌譜再生の際に手牌表示のON/OFF、ツモ切り表示のON/OFFを選べるようにした
  • 牌譜再生の際に視点を選べるようにした(牌譜ビューアのみの実装)
  • 牌譜再生の際に集計表をいつでも表示できるようにし、そこから局を選択できるようにした
  • ゲームの結果を10局分ブラウザに保存するようにした
  • ゲームの結果を牌譜としてダウンロードできるようにした
続きを読む

電脳麻将 ver.0.7 公開

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

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

  • 音声出力の方法を修正
  • スマートフォンの「ホーム画面に追加」の際のアイコンを指定した
  • チー、ポンなどの発声にキャプションをつけるようにした
  • 画像ダウンロード中に "Loading" の文字を表示するようにした
  • 牌画入力ツールを追加
  • 画面右上にナビゲーションのリンクを追加
  • スマートフォンタブレット用のCSSを追加

今回の主な修正はスマートフォン対応です。

当初予定していた牌譜エディタは次回に持ち越します。

牌画入力ツール

麻雀の牌姿を入力する「牌画入力ツール」はネット上にいろいろある*1 *2が、どれも画面上で牌をクリックして作成する仕様なので大変面倒くさい。そこで簡単な記法を牌画に変換するツールを作ってみた。

このような記述ができます。

{s067z1 z1}(ツモ) {p2-13} {z66=6-6} {_z77_} {  }(ドラ){m1}

s0s6s7z1 z1(ツモ) p2-p1p3 z6z6=z6-z6 _z7z7_ (ドラ)m1

続きを読む

麻雀の副露判断アルゴリズム(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:副露した状態の試験をしたいときに封印を解いていた

続きを読む