我一直在进行随机猜谜游戏。游戏秘密号码是从用户输入的最小值到最大值,猜猜猜猜秘密号码,最后应该询问他们是否想再玩一次。如果猜测者是高或低,还必须有多种打印输出选项。无论如何,我希望它检查并确保用户输入数字,而不是愚蠢的东西。所以我一直在试图弄清楚这一部分。我确信这是一个简单的解决方案,但我是编程的新手,这让我很难过。任何帮助将不胜感激。
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('=')<<"\n\n";
cout<< setw(45)<< "NUMBER GUESSING GAME!"<<"\n\n";
cout<< setfill('=')<< setw(80)<<"\n\n";
cout<< "What ur name?\n";
getline(cin,name);
Again:
cout<< "Pls enter the min & max number\n";
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 Max\n";
goto Again;
}
cout<< "\nMin: "<<min<<"\nMax: "<<max<<"\n";
secret= rand() % max+min;
cout<<"Enter ur deposit: ";
cin>> deposit;
AA: cout<< setw(45)<< "\n\n\n\nRULES OF THE GAME"<<"\n\n";
cout<< setfill('-')<< setw(80)<<"\n\n";
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<< "\n\n"<< setfill('-')<< setw(80)<<"\n\n\n";
cout<< "Current Balance: "<<deposit;
cout<< "\nWhat is ur betting amount? ";
cin>> bet;
do{
cout<< "\n\nEnter a guess to bet: ";
cin >> guess;
if (guess > max)
{
cout << "Too high!\n\n";
cin.clear();
cin.ignore();
}
else if (guess < min)
{
cout << "Too low!\n\n";
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<<"\n\nThe secret number was : "<< secret;
cout<< "\n\n\tCurrent Balance: "<<deposit<< "\n\n\n";
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<<"\n\n\n"<< setw(80)<< setfill('+')<<"\n\n";
cout<< setw(30)<< "THX FOR PLAYING! UR CURRENT BALANCE IS RM "<< deposit<<"\n\n";
cout<< setfill('+')<< setw(80)<<"\n";
}
return 0;
}
答案 0 :(得分:4)
你正在使用goto,如果你正在使用goto,猛禽会把你撕成碎片。在任何情况下都不要使用goto!
但您可以使用函数使代码更清晰。这面文字和复制粘贴墙真的很难读。
答案 1 :(得分:0)
首先,您用来计算随机数的公式是错误的。假设min是10,max是12.然后rand()%max可以,比方说,10。添加min(10),猜测的数字是20 - 远远大于max ...它应该是secret = rand() % (max-min +1) + min;
(如果你的间隔是[min,max])。
现在问你的问题 - 就我所知,你想知道输入的猜测是否是一个数字。您可以这样做:
while(1)
{
cin >> guess;
if(cin){
if (guess > max){
cout << "Too high!\n\n";
cin.clear();
cin.ignore();
continue;
}
else if (guess < min){
cout << "Too low!\n\n";
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<< "\n\nCongratulation! 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 可能会使您的代码非常混乱,并且很容易发现错误。是的,它是语言的一部分,它可以被使用,但是应该非常小心。特别是如果您不熟悉编程,请尽量避免使用它。如果您需要无限循环,可以使用while(1)
或for(;;)
- 您可以使用continue;
进入下一次迭代,并使用break;
停止。
猜测循环也有问题。看来你不能输。你应该减少while循环中的存款并检查它是否为0。
编辑:在编辑过的代码中,您可以看到无论何时用户需要再次输入数字,您只需跳过迭代继续。这也是你应该如何处理无限循环而不是使用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<< "\n\n\n"<< setw(80)<< setfill('+')<< "\n\n";
cout<< setw(30)<< "THX FOR PLAYING! UR CURRENT BALANCE IS RM "<< deposit<< "\n\n";
cout<< setfill('+')<< setw(80)<< "\n";
}
这应该使回复周期起作用。您的程序应该包含不同用途的不同代码块,在这个循环中,您混淆了检查答案的正确性以及答案是否正确时会发生什么。首先做第一件事,然后做第二件事比较容易。使用函数通常可以帮助您。
编辑3:在新代码中,if语句存在很多问题。首先,是什么!&gt; ?我认为你的意思是&lt;或&lt; =,!&gt;不存在,甚至不会编译。另一件事 - 当max或min为0时会发生什么?你没有涉及到这一点。
你经常使用if-else链,在这种情况下不一定需要它。例如,您不需要if(min>0)
,您甚至不需要其他前面的其他内容。如果你没有输入if语句之一 - 输入是正确的你可以打破,如果你输入其中一个 - 它已经继续;在其中,下面的代码不会执行。如果输入是数字,则执行max if-else链中的最后一个if语句也是如此。
无论如何,你可以做得更简单。例如,min循环可以是:
cout << "Pls enter the min of secret number\n";
while (!(cin >> min) || min<=0){
cout << "Pls enter the min of secret number\n";
cin.clear();
cin.ignore();
}
你可以看到,如果你意识到你应该打破if(cin&amp;&amp; min&gt; 0),这将有效。现在当你否定它以便将它作为while条件时,它变为(!cin || min&lt; = 0)。
无论如何,我没有在代码中看到任何其他问题,我测试了它并且它有效。现在没有转到它看起来好多了。