第一次循环后不使用输入
not using input after first pass of loop
目的是询问用户是否要播放,输出选项,接收用户输入,然后模拟"掷"适当面的骰子。 输出结果,然后要求其他选择,等等。
程序的第一个周期按预期工作,但不是询问您是否要再次播放,而是空白。 如果您输入一个数字来选择骰子,无论选择什么,它都会输出第一个骰子有多少边。
#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放入函数中吗?
这与循环无关。
- 尝试打印出从您的 cin 获得的值,您将看到问题。
- 您使用 goto 语句不一致,仅在第一种情况下返回到
START
- 您没有正确终止开关语句
- 你应该永远不要使用goto,除非你不能用任何其他方式做到这一点。
- 这写得很可怕。 为什么需要在每个案例语句中复制所有内容?似乎您只需要使用开关来设置数字边的值和打印输出。其余的应该是常见的...我认为你也不需要变量...看看我的原始重构只是你的代码到简单的事情......
重构代码使其更具可读性:见下文
#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;
}
相关文章:
- 正在尝试了解输入验证循环
- 在while循环中输入带有std::cin的字符串后,控制台会输出大量胡言乱语
- 通过for循环使用用户输入填充列表
- 我试图制作一个程序,要求用户输入问题和答案,但程序循环不正确
- 使用输入打破 OpenMP 中的循环
- 如何读取单个字符并在输入两个字符序列时输出? 使用 while 循环和C++
- 遇到此问题时遇到困难:允许用户输入数组的值并使用 for,而循环也输出输入的最大数字
- 如何使用递归循环我的代码(当用户输入无效输入时,它会再次提示他们)?
- 偶尔多次请求用户输入循环
- 如何用字符终止整数输入循环?
- CIN 到矢量输入循环无限期.为什么
- 结构卡在输入循环中的函数
- C++Visual Studio 2017中,无法输入循环中的变量
- 用于读取文件的输入循环
- C++ 文件输入循环的困难
- 输入循环 while 函数
- 巧克力游戏:输入循环,不插入循环或打印游戏统计数据
- 使用自动输入循环错误"auto must have an initializer"
- 通过用户输入循环的更好方法
- Scala/ c++:尾部递归函数代替输入循环