【问题标题】:ANSI C: Displaying frames of animation in terminal at constant FPSANSI C:在终端中以恒定 FPS 显示动画帧
【发布时间】:2016-01-12 23:28:52
【问题描述】:

我正在努力掌握如何解决如何在 C 中的终端中制作简单的 ASCII 动画的问题。

作为我的课堂作业,我需要用 C 语言制作简单的康威生活游戏。游戏“棋盘”将存储在一维数组中。行数和列数取自用户输入。我在终端中通过滚动显示它没有问题,但我希望它是正确的动画,没有终端滚动和显示垃圾(不是项目中的实际代码,只是试图解释)

void draw(int *board, rows, columns){
     for(int j =0; j < rows; j++){
          for(int i = 0; i < columns;i++){
               printf((*board+i));
          } printf("/n");
     }

/*****************************************************************      
Here I would like to have code that clears terminal screen , returns 
carriage to the begging so on the next call of function 
draw(int*board...) terminal windows is clear and next frame will be 
drawn without being garbage, as if it would be the first printf 
being called in this program, after waiting 33 miliseconds  ( sleep() ?)
******************************************************************/


runGame(); /* actual game code does game of life stuff in the array*/
}

经过多次尝试,我没有找到任何有用的东西或任何实际可行的东西。我不想使用 ncurses,因为这个项目需要尽可能精简和核心。

我不要求您为我编写代码! (太好了:P) 我只是想听听您的想法以及我应该使用什么功能来清除终端窗口等。

非常感谢:)

【问题讨论】:

  • “我不想使用 ncurses” - 好吧,这是您唯一明智的选择。如果您编写自己的终端例程,它将不再是“精益和核心”。终端库是完成这项工作的正确工具。
  • 我明白了。所以没有聪明的技巧可以在终端窗口中执行此操作,纯粹作为文本?什么都好。
  • 所有聪明的终端黑客都未能说明一个重要的观点。终端不止一个,它们“唤醒并关注”的角色略有不同,提供的功能也略有不同。所以,一个试图让它们都属于一个 api(诅咒)的库是明智的选择。

标签: c terminal ascii conways-game-of-life


【解决方案1】:

发现了一个巧妙的技巧! :D 回答我自己的问题有点愚蠢,但有人可能会从中受益。

printf("%c[2J%c[;H",(char) 27, (char) 27); 

此行清除光标前后的所有内容并将其放回 [0,0] 位置!

ASCII 有一些花哨的转义码,它们真的可以创造奇迹。当我找到控制刷新率的可靠方法时,我会更新这个答案。 http://www.termsys.demon.co.uk/vtansi.htm

编辑:usleep(33000) 完成这项工作。 Usleep() 需要微秒,乘以 1000 得到毫秒。

【讨论】:

  • 一点也不傻!您正在为知识库做出贡献,这就是 SO 的全部意义所在。你也可以接受你自己的答案:)
  • 很高兴您发布了答案,但需要明确的是,这些是 VT100 终端代码,而不是 ASCII 终端代码。如果有人使用非 VT100 终端,如果他们使用的终端兼容 VT100,它可能会工作。有些是,有些是“几乎”;但是,VT100 越来越老了。较新的终端(gnome-terminal)支持更多颜色和其他功能。最终它总是一个权衡,所以如果没有一个 100% 正确的解决方案,不要难过。
猜你喜欢
  • 2012-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-02
  • 1970-01-01
  • 2020-07-12
  • 1970-01-01
相关资源
最近更新 更多