任何人都可以告诉我为什么这些功能没有给我一个合理的频谱结果?

时间:2013-11-01 01:29:30

标签: c++ function while-loop

我正在使用的完整代码如下所示,它应该模拟游戏的掷骰子并向用户打印细节,并允许在用户需要时下注。除了实际的掷骰子游戏外,一切都有效。它不是仅在没有与crapsResult关联的真值时循环,而是找到一个实数值和一个单个负数的难以理解的字符串。任何帮助将不胜感激。

int main()
{
    //Declare the user input variables
    int gamesPlayed = 0;
    char inputPrint = ' ';
    char isBetting = ' ';
    int startingBet = 0;

    //Declare the variables used by the program
    int endingBet = 0;
    int currentGame = 0;
    bool crapsResult;
    int gamesWon = 0;
    int gamesLost = 0;
    double percentWon = 0;
    bool detailPrint = false;

    //Prompt the user to input their variables
    cout << "Enter the number of games to be played: ";
    cin >> gamesPlayed;
    while(gamesPlayed < 1)
    {
        cout << "   Error: must be greater than 0" << endl;
        cout << "Enter the number of games to be played: ";
        cin >> gamesPlayed;
        cin.clear();
        cin.ignore();
    }

    cout << "Do you wish to print details (Y/N): ";
    cin >> inputPrint;
    if(inputPrint == 'y' || inputPrint == 'Y')
    {
        detailPrint = true;
    }

    cout << "Do you wish to bet (Y/N): ";
    cin >> isBetting;

    if(isBetting == 'y' || isBetting == 'Y')
    {
        cout << "Enter money to start betting with: ";
        cin >> startingBet;
        while(startingBet < 1)
        {
            cout << "   Error: must be greater than 0" << endl;
            cout << "Enter the number of games to be played: ";
            cin >> gamesPlayed;
            cin.clear();
            cin.ignore();
        }
    }
    //Seed the random number generator
    srand(time(NULL));

    //Set a value for ending bet
    if(startingBet == 0)
    {
        endingBet = 1;
    }
    else
    {
        endingBet = startingBet;
    }
    //Call playcraps to simulate the game for as many games as the user input
    for(currentGame = 1; currentGame <= gamesPlayed && endingBet > 0; currentGame += 1)
    {
        crapsResult = NULL;
        crapsResult = playCraps(currentGame, detailPrint, isBetting, startingBet);
        if(crapsResult == true)
        {
            gamesWon += 1;
            endingBet = betting(endingBet, crapsResult);
        }
        if(crapsResult == false)
        {
            gamesLost += 1;
            endingBet = betting(endingBet, crapsResult);
        }
        if((isBetting == 'Y' || isBetting == 'y') && (detailPrint == true))
        {
            cout << "Money left is $" << endingBet << endl;
        }
    }

    //Calculate the percentage of games won
    percentWon = (double(gamesWon) / double(currentGame-1)) * 100.0;

    //Print the results to the user
    if(isBetting == 'Y' || isBetting == 'y')
    {
        cout << "Money at end of games is $" << endingBet << endl;
    }
    cout << "The number of games played is " << currentGame - 1 << endl;
    cout << "The number of games won is " << gamesWon << endl;
    cout << "The number of games lost is " << gamesLost << endl;
    cout << "The percent of games won is " << fixed << showpoint << setprecision(3) << percentWon << endl;
}

//Simulates the roll of a single die and returns the result
int roll()
{
    int rollResult = 0;
    rollResult = rand() % 6 + 1;
    return rollResult;
}

//Calls roll twice and returns the sum of the two results
int roll2Dice()
{
    //Declare variables for this function
    int rollOne = 0;
    int rollTwo = 0;
    int rollSum = 0;

    //Find rollOne and rollTwo
    rollOne = roll();
    rollTwo = roll();

    //Find rollSum
    rollSum = rollOne + rollTwo;

    return rollSum;
}

bool playCraps(int currentGame, bool detailPrint, char isBetting, int startingBet)
{
    bool crapsResult = NULL;
    int currentGameStorage[100];
    int currentRoll = 1;
    int point = roll2Dice();
    int printingNumber = 0;
    currentGameStorage[0] = point;
    if(point == 7 || point == 11)
    {
        crapsResult = true;
    }
    else if(point == 2 || point == 3 || point == 12)
    {
        crapsResult = false;
    }
    else
    {
        crapsResult = NULL;
    }
    while(crapsResult != true && crapsResult != false)
    {
        currentGameStorage[currentRoll] = roll2Dice();
        if(currentGameStorage[currentRoll] == point)
        {
            crapsResult = true;
        }
        else if(currentGameStorage[currentRoll] == 7)
        {
            crapsResult = false;
        }
        currentRoll += 1;
    }
    if(detailPrint == true)
    {
        cout << "Game " << currentGame << ": ";
        for(printingNumber = 0; printingNumber <= currentRoll; printingNumber += 1)
        {
            cout << currentGameStorage[printingNumber] << " ";
        }
        if(crapsResult == true)
        {
            cout << "win";
        }
        else if(crapsResult == false)
        {
            cout << "lose";
        }
        cout << endl;
    }
    return crapsResult;
}

int betting(int endingBet, bool crapsResult)
{
    if(crapsResult == true)
    {
        endingBet += 1;
    }
    else if(crapsResult == false)
    {
        endingBet -= 1;
    }
    return endingBet;
}

2 个答案:

答案 0 :(得分:3)

只是略读并且没有阅读所有代码(因此可能还有其他错误),但这一行肯定存在问题:

while(crapsResult != true && crapsResult != false)

crapsResult在逻辑上不可能同时 false,因此永远不会输入循环。

答案 1 :(得分:1)

我相信Turix得到了正确的错误,但我会把重点放在另一个地方:

bool crapsResult = NULL;

您正在尝试将crapsResult用于三个不同的值(truefalseNULL)。但是,NULL通常具有0的整数值,转换为布尔值false,因此永远不会输入您的循环。

然后第二个错误发挥作用:此时currentRoll1,因此您尝试将currentGameStorage的内容从索引0打印到1(包括),{{ 1}}尚未分配。这就是为什么你在输出中得到神秘的数字。这是一个普遍的错误:您的代码总是试图过多地打印一个项目。在循环头中使用currentGameStorage[1]代替<来修复:

<=