如何更新Tic Tac Toe板而不打印多个板?

时间:2017-02-28 19:20:27

标签: c++

我一直试图用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循环更新板(清除整个屏幕以避免打印多个板)。

2 个答案:

答案 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库,它提供对整个终端屏幕的控制。