[Scummvm-git-logs] scummvm master -> 2cf068efb14c908cf27448416b84dd75a8a45cc9
elasota
noreply at scummvm.org
Thu May 25 15:56:20 UTC 2023
This automated email contains information about 1 new commit which have been
pushed to the 'scummvm' repo located at https://github.com/scummvm/scummvm .
Summary:
2cf068efb1 VCRUISE: Update comments to clarify how circuit puzzle AI works.
Commit: 2cf068efb14c908cf27448416b84dd75a8a45cc9
https://github.com/scummvm/scummvm/commit/2cf068efb14c908cf27448416b84dd75a8a45cc9
Author: elasota (ejlasota at gmail.com)
Date: 2023-05-25T11:55:28-04:00
Commit Message:
VCRUISE: Update comments to clarify how circuit puzzle AI works.
Changed paths:
engines/vcruise/circuitpuzzle.cpp
diff --git a/engines/vcruise/circuitpuzzle.cpp b/engines/vcruise/circuitpuzzle.cpp
index 593fd7cd45f..f92583d5f70 100644
--- a/engines/vcruise/circuitpuzzle.cpp
+++ b/engines/vcruise/circuitpuzzle.cpp
@@ -329,23 +329,18 @@ CircuitPuzzle::CircuitPuzzle(int layout) : _havePreviousAction(false) {
}
bool CircuitPuzzle::executeAIAction(Common::RandomSource &randomSource, Common::Point &outCoord, CellDirection &outBlockDirection) {
- // I've attempted to figure out what Schizm's AI algorithm does to no avail.
+ // Don't know exactly what algorithm Schizm uses, we use something that approximates the original
+ // pretty well most of the time:
+ // - Identify all connection paths that are tied for the fewest number of new connections required to win.
+ // - Enumerate all open connections on those paths.
+ // - If the previous move blocked a horizontal connection (i.e. with a vertical barrier), prioritize
+ // connections on the same X coordinate as that block.
+ // - Block a random connection from the candidates.
//
- // What we do, which is approximately what Schizm's AI does, is find all paths tied for the shortest path to the goal
- // and randomly block a point on that path. Sometimes Schizm's AI will fail to a 1-distance spot, and sometimes it will fail
- // to opportunistically block a spot that would cause the AI to immediatley win, so this isn't a perfect reproduction of it,
- // but it is very close.
+ // There seem to be times that Schizm doesn't do this. In particular, Schizm will (rarely) fail to block
+ // a connection even if it's the only connection that will immediately win the puzzle for the player.
//
- // We solve this as a series of 2 flood fills:
- // - First, each point is assigned a maximum distance score
- // - Next, all points connected to the start point (0,0) are assigned a score of 0.
- // - Next, all points are progressively expanded to determine the minimum number of
- // connections needed to reach the point.
- // - If the end point is assigned a score, then flood fill stops and the backtrace phase
- // begins. The backtrace phase collects all links starting from the end that link to
- // another point with 1 less move required to reach it.
- // - A random link is chosen as the AI move.
-
+ // It also doesn't prioritize making moves that will immediately win for the AI.
CircuitPuzzleAIEvaluator evaluator;
computeStepsToReach(evaluator);
@@ -442,7 +437,6 @@ bool CircuitPuzzle::executeAIAction(Common::RandomSource &randomSource, Common::
// All potential blocks are now on the shortest path.
// Try to mimic some of the AI behavior of Schizm to form wall advances.
// The highest-priority move is one that runs parallel to the previous move.
- // If no such move exists, then a move that shares a corner is priority.
uint selectedBlock = 0;
if (numPotentialBlocks > 1) {
uint blockQualities[kMaxLinks];
More information about the Scummvm-git-logs
mailing list