c++ 在终端的特定部件上打印

ddrv8njm  于 2022-12-24  发布在  其他
关注(0)|答案(2)|浏览(145)

因此,我的大学作业,我们应该做一个简单的游戏2D map与实体等,所以我想出了一种方法打印Map,通过它的尺寸和文本格式,但在我们的教训,它没有提到我们如何打印终端的特定部分。我已经检查了相同的问题,但似乎不能得到一个解决方案。
这是我用来打印Map和制作它的数组的代码。BLUE_B,STANDARD_B,OUTLINE and GREEN_B是为了丰富色彩而声明的。另外,如果可能的话,我不想使用操作系统特定的命令,除非它是完全必要的。我使用Windows的VS代码,用g++编译WSL Ubuntu-20.04

for (int row = 0; row < i; row++) {
  cout << OUTLINE "##";
  for (int column = 0; column < j; column++) {
    int n = rand() % 10; // According to "rand()"'s value we print either green, blue, or trees
    if (n >= 3) { // We've assigned more values to green, in order to be more possible to be printed
      cout << GREEN_B "  "
      STANDARD_B;
      map[row][column] = 1;
    } else if (n == 0 || n == 1) {
      cout << BLUE_B "  "
      STANDARD_B;
      map[row][column] = 0;
    } else if (n == 2) {
      int tree = rand() % 2;
      cout << TREES "<>"
      STANDARD_B;
      map[row][column] = 0;
    }

  }
  cout << OUTLINE "##"
  STANDARD_B << endl;
}

for (i = 0; i < j + 2; i++) { // Bottom map border printing
  cout << OUTLINE "##"
  STANDARD_B;
}
34gzjxbg

34gzjxbg1#

如果我没理解错的话,你可能在寻找iomanip。这只是一种方法。你可以使用setwsetfill在不同的区域放置不同的文本。你可以为不同的输出设置不同的选项。

pvabu6sv

pvabu6sv2#

要将文本光标移动到特定的行和列,您需要一个“gotoxy”样式的函数。
以下是在Linux终端Windows终端上都可以使用的功能。(如果没有额外的初始化帮助,它不能 * 在Windows控制台**上使用。)

#include <iostream>

const char * CSI = "\033[";

void gotoxy( int x, int y )
{
  std::cout << CSI << (y+1) << ";" << (x+1) << "H";
}

终端UL角的坐标为(0,0)。下面是一个使用示例:

// continuing from above

#include <string>

int main()
{
  // Clear a 40 x 10 box
  for (int y = 0;  y < 10;  y++)
  {
    gotoxy( 0, y );
    std::cout << std::string( 40, ' ' );
  }
  
  // Draw our centered text
  gotoxy( 14, 5 );
  std::cout << "Hello there!";
  
  // Go to bottom of box and terminate
  gotoxy( 0, 10 );
  std::cout.flush();
}

为了你的游戏

我建议你把光标移到HOME(0,0),然后在每一帧中画出你的游戏板的“改变”部分。
我想,如果你在本地电脑上,你的游戏板相对简单,你 * 可以 * 可能逃脱一个完整的重绘每一帧...
你确定没有教授提供的宏或命令来移动光标吗?(...因为他提供了魔术宏来改变输出颜色)?

相关问题