mardi 4 octobre 2016

Beginner C++ Protecting against invalid input with cin.fail()

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;
}

Aucun commentaire:

Enregistrer un commentaire