We strongly recommend to refer below article as a prerequisite of this.
In this post, Game of Nim is discussed. The Game of Nim is described by the following rules-
“ Given a number of piles in which each pile contains some numbers of stones/coins. In each turn, a player can choose only one pile and remove any number of stones (at least one) from that pile. The player who cannot move is considered to lose the game (i.e., one who take the last stone is the winner). ”
For example, consider that there are two players- A and B, and initially there are three piles of coins initially having 3, 4, 5 coins in each of them as shown below. We assume that first move is made by A. See the below figure for clear understanding of the whole game play.
So was A having a strong expertise in this game ? or he/she was having some edge over B by starting first ?
Let us now play again, with the same configuration of the piles as above but this time B starting first instead of A.
By the above figure, it must be clear that the game depends on one important factor – Who starts the game first ?
So does the player who starts first will win everytime ?
Let us again play the game, starting from A , and this time with a different initial configuration of piles. The piles have 1, 4, 5 coins initially.
So, the result is clear. A has lost. But how? We know that this game depends heavily on which player starts first. Thus, there must be another factor which dominates the result of this simple-yet-interesting game. That factor is the initial configuration of the heaps/piles. This time the initial configuration was different from the previous one.
So, we can conclude that this game depends on two factors-
- The player who starts first.
- The initial configuration of the piles/heaps.
In fact, we can predict the winner of the game before even playing the game !
Nim-Sum : The cumulative XOR value of the number of coins/stones in each piles/heaps at any point of the game is called Nim-Sum at that point.
“If both A and B play optimally (i.e- they don’t make any mistakes), then the player starting first is guaranteed to win if the Nim-Sum at the beginning of the game is non-zero. Otherwise, if the Nim-Sum evaluates to zero, then player A will lose definitely.”
For the proof of the above theorem, see- https://en.wikipedia.org/wiki/Nim#Proof_of_the_winning_formula
Let us apply the above theorem in the games played above. In the first game A started first and the Nim-Sum at the beginning of the game was, 3 XOR 4 XOR 5 = 2, which is a non-zero value, and hence A won. Whereas in the second game-play, when the initial configuration of the piles were 1, 4, and 5 and A started first, then A was destined to lose as the Nim-Sum at the beginning of the game wasv1 XOR 4 XOR 5 = 0 .
In the program below, we play the Nim-Game between computer and human(user)
The below program uses two functions
knowWinnerBeforePlaying() : : Tells the result before playing.
playGame() : plays the full game and finally declare the winner. The function playGame() doesn’t takes input from the human(user), instead it uses a rand() function to randomly pick up a pile and randomly remove any number of stones from the picked pile.
The below program can be modified to take input from the user by removing the rand() function and inserting cin or scanf() functions.
Output : May be different on different runs as random numbers are used to decide next move (for the loosing player).
Prediction before playing the game -> COMPUTER will win GAME STARTS Current Game Status -> 3 4 5 COMPUTER removes 2 stones from pile at index 0 Current Game Status -> 1 4 5 HUMAN removes 3 stones from pile at index 1 Current Game Status -> 1 1 5 COMPUTER removes 5 stones from pile at index 2 Current Game Status -> 1 1 0 HUMAN removes 1 stones from pile at index 1 Current Game Status -> 1 0 0 COMPUTER removes 1 stones from pile at index 0 Current Game Status -> 0 0 0 COMPUTER won
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above