使用do while循环和while循环编写一个程序,将运行随机猜谜游戏...我坚持在do while循环

时间:2014-07-08 08:17:19

标签: c++

我一直在进行随机猜谜游戏。游戏秘密号码是从用户输入的最小值到最大值,猜猜猜猜秘密号码,最后应该询问他们是否想再玩一次。如果猜测者是高或低,还必须有多种打印输出选项。无论如何,我希望它检查并确保用户输入数字,而不是愚蠢的东西。所以我一直在试图弄清楚这一部分。我确信这是一个简单的解决方案,但我是编程的新手,这让我很难过。任何帮助将不胜感激。

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

2 个答案:

答案 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)。

无论如何,我没有在代码中看到任何其他问题,我测试了它并且它有效。现在没有转到它看起来好多了。