■目次
何をするもの?
仕様
現在の開発状況
実行方法
AIの作成方法
ソースについて
配布ファイルの内容
開発元
既知のバグ
更新履歴
■何をするもの?
麻雀AIを開発し、AI同士を何千試合も戦わせるソフト。
AIは、これを読んでいるあなたが作ってください。
東風荘形式のログが残るので、他の人が作ったAIと勝負したり、統計を取ったりできる。
言語はC/C++。
他の言語(C言語から呼び出せる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の直前の牌が最後の牌。
[注意点]
たとえばAI0~AI3まで、全部同じDLLを指定すると、4人分のメッセージがきてしまう。
1順の間にツモ4回、リアクション16回。
グローバル変数を共有してしまう。
[対処方法]
DLLをコピーして名前を変える。
MJSimAI1.dll、MJSimAI2.dll・・・とか。
- DLLとiniファイルは、作業フォルダ(カレントディレクトリ)にないとだめ。
VCのデバッガを使うときとか、 設定で作業フォルダが、プロジェクトのあるフォルダになっていると、
そこにDLLは無いため(DLLはdebugとかにある)、読み込めずに落ちるので注意。
訂正される。場合によってはチョンボになったり、不利な動作になる。
・誤ツモ上がり、誤ロン→チョンボになる
・持っていない牌を捨てる、誤暗カン→ツモ切りに訂正
・リーチ後、ツモ切り、ロン、暗カン以外→ツモ切りに訂正
・誤ポン、誤チー、誤明カン→何もしないに訂正
・暗カン、明カン、時のアクション→すべて無視
・加カンのときのロン以外→すべて無視
・ポン、チー時の捨て牌でツモ切りを指定→一番左の牌が切られる
今後新しいインターフェースが定義されたときに、以前のインターフェースのAIも
(ソースの修正や再コンパイル無しで)同時に使用できるようにするためのもの。
例えば、渡される構造体(MJTAKU)に新しい変数が追加されたとかの場合、
バージョン2が定義される。バージョン1と2のAIで対戦可能にする。
ただし、どちらかが不利になってしまう場合などは対戦できなくする。
■ソースについて
一部のソースを、他のソフトから流用しています。
流用したソースファイル
Def.h、Hantei.h、Hantei.cpp、Mahjong.h、Mahjong.cpp
上記以外のソースについては自由にしてください。
責任は負いません。
■配布ファイルの内容
[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と取り替えて使える。
■既知のバグ
上にあるほど優先。
★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
・YamaとTsumoを廃止
・DoraとRestTsumoNumを追加
[注意]
上記変数を使って、ドラと残りツモを取得している場合は修正をお願いします。
上記変数を使ってない場合でもDLLをコンパイルしなおす必要があります。
- TakuDispをはずした。使用したい場合は修正する必要がある。
- リーチしていてもチョンボになるのを修正。
- >>283さんのMJSinAI_v0.0.4.cppを同梱(デバッグに使ってるので)。
0.3.2
- 鳴いたあと上がるとチョンボになるのを修正。
- ドラが判定されていないのを修正。
- 食い断は0飜にした。食い断のみでは上がれない。
- 小三元だけで4飜なのを小三元2飜+役牌2にした。
- 暗カンすると面前でなくなるのを修正。
0.3.1
(山の情報、他家の手牌は参照しても意味の無いデータが入る)
(東4局以降でも30000点を超えたプレイヤーがいないときは続行)
(が、有効になっていない。ゲームが終わらないのを防ぐため。
連荘してほしい場合はCMJSim::Game()のコードを有効にしてください)
- 役名を修正。一杯口→一盃口、二杯口→二盃口
- 「倍満貫」が「跳満貫」と表示されていたのを修正。
- 七対子がうまく判定されないのを修正。
- 小三元のとき役牌がつかないのを修正。
0.3.0
- MJGAME構造体の名前をMJTAKUに変更した。
(麻雀卓をイメージした構造体であるということがわかりやすい名前の方が、
良いと考えたため)
(Tehai[46]には常に0を入れることで、番兵として使えるようにするため)
(意味なく大きすぎた。24は、6牌×4列分)
0.2.0
誤ツモ上がり、ロン→チョンボ
持っていない牌を捨てる、誤暗カン→ツモ切り
誤ポン、チー、明カン→何もしない
- リアクションができなかったのを修正。
- ノーテン罰符をとるようにした。
- コマンドラインに卓表示
(MJSim::Kyoku()内のコードを有効にした場合に表示)。>>284さん
- >>294さんのAIを同梱。
- その他いろいろ修正。
0.1.1
- リーチがログに出ていないのを修正。
- 試合結果の点数計算が間違っていたのを修正。
- AIへ渡すMJGAME構造体を、コピーしてから渡すようにした。
- >>283さんのAIを同梱。
0.1.0
最終更新:2010年07月19日 01:29