diff options
author | pommicket <pommicket@gmail.com> | 2025-08-21 15:12:03 -0400 |
---|---|---|
committer | pommicket <pommicket@gmail.com> | 2025-08-21 15:12:03 -0400 |
commit | f7bba783ccf693ccb92c870562931ef3377852f0 (patch) | |
tree | 826dddad51b29e1ed7d475f21ecc1f0fe5bd8ea6 /quacker/macondobackend.cpp | |
parent | 4702e6bb96ed5f943039956224b8a5e28d862c75 (diff) |
"Generated moves only" checkbox
Diffstat (limited to 'quacker/macondobackend.cpp')
-rw-r--r-- | quacker/macondobackend.cpp | 60 |
1 files changed, 38 insertions, 22 deletions
diff --git a/quacker/macondobackend.cpp b/quacker/macondobackend.cpp index 20d54ba..0a4e945 100644 --- a/quacker/macondobackend.cpp +++ b/quacker/macondobackend.cpp @@ -120,10 +120,11 @@ void MacondoBackend::solveEndgame(const MacondoEndgameOptions &) { m_command = Command::SolveEndgame; } -void MacondoBackend::solvePreEndgame(const MacondoPreEndgameOptions &) { +void MacondoBackend::solvePreEndgame(const MacondoPreEndgameOptions &options) { startProcess(); m_command = Command::SolvePreEndgame; m_preEndgamePlaysToAnalyze = 0; + m_preEndgameOptions = options; } static bool parseInt(const string &s, int &value, size_t *len) { @@ -413,6 +414,7 @@ void MacondoBackend::timer() { data = m_process->readAllStandardOutput(); anyNewOutput |= data.size() != 0; m_processOutput.append(data); + //printf("%.*s",data.size(), data.constData()); fflush(stdout); } const char *dots = updateDots(anyNewOutput); @@ -531,6 +533,21 @@ void MacondoBackend::timer() { } } +static string moveToString(const Quackle::Move &move) { + switch (move.action) { + case Quackle::Move::Action::Pass: + return "pass"; + case Quackle::Move::Action::Exchange: + return std::string("exch ") + QUACKLE_ALPHABET_PARAMETERS->userVisible(move.tiles()); + case Quackle::Move::Action::Place: + case Quackle::Move::Action::PlaceError: + return move.positionString() + " " + QUACKLE_ALPHABET_PARAMETERS->userVisible(move.tiles()); + default: + // blind exchanges, etc. + return ""; + } +} + void MacondoBackend::processStarted() { loadGCG(); switch (m_command) { @@ -541,26 +558,12 @@ void MacondoBackend::processStarted() { std::stringstream commands; // add generated moves to Macondo for (const Quackle::Move &move: m_movesToLoad) { - commands << "add "; - switch (move.action) { - case Quackle::Move::Action::Pass: - commands << "pass"; - break; - case Quackle::Move::Action::Exchange: - commands << "exch "; - commands << QUACKLE_ALPHABET_PARAMETERS->userVisible(move.tiles()); - break; - case Quackle::Move::Action::Place: - case Quackle::Move::Action::PlaceError: - commands << move.positionString(); - commands << " "; - commands << QUACKLE_ALPHABET_PARAMETERS->userVisible(move.prettyTiles()); - break; - default: - // ignore non-plays - break; + string moveStr = moveToString(move); + if (!moveStr.empty()) { + commands << "add "; + commands << moveStr; + commands << "\n"; } - commands << "\n"; } commands << "sim\n"; @@ -569,7 +572,20 @@ void MacondoBackend::processStarted() { } break; case Command::SolvePreEndgame: - m_process->write("peg -disable-id true -early-cutoff true\n"); + { + std::stringstream command; + command << "peg "; + for (const Quackle::Move &move: m_preEndgameOptions.movesToAnalyze) { + string moveStr = moveToString(move); + if (!moveStr.empty()) { + command << "-only-solve \"" << moveStr << "\" "; + } + } + command << "-disable-id true "; + command << "-early-cutoff true "; + command << "\n"; + m_process->write(command.str().c_str()); + } break; case Command::SolveEndgame: m_process->write("endgame -plies 20\n"); @@ -615,7 +631,7 @@ void MacondoBackend::killProcess() { m_process->kill(); // this is really unnecessary but prevents a // "process destroyed while running" warning message - m_process->waitForFinished(100); + m_process->waitForFinished(200); delete m_process; m_process = nullptr; } |