我正在用C ++编写Snake Game,以了解有关C ++的更多信息。我使用面向对象编程的范例制作了游戏,但是drawGame函数的设计无法正常工作。
测试drawGame函数,结果如下:
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/