void Do02_ExtendTalon(NextmoveEvent& nmEvent) override { // 山札の底(最初)のカードに、カーソルを合わせます。 nmEvent.BackToHome_CurrCard(); //──────────────────────────────────────────────────────────────────────────────── // 駒を取らない手(盤上) //──────────────────────────────────────────────────────────────────────────────── // N04(駒を取らない手・盤上)のカードを作成し、その最後のカードを覚えておきます。 MoveStack* pNewTalon_1 = g_moveGenerator200.GenerateMoves_2(N04_NonCaptureMinusPro, nmEvent.GetCurrCard(), nmEvent.GetPos()); nmEvent.SetSeekbarTerminated(pNewTalon_1); nmEvent.DoScoreing_NonCapturesMinusPro<false>();// 点数付け nmEvent.GoToTopTalon_CurrCard();// 駒を取らない盤上の手は、すっとばすぜ☆ //──────────────────────────────────────────────────────────────────────────────── // 駒を取らない手(持ち駒) //──────────────────────────────────────────────────────────────────────────────── // このあとと、そのあとで、phNonTacticalMoves1 で、ラスト・ムーブ として使う☆ MoveStack* pNewTalon_2 = g_moveGenerator200.GenerateMoves_2(N02_Drop, nmEvent.GetCurrCard(), nmEvent.GetPos()); // 駒を打つ手のカードを作成し、その最後のカードを覚えておきます。 nmEvent.SetSeekbarTerminated(pNewTalon_2); nmEvent.SetLastNonCaputre(pNewTalon_2); nmEvent.DoScoreing_NonCapturesMinusPro<true>();// 点数付け //──────────────────────────────────────────────────────────────────────────────── // //──────────────────────────────────────────────────────────────────────────────── nmEvent.BackToHome_CurrCard();// 山札の底(最初)☆ // 「駒を取らない手」の山札全体について、プラスのスコアを、先頭近くに移動させるぜ☆ MoveStack* pSortedTalon_3 = std::partition(nmEvent.GetCurrCard(), nmEvent.Get_LastNonCapture(), HasPositiveScore()); nmEvent.SetSeekbarTerminated(pSortedTalon_3); // 点数が高い順か☆?ソートするぜ☆ // 要素数は10個くらいまでであることが多い。要素数が少ないので、insertionSort() を使用する。 UtilMove01::InsertionSort<MoveStack*, true>(nmEvent.GetCurrCard(), nmEvent.GetSeekbarTerminated()); // なんで2回ソートしたのか☆?(^q^)? }
void MovePicker::goNextPhase() { currMove_ = firstMove(); // legalMoves_[0] は番兵 ++phase_; switch (phase()) { case PH_TacticalMoves0: case PH_TacticalMoves1: lastMove_ = generateMoves<CapturePlusPro>(currMove(), pos()); scoreCaptures(); return; case PH_Killers: currMove_ = killerMoves_; lastMove_ = currMove() + 2; return; case PH_NonTacticalMoves0: lastMove_ = generateMoves<NonCaptureMinusPro>(currMove(), pos()); scoreNonCapturesMinusPro<false>(); currMove_ = lastMove(); lastNonCapture_ = lastMove_ = generateMoves<Drop>(currMove(), pos()); scoreNonCapturesMinusPro<true>(); currMove_ = firstMove(); lastMove_ = std::partition(currMove(), lastNonCapture(), HasPositiveScore()); // 要素数は10個くらいまでであることが多い。要素数が少ないので、insertionSort() を使用する。 insertionSort<MoveStack*, true>(currMove(), lastMove()); return; case PH_NonTacticalMoves1: currMove_ = lastMove(); lastMove_ = lastNonCapture(); if (static_cast<Depth>(3 * OnePly) <= depth_) { std::sort(currMove(), lastMove(), std::greater<MoveStack>()); } return; case PH_BadCaptures: currMove_ = legalMoves_ + MaxLegalMoves - 1; lastMove_ = endBadCaptures_; return; case PH_Evasions: case PH_QEvasions: lastMove_ = generateMoves<Evasion>(currMove(), pos()); if (currMove() + 1 < lastMove()) { scoreEvasions(); } return; case PH_QCaptures0: lastMove_ = generateMoves<CapturePlusPro>(firstMove(), pos()); scoreCaptures(); return; case PH_QCaptures1: lastMove_ = generateMoves<Recapture>(firstMove(), pos(), recaptureSquare_); scoreCaptures(); return; case EvasionSearch: case QSearch: case QEvasionSearch: case QRecapture: case ProbCut: // これが無いと、MainSearch の後に EvasionSearch が始まったりしてしまう。 phase_ = PH_Stop; case PH_Stop: lastMove_ = currMove() + 1; return; default: UNREACHABLE; } }