使用do while循环和while循环来编写一个程序来运行随机猜谜游戏…我卡在了do while循环上
Using do while loop and while loop to write a program that will run random guessing game...i stuck at the do while loop
我一直在玩一个随机的猜字游戏。游戏的秘密数字是由用户输入的从最小到最大的数字,猜测者被要求猜测秘密数字,最后应该被问他们是否愿意再玩一次。如果猜测者过高或过低,还必须有多个打印输出选项。无论如何,我希望它检查并确保用户输入的是数字,而不是愚蠢的东西。所以我一直在兜圈子试图弄清楚这部分。我相信这是一个容易的解决方案,但我是一个新的编程,这已经把我难住了。如有任何帮助,不胜感激。
my code should similar to below output images :
[1]http://i62.tinypic.com/wjvuqb.png
[2]http://i57.tinypic.com/2nq9jwm.png
[3]http://i62.tinypic.com/210zss7.png
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <iomanip>
#include <string>
using namespace std;
int main()
{
int min, max, secret=0, deposit, bet, guess;
bool again= true;
string name;
char reply;
cout<< setw(80)<< setfill('=')<<"nn";
cout<< setw(45)<< "NUMBER GUESSING GAME!"<<"nn";
cout<< setfill('=')<< setw(80)<<"nn";
cout<< "What ur name?n";
getline(cin,name);
Again:
cout<< "Pls enter the min & max numbern";
while(!(cin>>min)||min<0)
{
cout<<"Min? ";
cin.clear();
cin.ignore();
}
while(!(cin>>max)||max<0)
{
cout<<"Max? ";
cin.clear();
cin.ignore();
}
while(!(max> min))
{
cout<<"Min is larger than Maxn";
goto Again;
}
cout<< "nMin: "<<min<<"nMax: "<<max<<"n";
secret= rand() % max+min;
cout<<"Enter ur deposit: ";
cin>> deposit;
AA: cout<< setw(45)<< "nnnnRULES OF THE GAME"<<"nn";
cout<< setfill('-')<< setw(80)<<"nn";
cout<< "Guess number between "<< min<< " to "<< max;
cout<< "nIf ur guess match, 10 times ur deposit!!";
cout<< "nIf ur guess mismatch, lose ur betting amount!!";
cout<< "nn"<< setfill('-')<< setw(80)<<"nnn";
cout<< "Current Balance: "<<deposit;
cout<< "nWhat is ur betting amount? ";
cin>> bet;
do{
cout<< "nnEnter a guess to bet: ";
cin >> guess;
if (guess > max)
{
cout << "Too high!nn";
cin.clear();
cin.ignore();
}
else if (guess < min)
{
cout << "Too low!nn";
cin.clear();
cin.ignore();
}
}while (guess != secret);
if(guess != secret){
deposit-=bet;
cout << "nThat's it! You got it!n";
cout<<"Sorry, U lose RM "<< bet;
}
else{
bet*=10;
deposit+=bet;
cout << "nThat's it! You got it!n";
cout<<"Congratulation! U earn RM "<< bet;
}
cout<<"nnThe secret number was : "<< secret;
cout<< "nntCurrent Balance: "<<deposit<< "nnn";
do{
cout<< "Wanna play again (y/n)? ";
cin>> reply;
if( reply=='y'){
again= true;
goto AA;
}
else
cout<<"nReally? Ok, try again! ";
cin>>reply;
}while(again==false && reply=='n');
if(reply=='n'){
cout<<"nnn"<< setw(80)<< setfill('+')<<"nn";
cout<< setw(30)<< "THX FOR PLAYING! UR CURRENT BALANCE IS RM "<< deposit<<"nn";
cout<< setfill('+')<< setw(80)<<"n";
}
return 0;
}
你正在使用goto,如果你正在使用goto,猛禽会把你撕成碎片。在任何情况下都不要使用goto!
但是你可以使用函数来使你的代码更清晰一些。这一大堆文字和复制粘贴实在难以阅读。
首先,你用来计算随机数的公式是错误的。假设最小值是10,最大值是12。那么rand() % max可以是,比如说,10。加上最小值(10),猜测的数字将是20 -远远大于最大值…它应该是secret = rand() % (max-min +1) + min;
(如果您的间隔是[min, max])。
现在你的问题-据我所知,你想知道输入的猜测是否是一个数字。你可以这样做:
while(1)
{
cin >> guess;
if(cin){
if (guess > max){
cout << "Too high!nn";
cin.clear();
cin.ignore();
continue;
}
else if (guess < min){
cout << "Too low!nn";
cin.clear();
cin.ignore();
continue;
}
else if(guess != secret){
deposit-=bet;
cout<< "Sorry, U lose RM "<< bet;
}
else if(guess == secret){
bet*=10;
deposit+=bet;
cout<< "nnCongratulation! U earn RM "<< bet;
}
break;
}
else
{
cin.clear();
cin.ignore();
cout << "Error! You did not enter a number!" << endl;
continue;
}
}
如果用户没有输入数字,cin的失败标志将会上升,你可以使用它。
同样,当再次尝试(goto AA;
)时,您不会再次计算随机值,您应该。为了在每次启动程序时从rand()获得不同的随机数序列,您应该从当前时间开始为随机生成器播种。在main的开始,放入srand((unsigned int)time(NULL));
,这样做的是,它给随机生成器一个数字,并在其基础上生成随机数。如果每次程序启动时该数字都相同,则将生成相同的数字。但是由于当前时间总是在变化,所以每次的顺序都会不同。
使用goto会使你的代码非常混乱,并且会使bug很难被发现。是的,它是语言的一部分,是用来使用的,但是人们应该非常小心使用它。特别是如果您是编程新手,请尽量避免使用它。如果你需要无限循环,你可以使用while(1)
或for(;;)
-你可以使用continue;
进入下一个迭代,并使用break;
停止它们。
猜测循环也有问题。看来你不会输。您应该减少while循环中的存款并检查它是否为0。
编辑:在编辑后的代码中,您可以看到,每当用户需要再次输入数字时,您只需使用continue跳过迭代。这也是一个你应该如何处理无限循环而不是使用goto的例子。经过练习,你会掌握窍门的。;)
编辑2: do{
cout<< "Wanna play again (y/n)? ";
cin>> reply;
if( reply!='y'&& reply!='n')
cout<< "nReally? Ok, try again! n";
}while(reply!='n' && reply!='y');
if( reply =='y')
goto AA;
if(reply=='n'){
cout<< "nnn"<< setw(80)<< setfill('+')<< "nn";
cout<< setw(30)<< "THX FOR PLAYING! UR CURRENT BALANCE IS RM "<< deposit<< "nn";
cout<< setfill('+')<< setw(80)<< "n";
}
这应该使回复周期工作。您的程序应该由不同目的的不同代码块组成,在这个循环中,您混淆了检查答案的正确性和如果答案正确将会发生什么。先做第一件事比较容易,然后再做第二件事。使用函数通常可以帮助您解决这个问题。
编辑3:在新代码中,你有很多if语句的问题。首先,什么是!我想你的意思是<或者><=, !>不存在,它甚至不会编译。另一件事,当最大值或最小值为0时会发生什么?你还没说呢。你经常使用if-else链,在这种情况下它是不必要的。例如,你不需要if(min>0)
,你甚至不需要在它之前的else。如果你没有输入If语句-输入是正确的,你可以中断,如果你输入了其中一个-它是continue;在其中,下面的代码不执行。如果输入是数字,则执行的最大if-else链中的最后一个if语句也是如此。
无论如何,你可以做得更简单。例如,min循环可以是:
cout << "Pls enter the min of secret numbern";
while (!(cin >> min) || min<=0){
cout << "Pls enter the min of secret numbern";
cin.clear();
cin.ignore();
}
你可以看到,如果你意识到你应该打破它(cin &&)分钟> 0)。现在,当你为了把它作为while条件而否定它时,它变成了(!
无论如何,我没有在代码中看到任何其他问题,我测试了它,它工作了。现在没有goto,看起来好多了 或者>- 我正在使用嵌套的while循环来解析具有多行的文本文件,但由于某种原因,它只通过第一行,我不知道为什么
- while循环中while循环的时间复杂度是多少
- 在while循环中输入带有std::cin的字符串后,控制台会输出大量胡言乱语
- 擦除while循环中迭代的元素
- 为什么我不能在 while 循环中创建线程?
- 退出简单while循环时出现问题
- 如果条件为TRUE(最佳方式?),则在do while循环中后置增量
- 即使没有满足他们的条件,我也无法通过一些 do-while 循环
- 嵌套While循环不起作用(C++问题)
- 如何通过替换顺序代码的while循环来添加OpenMP for循环
- 使用 GMP 的 while 循环出现问题
- 程序以使用 C++ 中的 while 循环查找一组数字的最小值
- 为什么在 while 循环中返回表达式不起作用
- 如何使用 do while 循环确定最高值和最低值
- 如何读取单个字符并在输入两个字符序列时输出? 使用 while 循环和C++
- 用于在 C++ 中使用 while 循环查找下一个素数的简单函数
- OpenCV QT,显示视频的帧(不使用while循环)
- 输入循环 while 函数
- c++中的循环(while)
- 为什么这段代码没有循环(while)