if (rootKnoop && zetNummer > 1 && Threads.tactischeModus && diepte >= 12 * PLY && abs(alfa) < WINST_WAARDE && diepte > mijnThread->vorigeTactischeDiepte) { mijnThread->tactischeModusGebruikt = true; bool tactische_zet = slagOfPromotie || geeftSchaak; if (!tactische_zet) { Waarde alfa_dreiging = alfa + 5 * WAARDE_PION / 4; st++; st->mp_eindeLijst = (st - 1)->mp_eindeLijst; pos.speel_null_zet(); (st + 1)->doeGeenVroegePruning = true; waarde = search(pos, alfa_dreiging, alfa_dreiging + WAARDE_1, 6 * PLY, false); (st + 1)->doeGeenVroegePruning = false; pos.neem_null_terug(); st--; tactische_zet = (waarde > alfa_dreiging); } if (tactische_zet) { Diepte diepte_red = diepte - diepte / 8; waarde = mijnThread->rootZetten[mijnThread->rootZetten.find(zet)].startWaarde; Waarde score_offset = 8 * (alfa - waarde) / (diepte / PLY + 16); do { if (Signals.stop.load(std::memory_order_relaxed)) return WAARDE_0; Waarde alfa_red = waarde + score_offset; if (alfa_red >= alfa && diepte_red <= diepte) break; if (alfa_red >= alfa || diepte_red >= diepte + diepte / 8) alfa_red = alfa; (st + 1)->doeGeenVroegePruning = true; waarde = -search(pos, -alfa_red - WAARDE_1, -alfa_red, diepte_red, true); (st + 1)->doeGeenVroegePruning = false; if (waarde <= alfa_red) break; if (waarde > alfa && diepte_red >= diepte) { (st + 1)->pv = pv; (st + 1)->pv[0] = GEEN_ZET; waarde = -search(pos, -beta, -alfa, diepte_red, false); goto einde_zet; } diepte_red += PLY; } while (true); }