while循环起作用......由于某种原因没有做它应该做的事情

时间:2012-02-15 03:07:47

标签: c++

我有一个简单的骰子投掷程序的代码与投注单位和所有...你打赌,如果你做对了你得到你下注的金额你选择的骰子...如果你错了但是稍微(在你选择的数字范围内 - 你选择的骰子的数量)你不会丢失任何东西,如果你真的不在乎你输了......

我有一个while循环基本上记住了两件事:只要用户有BU或者他们没有再次输入“no”或“No”...但由于某种原因它只是不起作用...哈哈。任何想法为什么?投注系统工作,它认识到betting.currentBU == 0,但是while循环只是不会反应大声笑。

#include <iostream>
#include <string>
#include <cstdlib>
#include <time.h>
#include <limits>

using namespace std;

struct Dices{ // structure containing all the dice related integers
    int dice;
    int total;
    int  choice;
} Dices = {0,0,0};

struct betting{ // structure containing all the betting integers
    int currentBU;
    int bettedBU;
} betting = {100, 0};


int DiceThrow(int dicechoice, int totalnum){ // a method for the dice being rolled
    for(int i=1; i <= dicechoice;i++){
            totalnum = totalnum + (rand() % 6 + 1); //total number, repeated by the loop for every dice
        }
    return totalnum;
}

int winningbet(int dicea, int cBU, int bBU){ // in case the user guesses it right
    std::cout << "Congratulations, you got it right! \n";
    cBU = cBU + (dicea * bBU); // give him money...
    return(cBU);
}
int losingbet(int dicen, int totaln, int choicen, int cBU2, int bBU2){ //in case the user guesses wrong 
    if(choicen > (totaln+dicen) || choicen < (totaln+dicen)) // checks how wrong he is, if he's too off, he loses BUs
        cBU2 = cBU2-bBU2;
    else
        std::cout << "you we're so close, you don't lose any BUs! \n"; //if he was really close, just let him know he was close
    return(cBU2);

}

int main(){
    string decision; // decision if they want to keep playing or not
    srand ( (unsigned int)time(NULL) );
    while(decision != "no" || decision != "No" || betting.currentBU != 0) // makes sure of the decision AND that he still has BUs
    {
        Dices.total = 0;
        std::cout << "how many dice would you like to use? ";
        std::cin >> Dices.dice;
        std::cout << "how many How many BUs are you betting?(" << betting.currentBU << " BUs left) ";
        std::cin >> betting.bettedBU;
        if(betting.bettedBU > betting.currentBU){ // if he doesn't have enough BUs
            std::cout << "Sorry, you don't have that many BUs...";
            std::cout << "Want to try again with a different amount?(Yes/No) ";
            std::cin >> decision;
        }
        else{
            std::cout << "guess what number was thrown: ";
            std::cin >> Dices.choice;
            Dices.total = DiceThrow(Dices.dice, Dices.total);
            if(Dices.choice == Dices.total){
                betting.currentBU = winningbet(Dices.dice, betting.currentBU, betting.bettedBU);
                std::cout << "Want to try again?(Yes/No) ";
                std::cin >> decision;
            } else{
                std::cout << "Sorry, the number was " << Dices.total << "... better luck next time \n" ;
                betting.currentBU = losingbet(Dices.dice, Dices.total, Dices.choice, betting.currentBU, betting.bettedBU);
                if(betting.currentBU > 0){
                    std::cout << "Want to try again?(Yes/No) ";
                    std::cin >> decision;
                }
             }

        }
    }
    if(betting.currentBU == 0){
        std:cout << "sorry, you ran out of BUs...";
        std::cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );
    }
    else{
        std::cout << "your final BU count is: " << betting.currentBU << "\n";
        std::cout << "Thanks for playing, see you next time! (Press ENTER to terminate...)";
        std::cin.ignore( std::numeric_limits<std::streamsize>::max(), '\n' );
    }
    return 0;

}

2 个答案:

答案 0 :(得分:3)

你的测试是while (A || B || C),只要这三件事中的任何一件都是真的,它就会循环。由于decision不能同时等同于"no""No",因此这两个非等于测试中的至少一个将始终为真,因此循环将永远循环...

答案 1 :(得分:3)

不应该是:

while(decision != "no" && decision != "No" && betting.currentBU != 0) 

我们需要检查决定是否不等于“否”且不等于“否”并且currentBU不等于0