C++如果访问语句,如果它们在内部循环 我在C++中写了蛇,我遇到了一些问题。我的打印板方法只是打印游戏的地图。它可以访问干净地图所在的阵列。但最重要的是,它检查电流场的坐标是否与食物坐标或蛇的身体坐标相同。显然,如果他们不是,它只会打印干净的字段。这里有一个问题,我能不能把最后一个循环内部的if语句连接到外部的if和else。现在它说没有先前的if声明 这是不正确的,因为即使在SnakeBody上找到了它,它也会打印空白字段。

C++如果访问语句,如果它们在内部循环 我在C++中写了蛇,我遇到了一些问题。我的打印板方法只是打印游戏的地图。它可以访问干净地图所在的阵列。但最重要的是,它检查电流场的坐标是否与食物坐标或蛇的身体坐标相同。显然,如果他们不是,它只会打印干净的字段。这里有一个问题,我能不能把最后一个循环内部的if语句连接到外部的if和else。现在它说没有先前的if声明 这是不正确的,因为即使在SnakeBody上找到了它,它也会打印空白字段。,c++,c++11,if-statement,console,C++,C++11,If Statement,Console,最简单的解决方法是,如果你已经打印或不打印,请保持跟踪: for(unsigned int j=0; j< BOARD_WIDTH; j++) { bool havePrinted = false; for(unsigned int z=0; z< player1._snakeBody.size(); z++) { if(j == player1._snakeBody.at(z).first && i == player1._snake

最简单的解决方法是,如果你已经打印或不打印,请保持跟踪:

for(unsigned int j=0; j< BOARD_WIDTH; j++) {
    bool havePrinted = false;
    for(unsigned int z=0; z< player1._snakeBody.size(); z++) {
        if(j == player1._snakeBody.at(z).first && i == player1._snakeBody.at(z).second) {
            havePrinted = true;
            std::cout<< "S";
        }
    }
    if(j ==_foodXcord && i == _foodYcord && !havePrinted) {
        std::cout<< "X";
        havePrinted = true;
    }
    if (!havePrinted) {
        std::cout << this->_board[i][j];
    }
}

更复杂的解决方案可能涉及重新考虑您的数据结构,这样当您查找电路板上某个位置的内容时,您就知道要打印什么。

如果您只是用适当的算法替换循环,那么您就可以很容易地使用If-else语句:

for(unsigned int i=0; i< BOARD_HEIGHT ; i++)
    {
        for(unsigned int j=0; j< BOARD_WIDTH; j++)
        {
            if (std::any_of(std::begin(player1._snakeBody), std::end(player1._snakeBody),
                            [&](auto snake) { return snake == {j, i};
                })
            {
                std::cout<< "S";
            }
            else if(j ==_foodXcord && i == _foodYcord)
            {
                std::cout<< "X";
            }
            else
            {
                std::cout << this->_board[i][j];
            }
        }
     }

这避免了必须使用bool标志,这是for循环所需要的。这还有一个优点,即在原始代码中使用break语句也可以完成的位置找到主体后立即中断。

另一种选择是使用中间缓冲区:

void Board::printBoard(Player player1)
{
    auto screen = this->_board; // assuming no C-array but std::vector or std::array

    for (auto pos : player1._snakeBody) {
        screen[pos.first][p.second] = 'S';
    }
    if (0 <= _foodYcord && _foodYcord < BOARD_HEIGHT
       && 0 <= _foodXcord && _foodXcord < BOARD_WIDTH) {
        screen[_foodYcord][_foodXcord] = 'X';
    }
    system("cls");
    for (unsigned int y = 0; y != BOARD_HEIGHT; ++y) {
        for (unsigned int x = 0; x != BOARD_WIDTH; ++x) {
            std::cout << screen[y][x];
        }
        std::cout << std::endl;
    }
}

即使没有合适的算法,创建子函数也能以同样的方式解决问题。@Jarod42是真的,但人们通常知道这种抽象,但并不真正了解算法,所以我想我只强调它的这一方面。
void Board::printBoard(Player player1)
{
    auto screen = this->_board; // assuming no C-array but std::vector or std::array

    for (auto pos : player1._snakeBody) {
        screen[pos.first][p.second] = 'S';
    }
    if (0 <= _foodYcord && _foodYcord < BOARD_HEIGHT
       && 0 <= _foodXcord && _foodXcord < BOARD_WIDTH) {
        screen[_foodYcord][_foodXcord] = 'X';
    }
    system("cls");
    for (unsigned int y = 0; y != BOARD_HEIGHT; ++y) {
        for (unsigned int x = 0; x != BOARD_WIDTH; ++x) {
            std::cout << screen[y][x];
        }
        std::cout << std::endl;
    }
}