C++ NIM with functions

This is a discussion on C++ NIM with functions within the C++ Programming forums, part of the General Programming Boards category; I have a C++ program that I can not get to run. Can you please help me find the problem. ...

  1. #1
    Registered User
    Join Date
    Nov 2006
    Posts
    3

    C++ NIM with functions

    I have a C++ program that I can not get to run. Can you
    please help me find the problem. The code is listed below.


    *************************************/
    Code:
    #include <iostream> 
    
    
    using namespace std; 
    
      
    
    // Let's define constants to identify the sides
    const bool HUMAN_PLAYER = true;
    const bool COMPUTER_PLAYER = false; 
    
      
    
    // Function Prototypes - Messages to the player
    void welcomeMessage();
    void congratulateWinner( bool theWinner );
    void gameStatus( int pileSize ); 
    
      
    
    // Function Prototypes - User Interface
    // Decide who gets to play first
    bool pickFirstPlayer(); 
    
      
    
    // Function Prototypes - Moves
    int getHumanPlayerMove( int pileSize );
    int getComputerPlayerMove( int pileSize ); 
    
      
    
    // Function Prototypes - Predicates
    bool isGameOver( int pileSize ); 
    
      
    
    // The main NIM Program
    int main()
    {
      // Start by saying hello to the player
      welcomeMessage(); 
    
      
    
      // Now, let's ask the human player who goes first
      bool currentPlayer = pickFirstPlayer();
     
      // Now that we know who plays first, we can start
      // the game by initializing the heap of sticks
      int nimSticks = 22; 
    
      
    
      // CORE GAME LOOP: as long as there are sticks left,
      // we'll need to get moves from the opponents
      while( !isGameOver( nimSticks) )
      {
        // Show the status of the game
        gameStatus( nimSticks ); 
    
      
    
        // Let's get a move from the current player
        int currentPlayerMove;
        if( currentPlayer == HUMAN_PLAYER )
          currentPlayerMove = getHumanPlayerMove( nimSticks );
        else
          currentPlayerMove = getComputerPlayerMove( nimSticks ); 
    
      
    
        // Now that we know how many sticks the current
        // player wants to take, we remove them from the
        // pile
        nimSticks -= currentPlayerMove; 
    
      
    
        // Do we have a winner?
        if( isGameOver( nimSticks ) )
          congratulateWinner( currentPlayer );
     
        // If there are sticks left in the pile, it is
        // now the other player's turn
        else
          currentPlayer = !currentPlayer;
      }
     
      // And we're done!
      return 0;
    } 
    
      
    
    // welcomeMessage() - Say Hi to the player
    void welcomeMessage()
    {
      cout << "Welcome to the Game of Single-Pile Nim!" << endl;
      cout << "---------------------------------------" << endl << endl;
      return;
    } 
    
      
    
    // congratulateWinner() - Tell the player who won
    void congratulateWinner( bool theWinner )
    {
      // If so, who has just taken the last stick?
      if( HUMAN_PLAYER == theWinner )
      {
        cout << "You win. Congratulations!" << endl;
      }
      else
      {
        cout << "I win! Better luck next time..." << endl;
      }
      return;
    } 
    
      
    
    // gameStatus() - Tell the player how many sticks
    // are left in the pile before a turn
    void gameStatus( int pileSize )
    {
     int stickStatus = pileSize;
     cout << "There are/is " <<stickStatus << " stick(s) left." <<endl<<endl;
    	return;
    } 
    
      
    
    // pickFirstPlayer() - Ask the user who goes first
    bool pickFirstPlayer()
    {
      int count = 2;
    	int compTurn;
    	char start;
    	
    	cout << "IT'S NIM TIME!!!!!!" <<endl<<endl;
    
    	while(count >= 0)
    	{
    		cout << "Who starts? [H]uman or [C]omputer?" <<endl;
    		cin >> start;
    		switch(start)
    		{
    		case 'C':
    		case 'c':cout << "Computer start." <<endl; count = -1; compTurn = true; break;
    		case 'H':
    		case 'h':cout << "Human start." <<endl; count = -1; true;compTurn = true; break;
    		default:cout << count << " try(s)left" <<endl;
    		}
    		if(count == 0)
    			cout << "NO GO!!!!!              Sorry." <<endl<<endl;
    	--count;
    	}
    	//return(compTurn);
    	return true;
    } 
    
    
    // getHumanPlayerMove() - Ask the player for a number
    // of sticks to take out of the pile
    int getHumanPlayerMove( int pileSize )
    {
      int pickstick;
    	int no = 3;
    int nimSticks = pileSize;
    	while(no != 0)
    	{
    		cout << "Take how many sticks?: ";
    		cin >> pickstick;
    		cout << endl;
    		if(1 <= pickstick && pickstick <= 4)
    		{
    			nimSticks -= pickstick;
    			cout<< "Number of sticks left: " << nimSticks << endl << endl;
    			/*if(winner() == 1)
    			{
    				cout << "The hu-man wins!" <<endl;
    				exit(0);
    			}*/
    			no = 0;
    		}
    		else
    		{
    			no--;
    			cout << "Error. " << no << " trys left. " <<endl;
    		}
    	}
    	return 0;
    } 
    
    
    // getComputerPlayerMove() - Let the machine play
    int getComputerPlayerMove( int pileSize )
    {  
    	int nimSticks = pileSize;
    	int pick = nimSticks - nimSticks % (1 + 4);
    	int just = nimSticks - pick;
    	if (just == 0)
    	{
    		just = 1 + rand() % (4 - 1 + 1);
    		pick -= just;
    	}
    	nimSticks -= just;
    	cout << "Computer takes " << just <<" stick(s)." <<endl;
    	cout << "Their are " << pick << " left." <<endl;
    	/*if(winner() == 1)
    	{
    		cout << "The COMPUTER wins!" <<endl;
    		exit(0);
    	}*/
    	return 0;
    } 
    
    
    // isGameOver() - Have we reached endgame conditions?
    // if there are no sticks left, yes
    bool isGameOver( int pileSize )
    {
      if(int nimSticks = true)
    	cout<<  "The game is over." <<endl<<endl;
    	return true;

  2. #2
    MFC killed my cat! manutd's Avatar
    Join Date
    Sep 2006
    Location
    Boston, Massachusetts
    Posts
    870
    1) Post your errors.
    2) I went straight to the bottom, but I see that this has no closing braces:
    Code:
    bool isGameOver( int pileSize )
    {
      if(int nimSticks = true)
    	cout<<  "The game is over." <<endl<<endl;
      return true;
    }
    Silence is better than unmeaning words.
    - Pythagoras
    My blog

  3. #3
    Its hard... But im here swgh's Avatar
    Join Date
    Apr 2005
    Location
    England
    Posts
    1,479
    >case 'C':
    >case 'c':cout << "Computer start." <<endl; count = -1; compTurn = true; break;
    >case 'H':
    >case 'h':cout << "Human start." <<endl; count = -1; true;compTurn = true; break;
    >default:cout << count << " try(s)left" <<endl;

    It really does make a switch statement easer to read when it is like this:

    Code:
    switch ( age )
    {
    case 10:
       cout << "\nYou are age ten!" << endl;
       break;  // we know the break is here without reading the entire string
    
    default:
       cout << "\ncerr << "Wrong age!" << endl;
       break;
    }
    I echo manutd, we need the compiler errors. Also, it may be better to organise a class
    for your game, and place that in a seperate header file, it will reduce the code a little and
    saves stuffing a large program into the one file
    I'm just trying to be a better person - My Name Is Earl

  4. #4
    Its hard... But im here swgh's Avatar
    Join Date
    Apr 2005
    Location
    England
    Posts
    1,479
    Oh, and again the error is indeed a missing brace at the end of your isGameOver() function
    I'm just trying to be a better person - My Name Is Earl

  5. #5
    MFC killed my cat! manutd's Avatar
    Join Date
    Sep 2006
    Location
    Boston, Massachusetts
    Posts
    870
    Well, there we go. Easiest fix in the world, just do what I did in red in my post.
    Silence is better than unmeaning words.
    - Pythagoras
    My blog

  6. #6
    Its hard... But im here swgh's Avatar
    Join Date
    Apr 2005
    Location
    England
    Posts
    1,479
    Just thought Id add that your game does nothing. if you enter c or h at the start of the program all it does is say good-bye. This is of course pending you have completed the [rogram, and if this is the case, i advise you to test it ( after you have fixed the error ) and you will see what I mean. looks good though.
    I'm just trying to be a better person - My Name Is Earl

  7. #7
    Registered User
    Join Date
    Nov 2006
    Posts
    3
    Code:
    bool isGameOver( int pileSize )
    {
      if(int nimSticks = false)
    	cout<<  "The game is over." <<endl<<endl;
      return false;
    }
    I changed the trues to falses and it works, but now I have a different problem. The sticks wont decrement. Here are my functions for the player and the computer:
    Code:
    int getHumanPlayerMove( int pileSize )
    {
      int pickstick;
    	int no = 3;
    int nimSticks = pileSize;
    	while(no != 0)
    	{
    		cout << "Take how many sticks?: ";
    		cin >> pickstick;
    		cout << endl;
    		if(1 <= pickstick && pickstick <= 4)
    		{
    			nimSticks -= pickstick;
    			cout<< "Number of sticks left: " << nimSticks << endl << endl;
    			/*if(winner() == 1)
    			{
    				cout << "The hu-man wins!" <<endl;
    				exit(0);
    			}*/
    			no = 0;
    		}
    		else
    		{
    			no--;
    			cout << "Error. " << no << " trys left. " <<endl;
    		}
    	}
    	return 0;
    } 
    
    
    
    int getComputerPlayerMove( int pileSize )
    {  
    	int nimSticks = pileSize;
    	int pick = nimSticks - nimSticks % (1 + 4);
    	int just = nimSticks - pick;
    	if (just == 0)
    	{
    		just = 1 + rand() % (4 - 1 + 1);
    		pick -= just;
    	}
    	nimSticks -= just;
    	cout << "Computer takes " << just <<" stick(s)." <<endl;
    	cout << "Their are " << pick << " left." <<endl;
    	/*if(winner() == 1)
    	{
    		cout << "The COMPUTER wins!" <<endl;
    		exit(0);
    	}*/
    	return 0;
    }

  8. #8
    Registered User
    Join Date
    Jan 2005
    Posts
    7,344
    >> if(int nimSticks = false)
    That code is still wrong. You are declaring a new int named nimSticks and assigning it the value false. What is that function supposed to be doing?

  9. #9
    CSharpener vart's Avatar
    Join Date
    Oct 2006
    Location
    Rishon LeZion, Israel
    Posts
    6,484
    Code:
    bool isGameOver( int pileSize )
    {
      if(int nimSticks = false)
    	cout<<  "The game is over." <<endl<<endl;
      return false;
    }
    is equivalent to
    Code:
    bool isGameOver( int pileSize )
    {  return false;}
    Is it what you plan to do?
    The first 90% of a project takes 90% of the time,
    the last 10% takes the other 90% of the time.

  10. #10
    CSharpener vart's Avatar
    Join Date
    Oct 2006
    Location
    Rishon LeZion, Israel
    Posts
    6,484
    // Now that we know how many sticks the current
    // player wants to take, we remove them from the
    // pile
    nimSticks -= currentPlayerMove;
    your functions always return 0. So you always decrement the numStick value with 0 (that's why it is not changed. You should return the actual value of taken picks.
    The first 90% of a project takes 90% of the time,
    the last 10% takes the other 90% of the time.

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. Void Functions Help
    By bethanne41 in forum C++ Programming
    Replies: 1
    Last Post: 05-09-2005, 06:30 PM
  2. Functions and Classes - What did I do wrong?
    By redmage in forum C++ Programming
    Replies: 5
    Last Post: 04-11-2005, 12:50 PM
  3. calling functions within functions
    By edd1986 in forum C Programming
    Replies: 3
    Last Post: 03-29-2005, 03:35 AM
  4. Factory Functions HOWTO
    By GuardianDevil in forum Windows Programming
    Replies: 1
    Last Post: 05-01-2004, 02:41 PM
  5. Shell functions on Win XP
    By geek@02 in forum Windows Programming
    Replies: 6
    Last Post: 04-19-2004, 06:39 AM

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21