
MJSim AIC^[tF[X o[W1dl

ڎ
Tv
AI쐬菇
̃[
C^[tF[X֐
Ăяo^C~O
⑫dl
p`
ӎ


Tv
MJSimpAI邽߂̎dlJB

AI쐬菇
AIDLLƂč쐬B

@WindowsAvP[VJ\tgŁADLL̃vWFNgB

AMJSim.hCN[hB
  #include "../MJSim/MJSim.h"

BAIInterfaceVersionAIAction֐B
  CꂩĂяo`ō쐬ĂB
  iRpC̃}jAŊmFĂj

̃[
1̃[Bz[y[W http://mj.giganet.net/

ŁAH^AtLB
ڍׂ͓z[y[WŊmFĂB

AIC^[tF[Xv1ł́A[ω邱Ƃ͂ȂB

C^[tF[X֐
Eint AIInterfaceVersion()
  [߂l]
  ݂1ԂĂB

Evoid AIAction(int Msg, int Index, MJTAKU *Taku)
  []
  Msg   ĂяoꂽRBMJMSG_???(wb_t@CQ)nB
  Index ǂɍĂ邩B0:NƁ`B
        ́AMJTAKU\̂́AǂPlayer\̂̎Ȃ̂m̂ɕKvB
        ȏȂ̂ŁA͕ωȂiɕωjB
  Taku  MJTAKU\̂ւ̃|C^B
        ̏񂪓ĂB

Ăяo^C~O
ȉ̃^C~OŁAAIAction֐ĂяoB

@Jn MJMSG_GAMESTART

AǊJn MJMSG_KYOKUSTART

BvcƂ(V܂) MJMSG_TSUMO

CNAcɔv̂ĂƂA܂̓JƂ MJMSG_REACTION
@ǒ͇B`CJԂĂB
@Ȃ͈ꏇŃc1AANV4񂪑B

DǏI MJMSG_KYOKUEND,
@͇A`DJԂB

EI MJMSG_GAMEEND,
  MJSim쒆͇@`EJԂB

⑫dl
EAI̖ÓADLL̃t@C̗pB
  DLL̃t@C15܂łɂĂB

p`
Q:AIv̂ĂAオAȂǂ̎ẃAǂ̂B
A:Taku->Player[Index].Action\̂Ŏw肷B

Q:w̃R[h́H
A:ȉ̂悤ɂB
  bZ[Wc(MJMSG_TSUMO)̂Ƃ
    Ec؂肷
    Taku->Player[Index].Action.Type = MJACTION_SUTEHAI;
    Taku->Player[Index].Action.Sutehai = 0;

    E1}̂Ă
    Taku->Player[Index].Action.Type = MJACTION_SUTEHAI;
    Taku->Player[Index].Action.Sutehai = 1;

    Ecオ肷
    Taku->Player[Index].Action.Type = MJACTION_TSUMOAGARI;

    E1}̂Ăă[`
    Taku->Player[Index].Action.Type = MJACTION_RICHI;
    Taku->Player[Index].Action.Sutehai = 1;

    E2}ÃJ
    Taku->Player[Index].Action.Type = MJACTION_ANKAN;
    Taku->Player[Index].Action.Hosoku = 2; HosokuɃZbg

    E2}J
    Taku->Player[Index].Action.Type = MJACTION_KAKAN;
    Taku->Player[Index].Action.Hosoku = 2; HosokuɃZbg

  bZ[WANV(MJMSG_REACTION)̂Ƃ
    EȂ
    Taku->Player[Index].Action.Type = MJACTION_NULL;

    EŌɎ̂Ăꂽv
    Taku->Player[Index].Action.Type = MJACTION_RON;

    EŌɎ̂ĂꂽvA3n܂郁c(3,4,5)Ń`[āA1}̂Ă
    Taku->Player[Index].Action.Type = MJACTION_KAKAN;
    Taku->Player[Index].Action.Sutehai = 1;
    Taku->Player[Index].Action.Hosoku = 3;
    
   EŌɎ̂Ăꂽv|1}̂Ă
    Taku->Player[Index].Action.Type = MJACTION_PON;
    Taku->Player[Index].Action.Sutehai = 1;	

Q:Taku->Player[Index].ActionȊO̕Ă܂ȂB
A:OKB֐̖߂莞Ɍ̂ƂłKv͖B
  Ref邱Ƃ͖B

Q:MJSim.exe̊֐ĂяoƂ͂łȂH
A:łȂBMJTAKU\̂̏găANV߂ĂB

Q:ꕗ擾B
A:ꕗ\ϐ͖̂ŁAǐvZĂB
  ETv
  int GetBakaze(int Kyoku/*ǐ*/){return Kyoku % 4;}

Q:擾B
A:\ϐ͖̂ŁAȂƋǐvZĂB
  ETv
  int GetZikaze(int Index/**/, int Kyoku/*ǐ*/){return (Index + 4 - (Kyoku % 4)) % 4;}

@̓cƂ͋tɉ̂ŁAIndexKyokulɂȂB
  + 4́A߂l}CiX̒lɂȂȂ悤ɂ邽߁B
  Ō % 4́Aő₵Ăi4ȏ̒lɂȂȂ悤Ɂj邽߂ɂB

Q:ANVɁAƂ̍Ō̃ANV擾B
A:Taku->Player[Taku->Trun].Action.Type擾B
  uTaku->TrunṽCfNX̃vC[Ōɉ炩̃ANVvC[B

Q:ANVɁAƂ̍Ō̎̂Ĕv擾B
A:c؂Ŗꍇ́ATaku->Player[Taku->Trun].Action.SutehaiB
  0͂Ă鎞̓c؂ŁȀꍇ͉͂擾B
  ͂́Av̂ĂĂȂƂ낪0ɂȂĂ̂ŁA0̒O̔vŌ̔vB
  ETv
  :TakuO[oϐɂKv܂B
  ---
  //LastSutehaiɍŌɎ̂Ăꂽvԍ
  int LastSutehai = GetLastSutehai(Taku->Turn);
  
  //͂̔v̐擾
  int GetKawaLen(int Index)
  {
	int i;
	for(i = 0; Taku->Player[Index].Kawa[i] != 0; i++);
	return i;
  }
  //͂̍Ō̎̂Ĕv擾
  //͂1vꍇ0Ԃ
  int GetLastSutehai(int Index)
  {
	int len = GetKawaLen(Index);
	if(len == 0){return 0;}
	return abs(Taku->Player[Index].Kawa[len - 1]);
  }
  ---
Q:`Ĵ́H
A:NJƂAANVbZ[WB̂ƂA
  @Taku->Player[Taku->Trun].Action.TypeŌ̃ANV擾āA
    MJACTION_KAKAN(J)A
  ATaku->Player[Taku->Trun].Action.HosokuɃJvĂ̂ŁA
    ꂪオvȂ烍łB

Q:AIԈANVw肵ƂǂȂ̂B
A:w͒BꍇɂĂ̓`{ɂȂAsɂȂB
  EcオA냍 `{ɂȂ
  EĂȂv̂Ă c؂ɒ
  EÃJ c؂ɒ
  E[`Ƀc؂AAÃJȊO c؂ɒ
  E|A`[A떾J Ȃɒ
  EÃJAJ̃ANV Ȃɒ
  EĴƂ̃ȊO Ȃɒ
  E|A`[̎̂ĔvŃc؂w ԍ̔v؂

Q:epC`FbNȂǂ̊֐͂Ȃ̂H
A:epC`FbNAオ`FbN֐́AA[JCuMJSimtH_Tenpai.cpp
  iCN[hȂǂājgpĂB
  tehaitsumóATaku->Player[Index]TehaizATsumô܂ܓnĂB
  bool IsTenpai(int *tehai);	//epC`FbN
  bool IsAgari(int *tehai, int tsumo);	//オ`FbN

  ֐ǉĂ\B

ӎ
EMJSim.ini[AI]ZNVɓDLLo^ȂłB
  ȉ̂悤ȕsoB
  EƂAI0AAI1ɓDLLw肷ƁA2l̃bZ[WĂ܂B
    1̊ԂɃc2AANV8B 
  EO[oϐLĂ܂B 
  EWvc[œǂݍ񂾂ƂAʂȂiOɂȂ邽߁jB
  [Ώ@]
  DLLRs[ĖOςB
  ̖OMEGUMI.dllȂAMEGUMI_1.dllȂǁB
  
EDLLinit@ĆAƃtH_iJgfBNgjɂȂƂȂB 
  fobKgƂȂǁA ݒōƃtH_vWFNĝtH_ɂȂĂƁA 
  DLL͖߁iDLLdebugɂjAǂݍ߂ɃG[ƂȂ̂ŒӁB 

EAIInterfaceVersion֐ɂ
  VC^[tF[X`ꂽƂɁAȑÕC^[tF[XAI
  (\[X̏CăRpC)Ɏgpł悤ɂ邽߂̂́B

  Ⴆ΁An\(MJTAKU)ɐVϐǉꂽȂǂ̏ꍇA
  o[W2`Bo[W12AIőΐ\ɂB
  AvO㖵oĂ܂ƂA
  ǂ炩sɂȂĂ܂ꍇȂǂ͑ΐłȂB  
