我正在用C ++编写Snake Game,以了解有关C ++的更多信息。我使用面向对象编程的范例制作了游戏,但是drawGame函数的设计无法正常工作。

测试drawGame函数,结果如下:

c++ - Snake游戏中drawGame函数的问题-LMLPHP

void Game::drawGame(int fruitxpos, int fruitypos, std::vector<int>& xposition, std::vector<int>& yposition, int snakesize){
    system("cls");
    int printedflag = 0;
    for(int j = 1; j <= ysize; j++){
        if(j == 1 || j == ysize){
            for(int i = 1; i <= xsize; i++){
                std::cout << "#";
            }
            std::cout << "\n";
        }
        else{
            for(int i = 1; i <= xsize; i++){
                if(i == 1 || i == xsize){
                    std::cout << "#";
                }
                else{
                    for(int n = 0; n <= snakesize; n++){
                        if(i == xposition[n] && j == yposition[n]){
                            std::cout << "o";
                            printedflag = 1;
                        }
                        else{
                            printedflag = 0;
                        }
                    }
                    if(!printedflag){
                        if(i == fruitxpos && j == fruitypos){
                            std::cout << "F";
                        }
                        else{
                            std::cout << " ";
                        }
                    }
                }
            }
            std::cout << "\n";
        }
    }
}


如您所见,它在每个蛇形块之后打印一个空白区域。有人可以解释我怎么了吗?

最佳答案

恕我直言,您的程序将使用2D字符矩阵会更好。您的主程序将写入矩阵。打印功能将打印矩阵。这样就不必担心必须在控制台上使用X,Y定位。

如果将矩阵设计为字符的{连续}数组,则可以为换行符添加额外的列。矩阵的最后一个单元格为nul字符“ \ 0”。这使您可以像打印一个长C样式字符串一样打印矩阵。

一些示例代码:

const unsigned int MAX_COLUMNS = 20U + 1U; // +1 column for newline
const unsigned int MAX_ROWS    = 20U;
char game_board[MAX_ROWS][MAX_COLUMNS];

void Clear_Board()
{
    // Fill the board with spaces (blanks).
    memset((char *) &game_board[0][0], ' ', sizeof(game_board));

    // Draw the top and bottom borders
    for (unsigned int column = 0; column < MAX_COLUMNS; ++column)
    {
        game_board[0][column] = '#';
        game_board[MAX_ROWS - 1][column] = '#';
    }

    // Draw the side borders
    const unsigned int LEFT_COLUMN = 0U;
    const unsigned int RIGHT_COLUMN = MAX_COLUMNS - 2U;
    const unsigned int NEWLINE_COLUMN = MAX_COLUMNS - 1U;
    for (unsigned int row = 0; row < MAX_ROWS; ++row)
    {
        game_board[row][LEFT_COLUMN] = '#';
        game_board[row][RIGHT_COLUMN] = '#';
        game_board[row][NEWLINE_COLUMN] = '\n';
    }

    // Set the terminating nul character
    game_board[MAX_ROWS - 1][MAX_COLUMNS - 1] = '\0';
}


印刷板:

std::cout << game_board;


要么

std::cout.write(&game_board[0][0], sizeof(game_board) - 1U); // Don't print terminating nul.


检查是否遇到水果

unsigned int snake_head_row = 10U;    // Example position.
unsigned int snake_head_column = 5u;
const char FRUIT_CHAR = 'F';
//...
if (game_board[snake_head_row][snake_head_column] == FRUIT_CHAR)
{
  //...
}


请注意,遇到的水果不需要打印。

恕我直言,您应该将蛇作为坐标(行,列)的容器。每个人体细胞都是容器中的一个物品。如果蛇长大,请将坐标附加到容器中。画蛇需要遍历容器,在适当的game_board位置放置蛇字符(然后画木板)。

游戏板可帮助记住蛇体和板上其他任何物品的位置。您可以使用控制台定位库,也可以将字符放在其坐标处。

关于c++ - Snake游戏中drawGame函数的问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57063718/

10-12 20:51