gpt4 book ai didi

c++ - 控制台 cout 动画 - C++

转载 作者:可可西里 更新时间:2023-11-01 12:00:27 28 4
gpt4 key购买 nike

我想为我 cout-ing 的 40x20 字符 block 制作动画。我想用 system("cls"); 清除控制台,然后立即出现下一个字符 block 。目前,下一个街区将采用打字机风格。

对于我的问题,最简单的答案就是立即输出一个 20 行 x 40 个字符的 oss stream cout,而不是像打字机那样处理。

主要.cpp:

    mazeCreator.cout();
Sleep(5000);
system("cls");

输出()

void MazeCreator::cout() {
char wallChar = (char) 219;
char pavedChar = (char) 176;
char lightChar = ' ';
char startChar = 'S';
char finishChar = 'F';
char errorChar = '!';
char removedWallChar = 'R';
char landmarkLocationChar = 'L';

ostringstream oss;
for (int row = 0; row < rows; row++) {
oss << " ";
for (int col = 0; col < columns; col++) {
if (mazeArray[row][col] == wall)
oss << wallChar;
else if (mazeArray[row][col] == paved)
oss << pavedChar;
else if (mazeArray[row][col] == light)
oss << lightChar;
else if (mazeArray[row][col] == start)
oss << startChar;
else if (mazeArray[row][col] == finish)
oss << finishChar;
else if (mazeArray[row][col] == removedWall)
oss << removedWallChar;
else if (mazeArray[row][col] == landmarkLocation)
oss << landmarkLocationChar;
else
oss << errorChar;
}
oss << "\n";
}
oss << "\n\n";

cout << oss.str();
}

最佳答案

您可以在代码中维护两个二维数组,一个包含屏幕上的当前字符 block (我们称之为 cur),另一个包含下一个 block (我们称之为 next )。

假设 cur 存储当前屏幕上的 block 。通过写入 next 数组来设置下一个 block 。当您准备好将其显示在屏幕上时,同时循环遍历 curnext仅针对不同的字符,使用 SetConsoleCursorPosition 跳转到该位置并写入新字符。

完成后,将 next 的内容复制到 cur 并继续下一个 block 。

更新:这是一个例子:

class console_buffer
{
public:
console_buffer(int rows, int columns)
// start out with spaces
: cur(rows, vector<char>(columns, ' ')),
next(rows, vector<char>(columns, ' '))
{
}

void sync()
{
// Loop over all positions
for (int row = 0; row < cur.size(); ++row)
for (int col = 0; col < cur[row].size(); ++col)

// If the character at this position has changed
if (cur[row][col] != next[row][col])
{
// Move cursor to position
COORD c = {row, col};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), c);

// Overwrite character
cout.put(next[row][col]);
}

// 'next' is the new 'cur'
cur = next;
}

void put(char c, int row, int col)
{
next[row][col] = c;
}
private:
vector<vector<char> > cur;
vector<vector<char> > next;
};

...

int main()
{
console_buffer buf(40, 20);

// set up first block
... some calls to buf.put() ...

// make first block appear on screen
buf.sync();

// set up next block
... some calls to buf.put()

// make next block appear on screen
buf.sync();

// etc.
}

关于c++ - 控制台 cout 动画 - C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10476550/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com