【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

相关内容

热门资讯

美剧经典台词 美剧精选经典台词  在快速变化和不断变革的今天,能够利用到台词的场合越来越多,台词是一种特殊的,也是...
朗诵会主持词 关于朗诵会主持词4篇  主持词要根据活动对象的不同去设置不同的主持词。在当下这个社会中,很多场合都需...
记者节晚会主持词 记者节晚会主持词  主持词是主持人在台上表演的灵魂之所在。随着社会一步步向前发展,主持词的实用频率越...
婚礼父亲致辞 婚礼父亲致辞(精选15篇)  在平凡的学习、工作、生活中,大家肯定对各类致辞都很熟悉吧,致辞具有“礼...
校园红歌赛的主持词 校园红歌赛的主持词  主持词是主持人在节目进行过程中用于串联节目的串联词。在现今人们越来越重视活动氛...
开业主持词开场白 开业主持词开场白  根据活动对象的不同,需要设置不同的主持词。在当今社会生活中,活动集会越来越多,主...
关于唱歌比赛主持词   主持词是指主持人在主持节目的过程中进行节目串联的串联词,一般由开场白、中间部分与结束语组成。以下...
动漫感人台词 动漫感人台词(通用175句)  台词可以刻画人物的性格,表现人物的感情,加强剧情的表现力。那些广为流...
最新年会主持词 最新年会主持词(精选11篇)  契合现场环境的主持词能给集会带来双倍的效果。在如今这个时代,主持人的...
新生文艺汇演主持词 新生文艺汇演主持词  主持词要根据活动对象的不同去设置不同的主持词。在当今社会生活中,各种集会的节目...
家长代表幼儿园毕业典礼主持词 家长代表幼儿园毕业典礼主持词  主持词是各种演出活动和集会中主持人串联节目的串联词。在人们积极参与各...
学校元旦晚会主持词开场白和结... 学校元旦晚会主持词开场白和结束语  2017年元旦晚会主持词怎么写?怎么开场比较好呢?结束语又该怎么...
毕业晚会致辞 毕业晚会致辞(精选18篇)  在学习、工作或生活中,大家都写过致辞吧,致辞要求风格的雅、俗、庄、谐要...
幼儿园六一节目串词 幼儿园六一节目串词红黄蓝幼第一文库网儿园节目串词主持人(师):亲爱的家长朋友们( ):敬爱的老师们(...
祝寿主持词 祝寿主持词  主持词要尽量增加文化内涵、寓教于乐,不断提高观众的文化知识和素养。在人们积极参与各种活...
回门宴主持词 让你的回门宴顺... 回门宴主持词 让你的回门宴顺利完成  篇一:新婚回门宴主持词  亲爱的各位来宾,各位亲朋好友,先生们...
结婚新郎致辞 结婚新郎致辞(15篇)  在学习、工作、生活中,说到致辞,大家肯定都不陌生吧,致辞具有能伸能缩,可以...
庆中秋迎国庆联欢晚会主持词(...   (念8条短信)  男:我们的驻外营销健儿发来的每一条祝福都是那么的感人。由于时间关系,我们不能一...
重庆森林经典台词 重庆森林经典台词  《重庆森林》由两个基本不相干的故事构成。两个故事之间的关系,就像擦身而过的金城武...
歌曲奔跑主持词串词 歌曲奔跑主持词串词范文  借鉴诗词和散文诗是主持词的一种写作手法。在如今这个中国,主持成为很多活动不...