我一直试图用C ++制作Tic Tac Toe,我似乎无法弄清楚如何更新电路板而不再在新线上再次打印它(每次播放器移动一个新的电路板打印在前一个下面)。我找到的唯一解决方案是使用系统(“cls”),但这似乎不是一个最佳解决方案,因为该程序为用户提供了初始指令,我发现每次玩家移动时我都会重新打印(I不想清除整个屏幕)。我还读过'\ r'可以用来打印已经使用过的一行,但我不知道如何将它应用到我的程序中。
// This is the Tic Tac Toe board (this is declared in main())
std::string board[5][5] = {
{ " ", "|", " ", "|", " " },
{ "---", "-", "---", "-", "---" },
{ " ", "|", " ", "|", " " },
{ "---", "-", "---", "-", "---" },
{ " ", "|", " ", "|", " " },
};
// Update the board (this is part of a function which reads user input and changes 'board' accordingly.)
system("cls");
std::cout << "Tic Tac Toe v1.0\n";
std::cout << "Hi, This is my first C++ game!\nPress the corresponding key to mark a field in the board. X Begins.\n\n";
std::cout << " q | w | e\n ----------\n a | s | d\n ----------\n z | x | c\n\n";
for (int x = 0; x < 5; x++) {
for (int y = 0; y < 5; y++) {
std::cout << board[x][y];
}
std::cout << '\n';
}
“板”2D阵列保持Tic Tac Toe板的标志性数字符号形状,并且for循环更新板(清除整个屏幕以避免打印多个板)。
答案 0 :(得分:1)
这取决于您的操作系统。在Linux控制台上,您可以打印ASCII换页符'\L'
以清除屏幕,然后打印新板。用户只会看到更新的电路板,可能会有一些闪烁。您还可以使用ncurses
进行编译,以获得更高级的屏幕模式。
在Windows上,the code is a little more complicated.
您可能希望将此依赖于OS的代码包装在函数定义中,并在其源文件中使用#ifdef
块来为平台选择正确的代码。
答案 1 :(得分:0)
据我所知,使用标准的i / o操纵器,你只能使用你提到的'\r'
回车字符只删除你正在编写的当前行。只需将它放在要覆盖的行的开头并刷新输出,如下所示:
cout << "\r" << "Your string" << std::flush
但是一旦你插入一条新线,你就无法回去了。一个更复杂的解决方案,但适用于类似终端的游戏是使用Ncurses库,它提供对整个终端屏幕的控制。