第一次循环后不使用输入

not using input after first pass of loop

本文关键字:输入 循环 第一次      更新时间:2023-10-16

目的是询问用户是否要播放,输出选项,接收用户输入,然后模拟"掷"适当面的骰子。 输出结果,然后要求其他选择,等等。

程序的第一个周期按预期工作,但不是询问您是否要再次播放,而是空白。 如果您输入一个数字来选择骰子,无论选择什么,它都会输出第一个骰子有多少边。

#include <iostream>     
#include <ctime>        
using namespace std;

int throwDie(int Sides, int &throwResult)
{
throwResult = 1 + rand() % (Sides - 1 + 1); 
return throwResult;                      
}
int main()
{           
int dieTot = 0,
        throwNumber = 0,
    numberSides = 0,
    throwResult = 0;
    int die1 = 4;
    int die2 = 6;
    int die3 = 8;
    int die4 = 10;
    int die5 = 12;
    int die6 = 20;
    char rollAgain;
    srand(unsigned(time(0) ));
    START:   
    cout << "Do you want Play? ";
    cin >> rollAgain;
    cout << "How many sides? " << endl;
    cout << "1 - 4 sided dien";
    cout << "2 - 6 sided dien";
    cout << "3 - 8 sided dien";
    cout << "4 - 10 sided dien";
    cout << "5 - 12 sided dien";
    cout << "6 - 20 sided dien";
    int choice;
    cout << "Enter choice: ";
    cin >> choice;
    switch( choice ) {
        case 1:
            do {
                cout << "You have choosen a 4 sided die? " << endl;
                int numberSides = die1;
                cout << numberSides << "-sided die rolled for a value of "
                     << throwDie(numberSides, throwResult) << "!" << endl;
                dieTot = dieTot + throwResult;
                throwNumber++;
                cin >> numberSides;
            } while (choice != numberSides );
            goto START;
            break;
        case 2:
            do {
                cout << "You have choosen a 6 sided die? " << endl;
                int numberSides = die2;
                cout << numberSides << "-sided die rolled for a value of "
                     << throwDie(numberSides, throwResult) << "!" << endl;
                dieTot = dieTot + throwResult;
                throwNumber++;
                cin >> numberSides;
                cout << endl << "Total for " << throwNumber <<  " throws = " << dieTot << endl;
            } while (choice != numberSides );
            break;
        case 3:
            do {
                cout << "You have choosen a 8 sided die? " << endl;
                int numberSides = die3;
                cout << numberSides << "-sided die rolled for a value of "
                     << throwDie(numberSides, throwResult) << "!" << endl;
                dieTot = dieTot + throwResult;
                throwNumber++;
                cin >> numberSides;
                cout << endl << "Total for " << throwNumber <<  " throws = " << dieTot << endl;
            } while (choice != numberSides );
            break;
        case 4:
            do {
                cout << "You have choosen a 10 sided die? " << endl;
                int numberSides = die4;
                cout << numberSides << "-sided die rolled for a value of "
                     << throwDie(numberSides, throwResult) << "!" << endl;
                dieTot = dieTot + throwResult;
                throwNumber++;
                cin >> numberSides;
                cout << endl << "Total for " << throwNumber <<  " throws = " << dieTot << endl;
            } while (choice != numberSides );
            break;
        case 5:
            do {
                cout << "You have choosen a 12 sided die? " << endl;
                int numberSides = die5;
                cout << numberSides << "-sided die rolled for a value of "
                     << throwDie(numberSides, throwResult) << "!" << endl;
                dieTot = dieTot + throwResult;
                throwNumber++;
                cin >> numberSides;
                cout << endl << "Total for " << throwNumber <<  " throws = " << dieTot << endl;
            } while (choice != numberSides );
            break;
        case 6:
            do {
                cout << "You have choosen a 20 sided die? " << endl;
                int numberSides = die6;
                cout << numberSides << "-sided die rolled for a value of "
                     << throwDie(numberSides, throwResult) << "!" << endl;
                dieTot = dieTot + throwResult;
                throwNumber++;
                cin >> numberSides;
                cout << endl << "Total for " << throwNumber <<  " throws = " << dieTot << endl;
            } while (choice != numberSides );
            break;
        default:
            cout << "Not a proper entry.n";
            break;
        cout << endl << "Total for " << throwNumber <<  " throws = " << dieTot << endl;
        return 0;
    }
}

我假设每个 case 语句中的额外代码是:

    cout << numberSides << "-sided die rolled for a value of " << throwDie(numberSides,                              throwResult) << "!" << endl;
    dieTot = dieTot + throwResult;
    throwNumber++;
    cin >> numberSides;
    cout << endl << "Total for " << throwNumber <<  " throws = " << dieTot << endl;
    }
while (choice != numberSides );
    break;

这会在代码末尾吗?并非在每个案例陈述中。另外,如果我这样做,我什至需要将while/do放入函数中吗?

这与循环无关。

  1. 尝试打印出从您的 cin 获得的值,您将看到问题。
  2. 您使用 goto 语句不一致,仅在第一种情况下返回到 START
  3. 您没有正确终止开关语句
  4. 你应该永远不要使用goto,除非你不能用任何其他方式做到这一点。
  5. 这写得很可怕。 为什么需要在每个案例语句中复制所有内容?似乎您只需要使用开关来设置数字边的值和打印输出。其余的应该是常见的...我认为你也不需要变量...看看我的原始重构只是你的代码到简单的事情......

重构代码使其更具可读性:见下文

#include <iostream>     
#include <ctime>        
using namespace std;
//This function will throw a dice returning the result while updating the parameter.
int throwDie(int Sides, int &throwResult)
{
    throwResult = 1 + rand() % (Sides); //Sides - 1 + 1 == Sides
    return throwResult;                      
}
//Display the menu
void displayMenu()
{
    cout << "How many sides? n"
         << "1 - 4 sided dien"
         << "2 - 6 sided dien"
         << "3 - 8 sided dien"
         << "4 - 10 sided dien"
         << "5 - 12 sided dien"
         << "6 - 20 sided dien"
         << "CTRL-D to quit";
}

int main()
{           
    int dieTot = 0,
        throwNumber = 0,
        numberSides = 0,
        throwResult = 0;
    // THESE ARENT NEEDED
    // sides = 4+2*(X-1)
    //int die1 = 4;
    //int die2 = 6;
    //int die3 = 8;
    //int die4 = 10;
    //int die5 = 12;
    //int die6 = 20;
    srand(unsigned(time(0) ));
    displayMenu();
    int choice;
    while ( cin >> choice ) {
        /* cin >> choice will return 0 / fail if they enter CTRL-D or enter
           something other than a number... you'll have to handle that in another way */
        if ( choice < 1 || choice > 6 ) {
            cout << "Invalid choice try again!";
            continue;
        }
        //numberSides = 4+2*(choice-1); //fast  way
        switch (choice) {
            case 6:
                numberSides = 20;
                break;
            case 1:
                //if you dont want to do this slick trick of fall through
                //numberSides = 4;
                //break; 
            case 2:
            case 3:
            case 4:
            case 5:
                numberSides = 4+2*(choice-1); // use this for 1,2,3,4,5;
                break;
        }
        cout << "You have chosen a " << numberSides << " sided die.n"
             << numberSides << "-sided die rolled for a value of "
             << throwDie(numberSides, throwResult) << "!" << endl;
        dieTot += throwResult;
        throwNumber++;
    }
    cout << "nn" << "Total for " << throwNumber << " throws = " << dieTot << endl;
    return 0;
}