C ++在循环迭代后不再调用函数调用

时间:2017-04-24 15:55:54

标签: c++ function loops function-call

嘿所以我是编程的初学者。我试图在2D阵列上创建一个非常简单的扫雷游戏,我遇到的问题是在玩家踩到我的游戏之后(游戏结束)他们可以再次玩游戏。在此之后,设置难度函数应该被第二次调用(因为它在循环内)并且将生成新的雷区。不幸的是,这一切都没有发生,程序会跳过这个过程。 这是我的代码:

#include <iostream>
#include <string>
#include <cstdlib>
#include <ctime>

using namespace std;

int choose_difficulty(int x);
int generator();

int main()
{
    //create initial variables
    string Ans;
    int Rounds;
    int NewPosition_x = 0;
    int NewPosition_y = 0;

    //ask user if he wants to run the program and expect input
    cout << "Would you like to play a game? Y/N" << endl;
    cin >> Ans;

    //based on user input the program will run or not
    if (Ans == "Y" || "y") {

        while (Ans == "Y" || "y")
        {
    //Create position variables to be checked
            int Position_x;
            int Position_y;
            //ask user how many rounds in the game they want
            cout << "How many chances do you want to give yourself?" << endl;
            cin >> Rounds;

//Generate minefield could not be done as separate function since you cannot output an array
                int a = choose_difficulty(a);
                int mines;
                int n,m;

                srand (time (0));

                if(a == 0) {
                    mines = 3;
                    n = 4;
                    m = n;
                }
                else if (a == 1){
                    mines = 5;
                    n = 4;
                    m = n;
                }
                else if (a == 2){
                    mines = 7;
                    n = 4;
                    m = n;
                }
                int minefield[n][m] = { };
                int g, h;

                for (int num = 0; num < mines; num++) {
                    g = rand()%n;
                    h = rand()%n;

                    minefield[g][h] = 1;
                }

            for (int x = 0; x < Rounds; x++)
            {
                //Begin Game
                cout << "Where are you at to avoid the mines? (Enter a 2 numbers 0 through 3)" << endl;
                cin >> NewPosition_x >> NewPosition_y;

                //check if the player has entered a new position
                while (NewPosition_x == Position_x && NewPosition_y == Position_y) {
                    cout << "You have to move somewhere, put a valid location" << endl;
                    cin >> NewPosition_x >> NewPosition_y;
                }
                //check to see if that position is valid
                while ((NewPosition_x < 0 || NewPosition_x > 3) || (NewPosition_y < 0 || NewPosition_y > 3)) {
                    cout << "I'm sorry, but that place doesn't exist. Try somewhere else" << endl;
                    cin >> NewPosition_x >> NewPosition_y;
                }
                //Assign Player Position and check position vs mines
                Position_x = NewPosition_x;
                Position_y = NewPosition_y;
                if (minefield[Position_y][Position_x] == 1) {
                    cout << "You stepped on a mine, Game Over" << endl;

                    cout << "You minefield was this:" << endl;
                    for (int i=0; i < n; i++){
                    for (int j=0; j < n; j++){
                            cout << minefield[i][j] << "\t";
                            }
                        cout << endl;
                    }
                    cout << "Would you like to play again? Y/N" << endl;
                    cin >> Ans;
                    if (Ans == "n" || Ans == "N"){
                        return 0;
                    }
                }
                else if ((minefield[Position_x + 1][Position_y] == 1) || (minefield[Position_x - 1][Position_y] == 1) || (minefield[Position_x][Position_y + 1] == 1) || (minefield[Position_x][Position_y - 1] == 1)) {
                    cout << "You're hot right now, you better watch your step. Continue to the next round" << endl;
                }
                else {
                    cout << "You're safe. Continue to the next round" << endl;
                }
            }
        }
    }
return 0;
}

int choose_difficulty(int a)
{
    do{
        string difficulty;

        //Difficulty Selection
        cout << "Choose the game difficulty: Easy, Medium, Hard" << endl;
        cin >> difficulty;

        if (difficulty == "easy" || difficulty == "Easy"){
            a = 0;
        }
        else if (difficulty == "medium" || difficulty == "Medium"){
            a = 1;
        }
        else if (difficulty == "hard" || difficulty == "Hard"){
            a = 2;
        }
        else {
            cout << "Invalid input";
            a = 3;
        }
    }while (a == 3);

    return a;
}

1 个答案:

答案 0 :(得分:2)

你应该小心这种错误:

//based on user input the program will run or not
    if (Ans == "Y" || "y") {

        while (Ans == "Y" || "y")
        {

上面的内容总是如此,“ y ”与0(假)不同。

相反,您需要以这种方式检查Ans是否等于“ Y ”或“ y ”:

//based on user input the program will run or not
    if (Ans == "Y" || Ans == "y") {

        while (Ans == "Y" || Ans == "y")
        {

或者根据评论中的建议使用std::toupper()

更新

您的缓冲区似乎有问题,您应该使用cin.ignore()来清理它;