使用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

本文关键字:循环 while do 游戏 随机 一个 程序 使用 运行      更新时间:2023-10-16

我一直在玩一个随机的猜字游戏。游戏的秘密数字是由用户输入的从最小到最大的数字,猜测者被要求猜测秘密数字,最后应该被问他们是否愿意再玩一次。如果猜测者过高或过低,还必须有多个打印输出选项。无论如何,我希望它检查并确保用户输入的是数字,而不是愚蠢的东西。所以我一直在兜圈子试图弄清楚这部分。我相信这是一个容易的解决方案,但我是一个新的编程,这已经把我难住了。如有任何帮助,不胜感激。

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,看起来好多了