« 2011年4月 | トップページ | 2011年6月 »

2011/05/31

牌譜読み込み機能作成中

押し引きの処理部分の作成とデバッグがほぼ終わった。
後は鳴きの処理を作りこめば、最低限麻雀ゲームとしての機能はそろう。

ただなんとなく気分がのらないので、気分転換に(?)先に天鳳の牌譜解析の機能を作り始めている。
牌譜読み込み部分はC#で作成し、その読み込み部分からDLL化したまったり麻雀のコア部分を利用する構成で作成する。


| | コメント (0) | トラックバック (0)

2011/05/16

天鳳の解析スクリプトのバグ?

牌譜の書式の鳴き面子のビットフィールドを解析するためにtehai.jsを解読しているけれど、
sprintMentsu136(m)って間違ってるような気がするけれど、気のせいかな。

ポンの場合は正しいと思う。
================================================
}else if (m&(1<<3)){ // KOUTSU
var unused=(m&0x0060)>>5;
var t=(m&0xFE00)>>9;
var r=t%3;  // 変数rが、鳴いた牌がどれかを示す。(0から数えて)何番目に小さい牌を鳴いたかを示している。
t=parseInt(t/3);
t*=4;
var h=[t,t,t]; //鳴いた面子を配列hで表現


//以下のswitch文で使ってない牌番号以外の3牌を小さい順に配列にいれる。牌を0~135の数字で表しているので、こういった方法になる。unusedは4枚ある同種牌のうちポンの構成要素として使っていない牌がどれかを示している
switch(unused){
case 0:h[0]+=1;h[1]+=2;h[2]+=3;break;
case 1:h[0]+=0;h[1]+=2;h[2]+=3;break;
case 2:h[0]+=0;h[1]+=1;h[2]+=3;break;
case 3:h[0]+=0;h[1]+=1;h[2]+=2;break;
}
//ここで、鳴いた牌をとりあえず一番左(h[0])に持ってくる
switch(r){  
case 1:h.unshift(h.splice(1,1)[0]);break; 
case 2:h.unshift(h.splice(2,1)[0]);break;
}

// ここで鳴いた牌をしかるべき位置に移動。これで赤5を鳴いた時も正しく表示できる。kuiは誰から鳴いたかを示す。上家=3,対面=2,下家=1

if (kui<3) h.unshift(h.splice(2,1)[0]);
if (kui<2) h.unshift(h.splice(2,1)[0]);


ret+=sprintHai136(h[0],kui==3?1:0);
ret+=sprintHai136(h[1],kui==2?1:0);
ret+=sprintHai136(h[2],kui==1?3:0);
================================================
問題は加槓の場合だけれど

================================================
}else if (m&(1<<4)){ // CHAKANN
var added=(m&0x0060)>>5;
var t=(m&0xFE00)>>9;
var r=t%3;
t=parseInt(t/3);
t*=4;
var h=[t,t,t];
switch(added){ //加槓で追加した牌以外を配列h[]に入れる
case 0:h[0]+=1;h[1]+=2;h[2]+=3;break;
case 1:h[0]+=0;h[1]+=2;h[2]+=3;break;
case 2:h[0]+=0;h[1]+=1;h[2]+=3;break;
case 3:h[0]+=0;h[1]+=1;h[2]+=2;break;
}

//ここで、鳴いた牌をとりあえず一番左(h[0]に持ってくる)
switch(r){
case 1:h.unshift(h.splice(1,1)[0]);break;
case 2:h.unshift(h.splice(2,1)[0]);break;
}


if (kui==3){
ret+=sprintHai136(t+added,1,'style="position:relative;top:12px;z-index:1;"');
ret+='<br>';
ret+=sprintHai136(h[0],1,'style="position:relative;z-index:1;"');
ret+='</td><td valign="bottom">';
ret+=sprintHai136(h[1],0);
ret+=sprintHai136(h[2],0);
}else if (kui==2){
ret+=sprintHai136(h[0],0);
ret+='</td><td>';
ret+=sprintHai136(t+added,1,'style="position:relative;top:12px;z-index:1;"');
ret+='<br>';
//対面から鳴いたケースでh[1]を横に寝かしているけれど、鳴いた牌はh[0]に入っているのでは?
ret+=sprintHai136(h[1],1,'style="position:relative;z-index:1;"');
ret+='</td><td valign="bottom">';
ret+=sprintHai136(h[2],0);
}else if (kui==1){
ret+=sprintHai136(h[0],0);
ret+=sprintHai136(h[1],0);
ret+='</td><td>';
ret+=sprintHai136(t+added,3,'style="position:relative;top:12px;z-index:1;"');
ret+='<br>';
//上家から鳴いたならh[2]を横に寝かしているけれど、鳴いた牌はh[0]に入っているのでは?
ret+=sprintHai136(h[2],3,'style="position:relative;z-index:1;"');
}

================================================
私のカン違いかな。なんかバグってるように思えるけれど……

| | コメント (0) | トラックバック (0)

2011/05/12

牌譜データ解析とか

 というわけで、いずれ、牌譜のデータを取り直すことになりそう。

 最近似たようなデータ公開してくれている人は多くなってきたのだけれど、残念ながらそのまま流用はできない。麻雀ゲームの場合、ある程度、具体的な場況がわかっているので、もっと、条件分けをして集計する必要があるからだ。

 例えば、立直ロン和了の平均点数も、今このシーンで振り込んだ場合、一発や海底撈月がつく/つかないが判っているので、そういった条件分けをしたうえで集計する必要がある。一発/海底撈月以外にも、場に見えているドラの枚数などで平均和了点数は変わってくるので、そういった条件分けも必要となる。また、順位戦での点数状況判断のためには、平均点数だけをスカラーなデータで持つのではなく、各点数毎の確率分布をベクトルデータで持つようにする必要もある。

赤ナシデータの採取はそれほど大変ではない。既に東風荘用の解析ツールは作ってあるので、数時間程度の作業時間を割いて作業を進めればよいだけの話である。


ただ、赤ドラ対応用に天鳳用の解析ツールを別途作る必要があって、これが結構面倒くさそうな気がしている。

天鳳の牌譜の解析のやり方には、大きくは3通りのやり方が考えられる。

その1
Windowsの有償版天鳳ソフトについてくる牌譜解析ツールlogana.exeで動作するjavascriptで作る方法。

その2
天鳳の牌譜ファイル(mjlogファイル)を直接読み込むプログラムを作成する方法

その3
有償版Windowsの牌譜解析ツールで、天鳳の牌譜ファイルを東風荘ライクなテキスト形式のフォーマットに変換し、変換した牌譜ファイルを解析するプログラムを作成する方法。


 一番スジが良いのは1だと思う。logana.exeには、向聴チェックや、グラフ作成、牌画表示などをJavaScriptから利用できる機能もあるようだ。また、牌譜フォーマットの変更も、logana.exe本体が対応してくれるので、個別のプログラマが作成するJavaScriptで対応する手間が少ない。 開発者間でソースを流用したり、一般ユーザにアプリを公開するとしたら、この方法が一番楽だろう。つの氏もそうしてほしいと思って今のような仕組みの牌譜解析ツールを作ったのだろうと思う。(ただ、そうならば、有志作ったツールのURLを記録するためのブックマーク機能や、SDK的なドキュメントも欲しかった。)
 天鳳界隈のプログラマが皆logana.exeで動作するJavaScriptでツールを作っているならば、オープンソース的なコミュニティが出来て、いろいろ便利なのだけれど、残念ながら、現実的にはそういった方向で牌譜解析を作るような雰囲気になってないようだ。
 また、まったり麻雀の開発という意味では、赤あり/赤なしの両方のルールに対応するために、東風荘のデータ解析と天鳳用のデータ解析でまったく別々にツールを作る必要が出てきて、2倍の手間がかかってしまう問題もある。


 その2は作るのが一番面倒くさそう。天鳳のフォーマットは、XML的な面と、ビット操作的な面が混合したフォーマットで、東風荘と比較すると、可読性が悪くて、なにかと煩わしい。それに天鳳はフォーマットをコロコロ変えるのでいちいち対応する手間を取られそう。 ただ、これを作ってしまえば、別の天鳳ツールをつくるときに、色々と流用ができるメリットがあるのも事実。また、処理速度的にもこの方法が一番早いだろう。

 その3のやり方は、東風荘の牌譜解析ツールを既に作ってあるならば、それを少し改造して対応できそうなのがメリット。プログラム作成の手間自体は一番楽そうだけれど、一度牌譜を変換する手間をかける必要があるし、データ解析以外の別の天鳳ツールへの流用がやりにくいデメリットもある。また、一般公開も実質無理だろう。

単純にまったり麻雀の開発に必要なデータを取るツールを手間をかけずにつくるなら、その3が一番楽なのだろうけれど、まだどの方法でやるか決めかねている。

| | コメント (0) | トラックバック (0)

2011/05/11

牌譜から平均立直和了点を求める時の罠

いまさらだけど、東風荘のログから立直して上がった時の平均点数を求めるような処理でミス発見。
立直して役満上がった時が計算に入っていなかった。

どうしてかというと、立直と役満が複合したとき、「役満ツモ 立直 四暗刻」とは牌譜に出力されず 、
「役満ツモ 四暗刻」という感じに表示されるため、上がり役名を立直で検索して絞りこむとミスってしまう。
たぶん、数百点単位で平均和了点が違ってくるので直す必要ありそう。

っていうか、最近牌譜解析してる人多いと思いますが、同様のミスやらかしてませんか?
そんなアホなミスするのは私だけですか、そうですか……

| | コメント (2) | トラックバック (0)

2011/05/10

バグ取り中

コンピュータ同士で打たせてバグ取を実施中。
赤ドラ対応の漏れやGUI作り直しによるバグがちらほらと見つかっている。

| | コメント (0) | トラックバック (0)

2011/05/07

ScanSnap1500購入


いわゆる自炊による本の整理を目的に、ドキュメントスキャナScanSnap1500を買った。

結論から言うと、非常に満足している。私としては、コンピュータの入力装置としてスキャナは、カメラやマイクを追い抜いて、キーボード、マウスに次ぐ第3のPC入力装置として必須機能という感じにすらなった。なぜもっと早く買わなかったのかと後悔するほどだ。

 購入の際、高機能なScanSnap1500とコンパクトなScanSnap1300とどちらを買うか迷ったが、ScanSnap1500を選んで正解だったと思う。ScanSnap1500には、2枚同時に用紙送りして、ページを飛ばしてしまった場合に、ちゃんとセンサーで検出してくれる機能があり、これが結構優秀なのと、ScanSnap1500でも十分にコンパクトで置き場所に困ることもないからだ。


 スキャンしたデータは十分に綺麗で文句ない。両面印刷の裏面がうっすらとスキャンされてしまうのではないかと不安だったが、今のところそういった問題は起きていない。私が、定規も使わずにカッターナイフでざっくりと、かなり雑に本を裁断したので、斜めに読み取られている部分があるけれど、十分読める範囲で問題なし。

 OCRもまずまず。縦書きの新書本で数字の12が縦に「1」「2」と2文字ならんで表示されておらず、1文字分のスペースに「12」と印字されているケースでnと誤認識されていたり、タイトルなどで読み込めていない部分があったりするので、スキャンしたファイルをプレーンテキスト化して利用するのはつらいものの、検索目的ならば十分に使える範囲である。

 読み取ったファイルは、PDFにしてiPhone4のPDFリーダーGoodReaderで読んでいる。新書、文庫、漫画の単行本ならiPhone4の画面サイズでも、文字が小さいながらも、1ページ丸々表示して読める。というか、iPhone4の画面の方がなぜかPCより文字がきれいに見える気がする。


当初、画面が大きいiPad2かXOOMのようなAndroid3.0タブレットあたりを買う必要があるかと考えていたが、10インチのタブレットは外に持ちあるくのはつらそうなので、当面、新書と文庫はiPhoneでそれ以外の大きな本はPCで読むつもりでいる。

| | コメント (0) | トラックバック (0)

2011/05/05

買ったもの

USBメモリを購入した。
紛失防止のために、キャップレスで頑丈なストラップがつけられることが、選定の絶対条件だったのだけれど、条件にマッチする製品はこれしか見つからなかった。まだ、買ってから1週間程度だけど、今まで使っていたものより読み書き速度も速い感じで結構気に入っている。


| | コメント (0) | トラックバック (0)

« 2011年4月 | トップページ | 2011年6月 »