I just finished working on this marble game program and it works fine except I need to do one more thing to protect it from invalid input. The program responds properly to all integer based invalid input but if you input a non integer the program crashes. I've been using the cin.fail() function and it works but then gets stuck in a loop. If the user enters a non integer i want the program to tell the user that was invalid input and prompt the user to input their selection again.
I added return 1; after the invalid input statement to end the program instead of it crashing but that's not what I want to do. I want it to print "invalid input" and then re-prompt the user to input their selection again.
#include <iostream>
using namespace std;
int main()
{
cout << "*** The Game of Nim ***\n\n" << endl;
string player1, player2, currentPlayer;
int marbles, selection;
bool isDone = false;
cout << "Enter a name for Player 1: ";
cin >> player1;
cout << "Enter a name for Player 2: ";
cin >> player2;
cout << "Enter how many marbles you would like to start with in the pile: ";
cin >> marbles;
cout << "\nThere are " << marbles << " marbles in the pile\n" << endl;
currentPlayer = player1;
do
{
bool turnDone = false;
while (turnDone == false && marbles != 0)
{
if (currentPlayer == player1)
{
cout << currentPlayer << "\n";
cout << "How many marbles would you like to draw? : ";
cin >> selection;
if (cin.fail())
{
cout << "\nInvalid Input\n";
return 1;
}
if (selection < marbles / 2 + 1 && marbles > 1 && selection != 0)
{
marbles = marbles - selection;
if (marbles == 1)
{
cout << "\nUh Oh! There is only 1 marble remaining in the pile\n" << endl;
currentPlayer = player2;
turnDone = true;
break;
}
cout << "\nThere are " << marbles << " marbles remaining in the pile\n" << endl;
currentPlayer = player2;
turnDone = true;
}else if (marbles == 1)
{
marbles = marbles - selection;
if (marbles <= 0)
{
cout << "\nThere are 0 marbles remianing in the pile\n";
cout << "You drew the last marble!" << endl;
cout << "You lose!\n\n" << endl;
cout << player2 << " wins\n\n" << endl;
turnDone = true;
return 0;
}
}else if (selection == 0 || selection > marbles / 2 + 1)
{
cout << "\nYou must draw at least 1 marble, and no more than half the pile\n" << endl;
}
}else if (currentPlayer == player2)
{
cout << currentPlayer << "\n";
cout << "How many marbles would you like to draw? : ";
cin >> selection;
if (selection < marbles / 2 +1 && marbles > 1 && selection != 0)
{
marbles = marbles - selection;
if (marbles == 1)
{
cout << "\nUh Oh! There is only 1 marble remaining in the pile\n" << endl;
currentPlayer = player1;
turnDone = true;
break;
}
cout << "\nThere are " << marbles << " marbles remaining in the pile\n" << endl;
currentPlayer = player1;
turnDone = true;
}else if (marbles == 1)
{
marbles = marbles - selection;
if (marbles <= 0)
{
cout << "\nThere are 0 marbles remianing in the pile\n";
cout << "You drew the last marble!" << endl;
cout << "You lose!\n\n" << endl;
cout << player1 << " wins!\n\n" << endl;
turnDone = true;
return 0;
}
}else if (selection == 0 || selection > marbles / 2 + 1)
{
cout << "\nYou must draw at least 1 marble, and no more than half the pile\n" << endl;
}
}
}
}while (isDone == false);
return 0;
}