麻雀シミュレータ MJSim - README


■目次
何をするもの?
仕様
現在の開発状況
実行方法
AIの作成方法
ソースについて
配布ファイルの内容
開発元
既知のバグ
更新履歴


■何をするもの?
麻雀AIを開発し、AI同士を何千試合も戦わせるソフト。
AIは、これを読んでいるあなたが作ってください。
東風荘形式のログが残るので、他の人が作ったAIと勝負したり、統計を取ったりできる。

言語はC/C++。
他の言語(C言語から呼び出せるDLLを作成できるもの)でもできるかも。

■仕様
  • ルールは東風荘第1ルール。東風荘ホームページ http://mj.giganet.net/
  • DLLで対戦者を作る。
  • 東風荘互換のログを出す(牌譜再生、統計情報表示のため)。

■現在の開発状況
まだ駄目なところもあるが、大体のことはできる。
ツモって捨てる、鳴く、上がって点数計算、最終結果計算、東風荘牌譜出力など。

■実行方法
※わからない場合は、開発元スレッドを読んだり質問してください。

[準備]
①MJSim.exeを作成する。
 MJSim.exeのプロジェクト(コンソールアプリケーション)を作成し、
 MJSimフォルダのすべてのファイルを追加する。

②コンパイルする。

③MJSimAI.DLLを作成する。開発元スレッドで公開されているDLLをダウンロードする手もある。
 MJSimAI.DLLのプロジェクト(DLLプロジェクト)を作成し、
 MJSimAIフォルダのすべてのファイルを追加する。

④コンパイルする。

⑤MJSimAI.DLLをコピーして4つにする。
 名前は15バイトまで。
 MJSimAI.DLL、MJSimAI1.DLL、MJSimAI2.DLL~など。
⑥AIの登録。
 MJSim.iniの[AI]セクションにDLL名を記述する。

[実行]
⑦MJSim.exeを実行。
 [実行に必要なファイル]
 ・MJSim.exe
 ・MJSim.ini
 ・DLL(AI)4つ(同じDLLを名前を変えてコピーして4つにしても良い)
 これらを同一のフォルダに置くこと。
 (正確には、MJSim.exeはフルパスで起動すればどこでもいいが、
 DLL4つとMJSim.iniは作業フォルダに存在する必要がある)

⑧実行すると、
 1...
 2.....と表示される。
 数字は試合数。「.」ひとつで1局。

⑨シフトキーを押すと終了。

⑩結果を見る。
 MJSimScore.txtというファイルが作られる。雀譜で再生できる。
 統計ツールは、MJStat、雀友、できすぎくんなど。

■AIの作成方法
※わからない場合は、開発元スレッドを読んだり質問してください。

DLLのプロジェクトを作って、MJSimAIフォルダのサンプルコードを追加してください。
詳細はサンプルコードや、ヘッダファイルを参照してください。

[簡単な説明]
①MJSim.hをインクルードする。
 #include "../MJSim/MJSim.h"

②AIInterfaceVersionとAIAction関数を実装する。
 C言語から呼び出せる形式で作成してください。
 (コンパイラのマニュアル等で確認してください)

[インターフェース関数仕様]
 ・int AIInterfaceVersion()
 [戻り値]
 現在は1を返してください。

 ・void AIAction(int Msg, int Index, MJTAKU *Taku)
 [引数]
 Msg   呼び出された理由。MJMSG_???が渡される。
 Index 自分がどこに座っているか。0:起家~。
       これは、MJTAKU構造体の、どのPlayer構造体が自分の手なのかを知るのに必要。
 Taku  MJTAKU構造体へのポインタ。
       卓上の情報がすべて入っている。

[Q&A]
Q:AIから牌を捨てる、上がる、鳴くなどの指示は、どうやるのか。
A:Taku->Player[Index].Action構造体で指定する。

Q:Taku->Player[Index].Action以外の部分を書き換えてもかまわないか。
A:OK。関数からの戻り時に元のとおりである必要は無い。

Q:MJSim.exeの関数を呼び出すことはできない。
A:MJTAKU構造体の情報を使ってアクションを決めてください。

Q:呼び出される順序は?
A:次のように呼び出される。
 ①東風戦開始時 MJMSG_GAMESTART
 ②局開始時 MJMSG_KYOKUSTART
 ③自分が牌をツモったとき(リンシャン含む) MJMSG_TSUMO
 ④誰かが牌を捨てたとき MJMSG_REACTION
  局中は③~④を繰り返す。
  鳴きが入らなければ一順で、ツモ1回、リアクション4回が送られる。
 ⑤MJMSG_KYOKUEND,
  試合中は②~⑤を繰り返す。
 ⑥MJMSG_GAMEEND,
  MJSim動作中は①~⑥を繰り返す。

Q:自風を取得したい。
A:自風を表す変数は無いので、座り位置と局数から計算してください。

