Exemplo n.º 1
0
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 );
	}
}
Exemplo n.º 2
0
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();
}