void Shogi::GenerateTacticalMoves( Moves& moves ){ /************************************************ 戦略的な手を列挙する。 Capture, Promote, (King) ************************************************/ GEN_INFO info; // 生成する指し手の種類 SetGenInfo( info, MOVE_CAPTURE | MOVE_PROMOTE ); // ピン SetGenInfoPin( info ); if( !info.check ){ // 盤上 GenerateMovesOnBoard( moves, info ); } else if( info.check != DOUBLE_CHECK ){ GenerateCapEvasion( moves, info ); GenerateNoCapEvasion( moves, info ); } if( moves.GetNumber() == 0 ){ // 玉を動かす手 info.flag |= MOVE_KING; GenerateMovesOu( moves, info ); } }
int Book::GetMoveAll( Shogi* pshogi, Moves& moves, TYPE type ){ /************************************************ 定跡手を列挙する。 ************************************************/ int i; int flag; list<BLIST>::iterator ib; list<MLIST>::iterator im; list<MLIST>* pmlist; uint64 hash = pshogi->GetHash(); MOVE mtemp; i = (int)( hash & BOOK_HASH_MASK ); // 局面が既にあるか調べる。 flag = 0; for( ib = blist[i].begin() ; ib != blist[i].end() ; ++ib ){ if( (*ib).hash == hash ){ flag = 1; break; } } if( flag == 0 ) return 0; // 指し手を列挙 pmlist = &(*ib).mlist; for( im = pmlist->begin() ; im != pmlist->end() ; ++im ){ mtemp.Import( (*im).mv ); if( pshogi->IsLegalMove( mtemp ) ){ switch( type ){ // 評価値を用いる場合 case TYPE_EVAL: mtemp.value = (*im).val; break; // 出現頻度を用いる場合 case TYPE_FREQ: default: mtemp.value = (*im).cnt * 100 / (*ib).cnt; break; } moves.Add( mtemp ); } } moves.Sort(); return moves.GetNumber(); }