Q:リアクション時に、他家の最後のアクションを取得したい。
A:Taku->Player[Taku->Trun].Action.Typeから取得する。
 「Taku->Trun」のインデクスのプレイヤーが最後に何らかのアクションをしたプレイヤー。

Q:チャンカンのやり方は?
A:誰かがカンしたとき、リアクションメッセージが来る。このとき、
 ①Taku->Player[Taku->Trun].Action.Typeから最後のアクションを取得して、
   MJACTION_KAKAN(加カン)だったら、
 ②Taku->Player[Taku->Trun].Action.Hosokuにカンした牌が入っているので、
   それが上がり牌なら、ロンできる。

Q:リアクション時に、他家の最後の捨て牌を取得したい。
A:ツモ切りで無い場合は、Taku->Player[Taku->Trun].Action.Sutehai。
 0がはいっている時はツモ切りで、この場合は河から取得する。
 河は、牌を捨てていないところが0になっているので、0の直前の牌が最後の牌。

[注意点]
  • DLL名がプレイヤー名になる。

  • 同じAIが卓を囲むのはまずい。
 たとえばAI0~AI3まで、全部同じDLLを指定すると、4人分のメッセージがきてしまう。
 1順の間にツモ4回、リアクション16回。 
 グローバル変数を共有してしまう。 
 [対処方法]
 DLLをコピーして名前を変える。 
 MJSimAI1.dll、MJSimAI2.dll・・・とか。 

  • DLLとiniファイルは、作業フォルダ(カレントディレクトリ)にないとだめ。
 VCのデバッガを使うときとか、 設定で作業フォルダが、プロジェクトのあるフォルダになっていると、 
 そこにDLLは無いため(DLLはdebugとかにある)、読み込めずに落ちるので注意。 

  • AIが不正なアクションを指定したときの動作
 訂正される。場合によってはチョンボになったり、不利な動作になる。
 ・誤ツモ上がり、誤ロン→チョンボになる
 ・持っていない牌を捨てる、誤暗カン→ツモ切りに訂正
 ・リーチ後、ツモ切り、ロン、暗カン以外→ツモ切りに訂正
 ・誤ポン、誤チー、誤明カン→何もしないに訂正
 ・暗カン、明カン、時のアクション→すべて無視
 ・加カンのときのロン以外→すべて無視
 ・ポン、チー時の捨て牌でツモ切りを指定→一番左の牌が切られる

  • AIInterfaceVersion関数について
 今後新しいインターフェースが定義されたときに、以前のインターフェースのAIも
 (ソースの修正や再コンパイル無しで)同時に使用できるようにするためのもの。
 例えば、渡される構造体(MJTAKU)に新しい変数が追加されたとかの場合、
 バージョン2が定義される。バージョン1と2のAIで対戦可能にする。
 ただし、どちらかが不利になってしまう場合などは対戦できなくする。  

■ソースについて
一部のソースを、他のソフトから流用しています。

流用したソースファイル
Def.h、Hantei.h、Hantei.cpp、Mahjong.h、Mahjong.cpp

麻雀役判定器 Ver.033
作者:Naoさん
[email protected]
http://isweb11.infoseek.co.jp/computer/giga/


上記以外のソースについては自由にしてください。
責任は負いません。

■配布ファイルの内容
[MJSim]フォルダ
  • MJSim.ini 設定ファイルサンプル
  • MJSim.cpp MJSim本体
  • MJSim.h 麻雀AI用ヘッダ
  • StdAfx.cpp
  • StdAfx.h
  • Def.h 役判定クラス
  • Hantei.h
  • Hantei.cpp
  • Mahjong.h
  • Mahjong.cpp
[MJSimAI]フォルダ
  • MJSimAI.cpp 麻雀AIサンプル(ツモ切りのみ)
  • StdAfx.cpp
  • StdAfx.h
[SampleAI]フォルダ
  • MJSinAI_v0.0.4.cpp >>283さん作麻雀AI。リーチをかけて上がる。たまに鳴く。
                    MJSimAI.cppと取り替えて使える。

■開発元
2ちゃんねる プログラム板スレッド
「おまいら最強の麻雀プログラムしてみろよ!!」
http://pc2.2ch.net/test/read.cgi/tech/1048299493/

■既知のバグ
上にあるほど優先。
★A(緊急)

★B(早め)
  • リーチ後の待ちの変わる暗カンをしてもチョンボにならない。
  • ツモ上がりしたときの点数計算が正確でない。
  • 七対子の時、25符になってない
  • 天和、地和の判定がない
  • 東風荘に合わせるなら、役牌の役名を(自風、場風、白、発、中)に分けたほうがいい

★C(保留)

★D(調査中)

■更新履歴
0.5.4
  • リアクション時に、最後のアクションが間違っていることがある。

0.5.3
  • 暗カン、加カンした後、手牌がおかしくなることがあるのを修正。
  • チャンカンできるようにした。
  • フリテン時ツモ上がりするとチョンボになるのを修正。
  • チョンボの時、ログにチョンボの内容も出すようにした。
 ・役無し→チョンボ
 ・フリテン→チョンボ(フリテン)
 ・ノーテンリーチ→チョンボ(ノーテンリーチ)

