C++开发贪吃蛇时std::cout无法打印#字符构成的正方形地图问题
问题原因
核心问题是游戏主循环的判断条件在程序启动时直接不成立,地图绘制逻辑根本没有被执行:
- 你的
snakeGame类中gameOver成员默认初始值为true main函数的循环判断为while(!snake.gameOver),程序启动时!true计算结果为假,整个循环体(包含setup()、draw()调用)被直接跳过- 程序会直接运行到循环外,只打印
work!就退出,自然看不到地图输出。
还有个次要的缓冲问题:就算进入循环,draw()函数最后一行输出firstlast后没有换行、也没有手动刷新输出流,部分控制台环境下可能因为输出缓冲没刷新,看不到打印内容。
修复方法
- 把类成员中
gameOver的默认初始化值改为false,保证第一次循环判断能通过:
class snakeGame { public: // 原代码bool gameOver{true}; 修改为以下值 bool gameOver{false}; const int i_WIDTH = 20, i_HEIGHT = 20; int head_x, head_y, fruit_x, fruit_y, score; enum eDirection{ STOP = 0, RIGHT, UP, DOWN, LEFT }; eDirection dir; // 其余类成员保持不变 };
- 在
draw()函数末尾补全换行并刷新输出缓冲,保证内容立刻打印到控制台,同时让边框闭合更规范:
void snakeGame::draw(int ii_WIDTH, int ii_HEIGHT) { //system("clear"); //draw map std::string firstlast(ii_WIDTH + 2, '#'); std::string leftright = '#' + std::string(ii_WIDTH, ' ') + '#'; std::cout << firstlast << "\n"; for (int i = 0; i < ii_HEIGHT; ++i) std::cout << leftright << "\n"; std::cout << firstlast << "\n"; std::cout.flush(); }
- 规范标准库调用写法,避免没有声明
using namespace std;时的编译错误:
int main() { snakeGame snake; while(!snake.gameOver) { snake.setup(); snake.draw(20, 20); snake.input(); snake.logic(); } std::cout << "work!" << std::endl; return 0; }
修改完成后运行,就能正常看到由#组成的正方形地图边框。
内容的提问来源于stack exchange,提问作者Ok.
相关产品推荐
相关产品推荐

