Please turn on javascript in your browser to play chess.


Chess Programming


Imagine that a position is assigned a value based on its quality from the point of view of the side to move. A positive value would indicate that the side on the move is winning, a negative value that they are losing; a zero value would indicate that neither side has the advantage.

If an evaluation function exists that will provide such a value for any given position then the best move from any position can be assumed to be the move that results in the position with the lowest value (the worst position for the opponent).

Consider the game tree below. Each node represents a game position and each child node represents a position that can result from its parent. The operators in the tree are the legal moves from each position.

Figure 1. A game tree of depth 2

If the evaluation function is applied to each of the terminal nodes the value of the non-terminal nodes can be determined by assuming the following

  • The value of a position is the value of the best move that can be made from it
  • The value of a move is the negative of the value of the position that results from it
In figure 1, the value of -3 at node a is based on the values at nodes b and c. The moves that result in the positions at nodes b and c are valued at -3 and -4 respectively (the negated values of the positions that result from them). Node a is given the value of the best available move from that position (the move that results in the position of node b). Figure 2 shows the procedure applied throughout a game tree of depth 3.

Figure 2 The negamax procedure applied to a game tree of depth 3

The best move from the original position is whichever move resulted in the root node being valued at +6. In this case that move was the one that resulted in the position at node f, the worst position for the opponent.