所以我试图在我的终端上显示游戏板并让玩家输入他们的下一步(在我的情况下是4行)。每次玩家输入时,我都会再次画板。
不幸的是,当单独插入每个角色的墙壁和游戏棋子时,您基本上可以看到我的慢速计算机如何逐个显示每个角色。
为了简化这里的事情,我假装我只想显示一大堆字符。我已经有大部分逻辑和输入正常工作,所以我是只是寻找优化。
所以这是我的第一种方法。只需完成循环并逐一打印即可。
// Rows
for(int x = 0; x < 10; x++) {
// Columns
for(int y = 0; y < 10; y++) {
// Note: to keep evererything neatly in-line, I'll just use if-statements
if((y % 3) == 0) printf(" ");
if((y % 3) == 1) printf("X");
if((y % 3) == 2) printf("O");
}
printf("\n"); // Add line-break at the end
}
所以我的猜测是,每次我调用printf
时,计算机都会相应地分析和编辑字符串,然后再将其打印到屏幕上。这可能是它如此缓慢的原因。 (如果我错了,请纠正我。)
作为第二种方法,我尝试在打印之前将所有字母保存在char数组中。
char text[500]; // Note: In my program I don't know how long the text is.
int index = 0;
// Rows
for(int x = 0; x < 10; x++) {
// Columns
for(int y = 0; y < 10; y++) {
if((y % 3) == 0) text[index] = ' '; // Set text index accordingly
if((y % 3) == 1) text[index] = 'X';
if((y % 3) == 2) text[index] = 'O';
index++; // Increase index
}
text[index] = '\n'; // Add line-break
index++;
}
text[index] = '\0'; // End of string
printf(text);
虽然起初有点压倒一切,但这段代码对我来说非常合适,并且实际上能够更快地打印字符串很多,很多。
问题在于(1)您很快就会失去对索引的追踪(因此调试真的很痛苦)而(2)你必须活着担心你的文字将超过500个字符(或者你只需要100个字符,浪费了大量的自由空间)。
我现在的问题是:是否有任何快速且更一致的方式在终端屏幕上显示信息?除了每轮显示游戏板外,我还可以删除最后几个字符吗?直到我找到需要编辑的作品?我可以冻结屏幕,直到内容准备好了吗?
对于那些感兴趣的人,这里(差不多)我的完整C代码:http://pastebin.com/Emffgsdd
答案 0 :(得分:1)
是的,每次都不是重绘所有内容,而是只能绘制更改(比如游戏中的新游戏元素)。挑战在于跟踪屏幕状态。
一个众所周知的终端库负责处理大部分问题,NCURSES。 Eric Raymond有一个很好的online book。