C ++更新控制台输出

时间:2017-03-15 10:48:30

标签: c++ console output

我试图制作一个打印出网格的程序,并且给定x和y坐标会改变网格中的值。例如,如果用户输入X:0和Y:0,则会更改值' 9'在下面的图像中预定义的值(在这种情况下,我想将值9更改为0)。

enter image description here

我的问题是,是否可以更新控制台的输出,以便' 0' 0会覆盖' 9'没有再打印出整个网格。我希望能够多次这样做。

如果无法做到这一点,我该如何按照我实施的方式打印更新的网格?如果我将显示网格 for loop 放在一个单独的函数中,我需要将2d数组作为参数调用,我相信你不能这样做。

这就是我所拥有的:

void generateGrid(int diff){
        srand(time(NULL));
        int arr[maximum][maximum];
            for (int i=0;i<diff;i++)
        {
            for (int j=0;j<diff;j++)
            {
                arr[i][j] = rand() % 9 + 1;
            }
        }
        cout<<"\n\tPuzzle\n\t";
            for(int i=0;i<diff;i++)
            {
                cout<<i<<" ";
            }
                cout<<"\n\n";
            for(int i=0;i<diff;i++)
            {
                cout<<i<<"\t";
                for(int j=0;j<diff;j++)
                {
                    cout<<arr[i][j]<<" ";
                }
                    cout<<"\n";
            }
       int x, y;
        cout<<"\nEnter x value: ";
        cin>>x;
        cout<<"Enter y value: ";
        cin>>y;
        arr[x][y] = 0;
    }

Diff指的是拼图大小(难度)

其他地方:

int easy = 5;
int medium = 8;
int hard = 10;
int maximum = 10;

4 个答案:

答案 0 :(得分:1)

标准C ++不支持在控制台中的位置设置单个字符而无需重新打印。这是特定于操作系统的,并且有评论可以解决这个问题。

否则,正确的解决方案是将游戏板逻辑封装到一个类中。我们可以使用嵌套的IF来处理动态大小的板,并提供获取和设置单元的功能。单独的$showNextMonthFunction功能允许我们按照我们的意愿将电路板打印到控制台。

std::vector

现在你可以这样写Print

class Grid
{
    public:
    Grid(int size) : myGrid(size, std::vector<int>(size, 0)) // initialize grid to be correctly sized and all zeros
    {
       Randomize();
    }

    void Randomize()
    {
        for (size_t i=0;i<myGrid.size();i++)
        {
            for (size_t j=0;j<myGrid[i].size();j++)
            {
                myGrid[i][j] = rand() % 9 + 1;
            }
        }
    }

    void Print(std::ostream& out) const
    {
        out<<"\n\tPuzzle\n\t";
        for(size_t i=0;i<myGrid.size();i++)
        {
           out<<i<<" ";
        }
        out << "\n\n";
        for(size_t i=0;i<myGrid.size();i++)
        {
            out<<i<<"\t";
            for(size_t j=0;j<myGrid[i].size();j++)
            {
                out<<myGrid[i][j]<<" ";
            }
            out<<"\n";
        }
    }

    int GetValue(size_t row, size_t col) const
    {
        // use wraparound for too-large values
        // alternatively you could throw if row and/or col are too large
        return myGrid[row % myGrid.size()][col % myGrid.size()];
    }

    void SetValue(size_t row, size_t col, int val)
    {
        myGrid[row % myGrid.size()][col % myGrid.size()] = val;
    }

    private:
    std::vector<std::vector<int>> myGrid;         
};

Live Demo

答案 1 :(得分:0)

不,单独输出到“cout”屏幕不允许您任意更改屏幕内容。

最简单的方法是在每次移动后重绘整个游戏板。

要将终端用作窗口,您必须使用像“curses”这样的库,它将了解您的终端(包括它使用的控制代码以及它的大小)

例如,请参阅http://hughm.cs.ukzn.ac.za/~murrellh/os/notes/ncurses.html

答案 2 :(得分:0)

如果您的控制台支持ANSI escape codes,您可以上传多行并重新打印它们,例如: G。像这样:

printf("hello\n");
printf("\x1b[A"); // you can add the number of lines: "\x1b[7A"
printf("hola \n");

这适用于大多数Linux shell,但是,在Win10之前不支持它。

答案 3 :(得分:0)

只需使用system(“ cls”);

然后更新2D阵列,然后重新打印。

希望它能起作用:)。