mirror of
https://github.moeyy.xyz/https://github.com/trekhleb/javascript-algorithms.git
synced 2024-11-10 11:09:43 +08:00
Add comments to minimax (#7)
This commit is contained in:
parent
7dccbaa440
commit
b2edea0ce3
@ -31,33 +31,50 @@ class MinimaxPlayer extends Player {
|
|||||||
*
|
*
|
||||||
* @param {GameNode} node - Description of game state
|
* @param {GameNode} node - Description of game state
|
||||||
* @param {Number} depth - Limit to the search depth
|
* @param {Number} depth - Limit to the search depth
|
||||||
* @returns {Number} - Best score the player can reach under this state
|
* @returns {[Number, GameNode]} - Best score the player can reach under this
|
||||||
|
* state, and the resulting game state
|
||||||
*/
|
*/
|
||||||
minimax(node, depth) {
|
minimax(node, depth) {
|
||||||
|
// Check whether search depth is reached
|
||||||
|
// or if the state is terminal
|
||||||
if (depth === 0 || node.isTerminalState()) {
|
if (depth === 0 || node.isTerminalState()) {
|
||||||
return [this.heuristic(node), null];
|
return [this.heuristic(node), null];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// One player is maximizing and the other play is minimizing
|
||||||
|
// Their optimal values are initialized to numbers which will be replaced
|
||||||
|
// as soon as any valid node is visited
|
||||||
let optimal = node.isOpponentPlaying() ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY;
|
let optimal = node.isOpponentPlaying() ? Number.POSITIVE_INFINITY : Number.NEGATIVE_INFINITY;
|
||||||
let optimal_node = null
|
let optimal_node = null
|
||||||
|
|
||||||
|
// Make a list of possible next states
|
||||||
const nextNodes = node.computeNextStates();
|
const nextNodes = node.computeNextStates();
|
||||||
|
|
||||||
|
// Iterate over all possible next states
|
||||||
|
// Choose the optimal score, from the perspective of current player
|
||||||
for (let i = 0; i < nextNodes.length; i += 1) {
|
for (let i = 0; i < nextNodes.length; i += 1) {
|
||||||
const nextNode = nextNodes[i];
|
const nextNode = nextNodes[i];
|
||||||
|
|
||||||
|
// Recursively call minimax to find score of the next state
|
||||||
const [score, _] = this.minimax(nextNode, depth - 1);
|
const [score, _] = this.minimax(nextNode, depth - 1);
|
||||||
|
|
||||||
|
// In this code, the "opponent" is the minimizing player
|
||||||
|
// And the "player" is the maximizing player
|
||||||
if (node.isOpponentPlaying()) {
|
if (node.isOpponentPlaying()) {
|
||||||
|
// optimal is set to min(score, optimal)
|
||||||
if (score < optimal) {
|
if (score < optimal) {
|
||||||
optimal = score;
|
optimal = score;
|
||||||
optimal_node = nextNode;
|
optimal_node = nextNode;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
|
// optimal is set to max(score, optimal)
|
||||||
if (score > optimal) {
|
if (score > optimal) {
|
||||||
optimal = score;
|
optimal = score;
|
||||||
optimal_node = nextNode;
|
optimal_node = nextNode;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// Return optimal score and resulting game state
|
||||||
return [optimal, optimal_node];
|
return [optimal, optimal_node];
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user