【C 语言笔记】解决控制台闪烁/鬼畜/光标乱跑问题
创始人
2024-06-02 10:22:49
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

相关内容

热门资讯

心情也有颜色作文(推荐3篇) 心情也有颜色作文 篇一心情也有颜色有时候,我们会发现自己的心情和颜色有着奇妙的联系。不同的心情会赋予...
我和神笔马良的一天作文【优质... 我和神笔马良的一天作文 篇一在一个阳光明媚的早晨,我迫不及待地来到了神笔马良的工作室。这是一个充满创...
大智若愚小学作文(精选3篇) 大智若愚小学作文 篇一大智若愚小学作文大智若愚是一种非常有意思的格言。它告诉我们,虽然我们可能很聪明...
《一九四二》观后感500字(... 《一九四二》观后感500字 篇一电影《一九四二》是一部由冯小刚导演的历史题材电影,该片以中国抗日战争...
那次玩得真高兴作文【优秀6篇... 那次玩得真高兴作文 篇一我还记得那次玩得真高兴的经历。那是一个阳光明媚的周末,我跟一群好朋友一起去郊...
父亲节礼物小学作文【优质4篇... 父亲节礼物小学作文 篇一我的爸爸是一个很特别的人,每天都为我们全家付出很多,为了感谢爸爸的辛勤努力,...
我的成长小学作文500字【精... 我的成长小学作文500字 篇一我的成长小学时光在我的记忆中,小学时光是我成长的起点。那段充满童真和欢...
成都歌【优质3篇】 成都歌 篇一成都歌:一首独特的城市之歌成都歌是一首由陈一发儿演唱的歌曲,歌词中充满了对成都这座城市的...
屈原的作文【最新6篇】 屈原的作文 篇一屈原是中国古代文学史上的一位伟大诗人,他的作品充满了激情和深情。他的《离骚》被誉为中...
我喜欢的小动物作文【经典6篇... 我喜欢的小动物作文 篇一我喜欢的小动物是仓鼠。仓鼠是一种可爱的小动物,它们有着圆圆的眼睛和毛茸茸的身...
秋游的小学作文350字【通用... 秋游的小学作文350字 篇一秋游的快乐今天,我们小学的同学们进行了一次秋游活动。我非常期待这次秋游,...
新学期的打算小学作文500字... 新学期的打算小学作文500字 篇一新学期的打算新学期开始了,我制定了一些打算,希望能够在新的学期里有...
写运动会的作文450字【通用... 写运动会的作文450字 篇一欢乐的运动会今天是我们学校的运动会,同学们都兴高采烈地来到操场,迎接这一...
咱们班的淘气包小学作文(经典... 咱们班的淘气包小学作文 篇一咱们班的淘气包我班有一个淘气包,他叫小明。他是一个活泼好动的男孩,总是闯...
小学秋作文(精选6篇) 小学秋作文 篇一温暖的秋天秋天是一个美丽而温暖的季节。在秋天里,大自然的色彩变得丰富多彩,仿佛给大地...
冬季运动会优秀作文(最新6篇... 冬季运动会优秀作文 篇一冬季运动会中的快乐与收获冬季运动会是我们学校最受期待的盛事之一。今年,我有幸...
参观烈士陵园小学作文【精彩3... 参观烈士陵园小学作文 篇一今天,我们班级去参观了烈士陵园小学。这是一个位于城市郊区的学校,学校的名字...
一件新鲜事小学作文400字【... 一件新鲜事小学作文400字 篇一第一篇内容:捡到一只流浪猫今天放学后,我在回家的路上捡到了一只可爱的...
一年级小作文有哪些(精彩6篇... 一年级小作文有哪些 篇一在一年级的学习生活中,小朋友们开始接触到一些简单的写作训练,这些小作文既能帮...
绿荷叶,雨中晃小学作文【实用... 绿荷叶,雨中晃小学作文 篇一在小学的校园里,有一个独特的景色,那就是雨中的绿荷叶。每当雨水来临的时候...