Пример #1
0
void MovePicker::generate_next() {

  cur = moves;

  switch (++phase) {

  case CAPTURES_S1: case CAPTURES_S3: case CAPTURES_S4: case CAPTURES_S5: case CAPTURES_S6:
      end = generate<CAPTURES>(pos, moves);
      score_captures();
      return;

  case KILLERS_S1:
      cur = killers;
      end = cur + 2;
      return;

  case QUIETS_1_S1:
      endQuiets = end = generate<QUIETS>(pos, moves);
      score_noncaptures();
      end = std::partition(cur, end, has_positive_score);
      sort<MoveStack>(cur, end);
      return;

  case QUIETS_2_S1:
      cur = end;
      end = endQuiets;
      if (depth >= 3 * ONE_PLY)
          sort<MoveStack>(cur, end);
      return;

  case BAD_CAPTURES_S1:
      // Just pick them in reverse order to get MVV/LVA ordering
      cur = moves + MAX_MOVES - 1;
      end = endBadCaptures;
      return;

  case EVASIONS_S2:
      end = generate<EVASIONS>(pos, moves);
      score_evasions();
      return;

  case QUIET_CHECKS_S3:
      end = generate<QUIET_CHECKS>(pos, moves);
      return;

  case EVASION: case QSEARCH_0: case QSEARCH_1: case PROBCUT: case RECAPTURE:
      phase = STOP;
  case STOP:
      end = cur + 1; // Avoid another next_phase() call
      return;

  default:
      assert(false);
  }
}
Пример #2
0
void MovePicker::generate_next() {

  curMove = moves;

  switch (++phase) {

  case CAPTURES_S1: case CAPTURES_S3: case CAPTURES_S4: case CAPTURES_S5: case CAPTURES_S6:
      lastMove = generate<MV_CAPTURE>(pos, moves);
      score_captures();
      return;

  case KILLERS_S1:
      curMove = killers;
      lastMove = curMove + 2;
      return;

  case QUIETS_1_S1:
      lastQuiet = lastMove = generate<MV_QUIET>(pos, moves);
      score_noncaptures();
      lastMove = std::partition(curMove, lastMove, has_positive_score);
      sort<MoveStack>(curMove, lastMove);
      return;

  case QUIETS_2_S1:
      curMove = lastMove;
      lastMove = lastQuiet;
      if (depth >= 3 * ONE_PLY)
          sort<MoveStack>(curMove, lastMove);
      return;

  case BAD_CAPTURES_S1:
      // Just pick them in reverse order to get MVV/LVA ordering
      curMove = moves + MAX_MOVES - 1;
      lastMove = lastBadCapture;
      return;

  case EVASIONS_S2:
      lastMove = generate<MV_EVASION>(pos, moves);
      score_evasions();
      return;

  case QUIET_CHECKS_S3:
      lastMove = generate<MV_QUIET_CHECK>(pos, moves);
      return;

  case EVASION: case QSEARCH_0: case QSEARCH_1: case PROBCUT: case RECAPTURE:
      phase = STOP;
  case STOP:
      lastMove = curMove + 1; // Avoid another next_phase() call
      return;

  default:
      assert(false);
  }
}
Пример #3
0
void MovePicker::go_next_phase() {

	curMove = moves;
	phase = *(++phasePtr);
	switch (phase) {

	case PH_TT_MOVE:
		lastMove = curMove + 1;
		return;

	case PH_GOOD_CAPTURES:
	case PH_GOOD_PROBCUT:
		lastMove = generate<MV_CAPTURE>(pos, moves);
		score_captures();
		return;

	case PH_KILLERS:
		curMove = killers;
		lastMove = curMove + 2;
		return;

	case PH_NONCAPTURES_1:
		lastNonCapture = lastMove = generate<MV_NON_CAPTURE>(pos, moves);
		score_noncaptures();
		lastMove = std::partition(curMove, lastMove, has_positive_score);
		sort<MoveStack>(curMove, lastMove);
		return;

	case PH_NONCAPTURES_2:
		curMove = lastMove;
		lastMove = lastNonCapture;
		if (depth >= 3 * ONE_PLY)
			sort<MoveStack>(curMove, lastMove);
		return;

	case PH_BAD_CAPTURES:
		// Bad captures SEE value is already calculated so just pick
		// them in order to get SEE move ordering.
		curMove = badCaptures;
		lastMove = moves + MAX_MOVES;
		return;

	case PH_EVASIONS:
		assert(pos.in_check());
		lastMove = generate<MV_EVASION>(pos, moves);
		score_evasions();
		return;

	case PH_QCAPTURES:
		lastMove = generate<MV_CAPTURE>(pos, moves);
		score_captures();
		return;

	case PH_QRECAPTURES:
		lastMove = generate<MV_CAPTURE>(pos, moves);
		return;

	case PH_QCHECKS:
		lastMove = generate<MV_NON_CAPTURE_CHECK>(pos, moves);
		return;

	case PH_STOP:
		lastMove = curMove + 1; // Avoid another go_next_phase() call
		return;

	default:
		assert(false);
		return;
	}
}