/****************************************************************
** File: nim.c
** Author: Marie desJardins
** Date: 8/27/06
** Section: 0101
** E-mail: mariedj@cs.umbc.edu
**
** This file contains a game player for the game of Nim.
** This program asks the user how many sticks, then takes
** turns taking 1 or 2 sticks. This player hates to lose.
****************************************************************/
#include
/****************************************************************
** Main -- This is the main function to play Nim.
** It is probably too long and should be subdivided into
** subfunctions. Maybe we'll do that in Lecture 3.
** Inputs: None
** Outputs: None
** Side effects: Interacts with the user to play Nim.
****************************************************************/
int main() {
int sticks; /* The number of sticks remaining */
int theirSticks; /* # sticks the other player takes on a turn */
/* First find out how many sticks, and quit if I can't win */
printf ("Let's play Nim!\n");
printf ("How many sticks should we play with? ");
scanf ("%d", &sticks);
if ( sticks%3 == 1 ) {
printf ("Never mind -- I don't want to play!!\n");
printf ("Bye!\n");
return (0);
}
/* Start playing! */
while ( sticks >= 0 ) {
/* If the number of sticks remaining is divisible by 3,
take 2 sticks, leaving the other player in a hopeless
situation. */
if ( sticks%3 == 0 ) {
sticks -= 2; /* not particularly readable but illustrates -= */
printf ("I'll take 2 sticks. Now there are %d sticks.\n", sticks);
/* If the number of sticks remaining is 2 modulo 3,
take 1 stick, leaving the other player in a hopeless
situation. */
} else if ( sticks%3 == 2 ) {
sticks--; /* decrement sticks (by one)! */
printf ("I'll take 1 stick. Now there are %d sticks.\n", sticks);
}
/* Let the other player take a turn, and remove their
sticks from the pile. */
printf ("Your turn! How many sticks will you take? ");
scanf ("%d", &theirSticks);
sticks = sticks - theirSticks; /* more readable than -= */
/* Quit if they took too many or too few sticks. */
if ( ((theirSticks != 1) && (theirSticks != 2)) ||
(sticks < 0) ) {
printf ("Cheater! I'm not playing with you any more!\n");
return (0);
}
/* If there are no sticks left, I win! (I always do...) */
if ( sticks == 0 ) {
printf ("I win!\n");
return (1);
}
}
/* We should never reach this point... */
printf ("How did we get here? Must be a bug!!\n");
return (0);
}