0.5.2
  • AIが指示したアクションを無視することがあるのを修正。

0.5.1
  • フリテンがチョンボにならないのを修正。
  • ノーテンリーチ時に流局してもチョンボにならないのを修正。
  • ドラのみでも上がれてしまうのをチョンボになるように修正。
  • 流局時の七対子と国士のテンパイチェックがおかしいのを修正。・河を絶対値で取ってないところがあったのを修正。
  • 河を絶対値で取ってないところがあったのを修正。

0.5.0
  • AIInterfaceVersion関数を呼び出すようにした。
 AIに関数の追加をお願いします。
 とりあえず関数が無くても止まらないようにしてあります。
  • 2順目にリーチしてもダブルリーチになるのを修正。
  • タンヤオが判定されなくなっているのを修正。

0.4.4
  • 集計ツール「できすぎくん」で読めるようにログを修正。

0.4.3
  • ドラの判定がまだおかしかったのを修正。
  • カンをした時、嶺上牌をツモったのがログに表示されないのを修正。
  • リーチ後、ツモ切り以外ができるのを修正。
  • チョンボのときに点数が減らないのを修正。
  • ハイテイがつかないのを修正。
  • カンした後、ツモが減っていないのを修正。
  • ダブルリーチがつかないのを修正。
  • ログで、局開始時のリーチ棒数が間違っているのを修正。

0.4.2
  • ドラの判定がおかしいのを修正。
  • ドラの役名が表示されないのを修正。
  • 役牌は飜は追加されているが役名が表示されないのを修正。

0.4.1
  • チーの後、捨て牌がおかしいのを修正。
  • ポン、チー時の捨て牌でツモ切りの指示がされた場合、一番左の牌を切るようにした。
  • 捨てられた牌を使わなくてもチーできるのを修正。

0.4.0
  • MJTAKU構造体を変更。
 ・YamaとTsumoを廃止
 ・DoraとRestTsumoNumを追加
 [注意]
 上記変数を使って、ドラと残りツモを取得している場合は修正をお願いします。
 上記変数を使ってない場合でもDLLをコンパイルしなおす必要があります。
  • TakuDispをはずした。使用したい場合は修正する必要がある。
  • リーチしていてもチョンボになるのを修正。
  • >>283さんのMJSinAI_v0.0.4.cppを同梱(デバッグに使ってるので)。

0.3.2
  • 鳴いたあと上がるとチョンボになるのを修正。
  • ドラが判定されていないのを修正。
  • 食い断は0飜にした。食い断のみでは上がれない。
  • 小三元だけで4飜なのを小三元2飜+役牌2にした。
  • 暗カンすると面前でなくなるのを修正。

0.3.1
  • AIに余計なデータを渡さないようにした。
 (山の情報、他家の手牌は参照しても意味の無いデータが入る)
  • サドンデスをやるようにした。
 (東4局以降でも30000点を超えたプレイヤーがいないときは続行)
  • 連荘できるようにした。
 (が、有効になっていない。ゲームが終わらないのを防ぐため。
 連荘してほしい場合はCMJSim::Game()のコードを有効にしてください)
  • 役名を修正。一杯口→一盃口、二杯口→二盃口
  • 「倍満貫」が「跳満貫」と表示されていたのを修正。
  • 七対子がうまく判定されないのを修正。
  • 小三元のとき役牌がつかないのを修正。

0.3.0
  • MJGAME構造体の名前をMJTAKUに変更した。
 (麻雀卓をイメージした構造体であるということがわかりやすい名前の方が、
 良いと考えたため)
  • Tehai配列の大きさを46→47にした。
 (Tehai[46]には常に0を入れることで、番兵として使えるようにするため)
  • Kawa配列の大きさを137→24にした。
 (意味なく大きすぎた。24は、6牌×4列分)
  • >>302さんのAIを同梱。

0.2.0
  • AIの不正な入力を訂正するようにした。
 誤ツモ上がり、ロン→チョンボ
 持っていない牌を捨てる、誤暗カン→ツモ切り
 誤ポン、チー、明カン→何もしない
  • リアクションができなかったのを修正。
  • ノーテン罰符をとるようにした。
  • コマンドラインに卓表示
 (MJSim::Kyoku()内のコードを有効にした場合に表示)。>>284さん
  • >>294さんのAIを同梱。
  • その他いろいろ修正。

0.1.1
  • リーチがログに出ていないのを修正。
  • 試合結果の点数計算が間違っていたのを修正。
  • AIへ渡すMJGAME構造体を、コピーしてから渡すようにした。
  • >>283さんのAIを同梱。

0.1.0
  • AIをDLLで作成できるようにした。

タグ:

+ タグ編集
  • タグ:
最終更新:2010年07月19日 01:29