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^)?
	}
Example #2
0
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;
	}
}