【C 语言 笔记】解决控制台闪烁/鬼畜/光标乱跑问题
创始人
2024-06-01 19:43:22
0

问题

如果你要在控制台里“画”一些频繁更新的东西,比如做个小游戏,常见的思路是:

while(1)
{//先清空system("clear");//再画printf(".....");
}

然后控制台的就闪个不停,很瞎眼。

解决 0

降低刷新频率,能明显缓解问题。
也就是

#include  //需要这个文件头
while(1)
{//先清空system("clear");//再画printf(".....");//延时Sleep(100);
}

解决 1

不要清空整个屏幕,只更新必要的部分。
利用 coino.hgotoxy 函数,可以移动光标的位置,这样就可以做到只修改某行某列的字符了。
(如果用 visual studio,可以参考 https://zhuanlan.zhihu.com/p/460165739)

例如,地图 + 玩家,地图一般都是静态的,所以只用在开头的时候画一遍,后面人物移动就只更新人物即可。

画地图();
while(1)
{if(玩家移动()){gotoxy(玩家新x, 玩家新y);putchar('我');//玩家原来的位置要恢复gotoxy(玩家旧x, 玩家旧y);putchar(地图上这一格对应的字符);}
}

解决 2

直接覆写或输出空格来实现“清屏”,尽量避免使用 system("cls")
或者说是“部分清屏”。

改变思想:在计算机里,不需要的东西没必要一定丢掉清空,可以直接用新的覆盖上去。

解决 3

取消自动刷新缓冲区,然后手动刷新缓冲区。
这个可以解决光标鬼畜到处跑的问题,尤其是你的 gotoxy 用的比较多的时候这个问题比较明显。

while(1)
{setvbuf(stdout, NULL, _IOFBF, 4096); // 1:修改刷新模式为手动刷新//然后画你要画的东西printf("...");fflush(stdout); // 2:清空并输出缓冲区的内容setvbuf(stdout, NULL, _IOLBF, 4096); // 3:刷新模式改回去
}

相当于原来是一行一行显示,改了之后就是一整块一整块显示。
原来每显示一行光标移一下,就造成了乱跑的问题。

(当然,你也可以选择直接隐藏光标)

源代码

int main()
{while (1){system("cls");printf("%d\n", rand());printf("%d\n", rand());printf("%d\n", rand());printf("%d\n", rand());printf("%d\n", rand());printf("%d\n", rand());}return 0;
}

1


降低刷新率:


int main()
{while (1){system("cls");printf("%d\n", rand());printf("%d\n", rand());printf("%d\n", rand());printf("%d\n", rand());printf("%d\n", rand());printf("%d\n", rand());Sleep(100);}return 0;
}

2


改用 gotoxy 和直接覆盖:
(注意!延时没了)

int main()
{while (1){gotoxy(0, 0);printf("%d", rand());printf("         \n"); //因为数字长度不一样,所以用空格覆盖掉上次比这次长的部分printf("%d", rand());printf("         \n");printf("%d", rand());printf("         \n");printf("%d", rand());printf("         \n");printf("%d", rand());printf("         \n");printf("%d", rand());printf("         \n");}return 0;
}

3


手动刷新缓冲区:

int main()
{while (1){setvbuf(stdout, NULL, _IOFBF, 4096);gotoxy(0, 0);printf("%d", rand());printf("         \n");printf("%d", rand());printf("         \n");printf("%d", rand());printf("         \n");printf("%d", rand());printf("         \n");printf("%d", rand());printf("         \n");printf("%d", rand());printf("         \n");fflush(stdout);setvbuf(stdout, NULL, _IOLBF, 4096);}return 0;
}

4

相关内容

热门资讯

怎样激活安卓系统软件 亲爱的手机控们,你是否曾因为安卓系统的种种限制而感到烦恼?别急,今天就来给你支几招,让你的安卓手机焕...
安卓系统root用什么软件,利... 你有没有想过,你的安卓手机其实可以拥有超能力?没错,就是那种传说中的“root”权限!一旦你的手机拥...
安卓系统改app语言,轻松实现... 你是不是也和我一样,在使用安卓手机的时候,突然发现某个APP的语言设置不是我们熟悉的中文呢?别急,今...
安卓系统插件透明度,打造个性化... 你有没有发现,手机里的安卓系统越来越智能了?这不,最近我发现了一个超酷的功能——安卓系统插件透明度。...
安卓系统数据如何清除掉,安卓系... 手机里的安卓系统数据积累得越来越多,是不是感觉手机越来越慢,运行起来像蜗牛一样?别急,今天就来教你怎...
安卓原生系统怎么回退 手机用久了,是不是觉得安卓原生系统越来越不适应了呢?有时候,我们可能因为系统更新或者误操作,想要回到...
黑苹果安卓子系统冲突,黑苹果安... 亲爱的果粉们,你是否在享受着黑苹果的优雅与安卓系统的便捷时,突然遇到了一些小麻烦?没错,说的就是那让...
安卓系统数次停止运行,探究原因... 手机突然卡壳,安卓系统又停止运行了?别急,让我带你一探究竟,揭开这个让人头疼的小麻烦背后的秘密。安卓...
安卓系统wps使用教程,轻松掌... 你有没有发现,安卓手机上的办公软件越来越强大了?WPS Office就是其中的佼佼者,它不仅功能全面...
安卓系统在哪里降级,揭秘降级路... 你有没有发现,手机用久了,有时候安卓系统就像老牛拉车,慢吞吞的,让人有点抓狂?别急,今天就来给你揭秘...
安卓系统照片视频模糊,安卓系统... 手机里的照片和视频突然变得模糊不清,这可真是让人头疼的问题啊!你有没有遇到过这种情况呢?别急,今天就...
安卓系统跨国聊天软件,安卓系统... 你有没有想过,在这个信息爆炸的时代,我们竟然可以通过手机与世界各地的人聊天呢?没错,就是那种跨国界的...
汽车安卓系统root权限获取,... 你有没有想过,你的汽车安卓系统其实也可以像智能手机一样,拥有超级权限呢?没错,今天就要来聊聊这个神奇...
安卓系统电话怎么拉黑,安卓系统... 你是不是也遇到过那种让人头疼的电话骚扰?别急,今天就来教你怎么在安卓系统里拉黑那些讨厌的家伙。想象当...
安卓手机系统可以互通吗,畅享无... 你有没有想过,你的安卓手机上的应用和数据,是不是可以像魔法一样,在其他安卓手机上无缝对接呢?今天,就...
安卓系统版本测评在哪里,从初代... 你有没有想过,你的安卓手机里那些系统版本,它们其实就像是一群小精灵,各有各的魔法和特点呢?想知道它们...
鸿蒙系统和安卓传文件,跨平台文... 你有没有想过,手机里的文件怎么传来传去呢?今天,咱们就来聊聊鸿蒙系统和安卓传文件这件事儿。你知道吗,...
悟空系统和安卓区别,系统内核差... 你知道吗?在手机操作系统这个江湖里,最近可是有两股势力在暗中较量,它们就是悟空系统和安卓。这两位“大...
东芝电视安卓系统版本,功能升级... 你有没有发现,家里的电视越来越智能了?这不,最近我在研究东芝电视的安卓系统版本,发现了一些有趣的事情...
dell属于安卓系统吗,安卓系... 你有没有想过,那个我们日常办公、娱乐都离不开的Dell笔记本电脑,它到底是不是安卓系统的呢?这个问题...