本文整理汇总了C++中Position::GetTurn方法的典型用法代码示例。如果您正苦于以下问题:C++ Position::GetTurn方法的具体用法?C++ Position::GetTurn怎么用?C++ Position::GetTurn使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类Position
的用法示例。
在下文中一共展示了Position::GetTurn方法的5个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: GetBookKey
Key Book::GetBookKey(const Position& pos) {
Key key = 0;
Bitboard bb = pos.GetOccupiedBB();
while (bb.Exists1Bit()) {
const Square sq = bb.PopFirstOneFromI9();
key ^= m_ZobPiece[pos.GetPiece(sq)][sq];
}
const Hand hand = pos.GetHand(pos.GetTurn());
for (HandPiece hp = HPawn; hp < HandPieceNum; ++hp) {
key ^= m_ZobHand[hp][hand.NumOf(hp)];
}
if (pos.GetTurn() == White) {
key ^= m_ZobTurn;
}
return key;
}
示例2:
virtual inline void DoFutilityPruning01(
bool& isContinue,
bool& INCHECK,
bool& givesCheck,
Move& move,
Move& ttMove,
ScoreIndex& futilityScore,
ScoreIndex& futilityBase,
Position& pos,
ScoreIndex& beta,
ScoreIndex& bestScore,
const Depth depth
)const override {
// 非PVノードのとき☆(^q^)
if (!INCHECK // 駒打ちは王手回避のみなので、ここで弾かれる。
&& !givesCheck
&& move != ttMove)
{
futilityScore =
futilityBase + PieceScore::GetCapturePieceScore(pos.GetPiece(move.To()));
if (move.IsPromotion()) {
futilityScore += PieceScore::GetPromotePieceScore(move.GetPieceTypeFrom());
}
if (futilityScore < beta) {
bestScore = std::max(bestScore, futilityScore);
isContinue = true;
return;
}
// todo: MovePicker のオーダリングで SEE してるので、ここで SEE するの勿体無い。
if (futilityBase < beta
&& depth < Depth0
&&
(
pos.GetTurn()==Color::Black
?
pos.GetSee1<Color::Black,Color::White>(move, beta - futilityBase)
:
pos.GetSee1<Color::White,Color::Black>(move, beta - futilityBase)
)
<= ScoreZero)
{
bestScore = std::max(bestScore, futilityBase);
isContinue = true;
return;
}
}
}
示例3: SetTranspositionTableMove
inline void SetTranspositionTableMove( Move ttm, const Position& pos) {
this->m_ttMove_ =
// トランスポジション・テーブル・ムーブが設定ありで
!ttm.IsNone()
&&
(
pos.GetTurn() == Color::Black
?
// 先手で
pos.MoveIsPseudoLegal<Color::Black, Color::White>(ttm)
:
// 後手で
pos.MoveIsPseudoLegal<Color::White, Color::Black>(ttm)
)
?
// リーガルなら、引数で渡されてくるムーブを、トランスポジション・テーブル・ムーブとします。
ttm
:
// イリーガルなら
g_MOVE_NONE;
}
示例4:
// スプリット・ポイントかどうかで変わる手続きだぜ☆!(^q^)
virtual inline void DoStep11c_LoopHeader(
bool& isContinue,
Position& pos,
Move& move,
const CheckInfo& ci,
int& moveCount,
SplitedNode** ppSplitedNode
) const override {
// DoStep11c
if (!
(
pos.GetTurn()==Color::Black
?
pos.IsPseudoLegalMoveIsLegal<false, false,Color::Black,Color::White>(move, ci.m_pinned)
:
pos.IsPseudoLegalMoveIsLegal<false, false,Color::White,Color::Black>(move, ci.m_pinned)
)
) {
isContinue = true;
return;
}
moveCount = ++(*ppSplitedNode)->m_moveCount;
(*ppSplitedNode)->m_mutex.unlock();
}
示例5: MakeBook
// 以下のようなフォーマットが入力される。
// <棋譜番号> <日付> <先手名> <後手名> <0:引き分け, 1:先手勝ち, 2:後手勝ち> <総手数> <棋戦名前> <戦形>
// <CSA1行形式の指し手>
//
// (例)
// 1 2003/09/08 羽生善治 谷川浩司 2 126 王位戦 その他の戦型
// 7776FU3334FU2726FU4132KI
//
// 勝った方の手だけを定跡として使うこととする。
// 出現回数がそのまま定跡として使う確率となる。
// 基本的には棋譜を丁寧に選別した上で定跡を作る必要がある。
// MAKE_SEARCHED_BOOK を on にしていると、定跡生成に非常に時間が掛かる。
void MakeBook(Position& pos, std::istringstream& ssCmd) {
std::string fileName;
ssCmd >> fileName;
std::ifstream ifs(fileName.c_str(), std::ios::binary);
if (!ifs) {
std::cout << "I cannot open " << fileName << std::endl;
return;
}
std::string line;
std::map<Key, std::vector<BookEntry> > bookMap;
while (std::getline(ifs, line)) {
std::string elem;
std::stringstream ss(line);
ss >> elem; // 棋譜番号を飛ばす。
ss >> elem; // 対局日を飛ばす。
ss >> elem; // 先手
const std::string sente = elem;
ss >> elem; // 後手
const std::string gote = elem;
ss >> elem; // (0:引き分け,1:先手の勝ち,2:後手の勝ち)
const Color winner = (elem == "1" ? Black : elem == "2" ? White : Color::Null);
// 勝った方の指し手を記録していく。
// 又は稲庭戦法側を記録していく。
const Color saveColor = winner;
if (!std::getline(ifs, line)) {
std::cout << "!!! header only !!!" << std::endl;
return;
}
pos.Set(g_DefaultStartPositionSFEN, pos.GetRucksack()->m_ownerHerosPub.GetFirstCaptain());
StateStackPtr SetUpStates = StateStackPtr(new std::stack<StateInfo>());
UsiOperation usiOperation;
while (!line.empty()) {
const std::string moveStrCSA = line.substr(0, 6);
const Move move = usiOperation.CsaToMove(pos, moveStrCSA);
if (move.IsNone()) {
pos.Print();
std::cout << "!!! Illegal move = " << moveStrCSA << " !!!" << std::endl;
break;
}
line.erase(0, 6); // 先頭から6文字削除
if (pos.GetTurn() == saveColor) {
// 先手、後手の内、片方だけを記録する。
const Key key = Book::GetBookKey(pos);
bool isFind = false;
if (bookMap.find(key) != bookMap.end()) {
for (std::vector<BookEntry>::iterator it = bookMap[key].begin();
it != bookMap[key].end();
++it)
{
if (it->m_fromToPro == move.ProFromAndTo()) {
++it->m_count;
if (it->m_count < 1) {
// 数えられる数の上限を超えたので元に戻す。
--it->m_count;
}
isFind = true;
}
}
}
if (isFind == false) {
#if defined MAKE_SEARCHED_BOOK
SetUpStates->push(StateInfo());
pos.GetTurn()==Color::Black
?
pos.DoMove<Color::Black,Color::White>(move, SetUpStates->top())
:
pos.DoMove<Color::White,Color::Black>(move, SetUpStates->top())
;
std::istringstream ssCmd("byoyomi 1000");
UsiOperation usiOperation;
usiOperation.Go(pos, ssCmd);
pos.GetRucksack()->m_ownerHerosPub.WaitForThinkFinished();
pos.UndoMove(move);
SetUpStates->pop();
// doMove してから search してるので点数が反転しているので直す。
const ScoreIndex score = -pos.GetConstRucksack()->m_rootMoves[0].m_score_;
#else
const ScoreIndex GetScore = ScoreZero;
#endif
// 未登録の手
BookEntry be;
be.m_score = score;
be.m_key = key;
//.........这里部分代码省略.........