我试图制作一个打印出网格的程序,并且给定x和y坐标会改变网格中的值。例如,如果用户输入X:0和Y:0,则会更改值' 9'在下面的图像中预定义的值(在这种情况下,我想将值9更改为0)。
我的问题是,是否可以更新控制台的输出,以便' 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;
答案 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;
};
答案 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阵列,然后重新打印。
希望它能起作用:)。