【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

相关内容

热门资讯

我来教大家“欢欢麻将辅助器ap... 欢欢麻将这个游戏其实有挂的,确实是有挂的,需要了解加客服微信:【7198902】, 很多玩家在这款游...
我来教大家“天地游辅助器app... 我来教大家“天地游辅助器app官方下载最新版本更新”详细分享开挂;原来确实真的有挂(需添加指定薇71...
我来教大家“天天酒都辅助器ap... 亲,天天酒都这款游戏可以开挂的,确实是有挂的,。但是开挂要下载第三方辅助软件,天天酒都的开挂软件,名...
我来教大家“全民如意棋牌辅助器... 您好:全民如意棋牌确实真的有挂,软件加微信【7198902】确实是有挂的,很多玩家在这款游戏中打牌都...
我来教大家“??梦奇缘辅助器a... 您好,??梦奇缘这款游戏可以开挂的,确实是有挂的,需要了解加微{7198902}很多玩家在这款游戏中...
我来教大家“新老友茶馆辅助器a... 亲,新老友茶馆这款游戏可以开挂的,确实是有挂的,。但是开挂要下载第三方辅助软件,新老友茶馆的开挂软件...
我来教大家“乐友娱乐辅助器ap... 我来教大家“乐友娱乐辅助器app官方下载最新版本更新”详细分享开挂一、乐友娱乐AI软件牌型概率发牌机...
我来教大家“皮皮湖北麻将辅助器... 亲,皮皮湖北麻将这款游戏可以开挂的,确实是有挂的,。但是开挂要下载第三方辅助软件,皮皮湖北麻将的开挂...
我来教大家“潮汕馆辅助器app... 您好:潮汕馆确实真的有挂,软件加微信【7198902】确实是有挂的,很多玩家在这款游戏中打牌都会发现...
我来教大家“哈灵斗地主辅助器a... 我来教大家“哈灵斗地主辅助器app官方下载最新版本更新”详细分享开挂是一款可以让一直输的玩家,快速成...
我来教大家“潮流娱乐辅助器ap... 我来教大家“潮流娱乐辅助器app官方下载最新版本更新”详细分享开挂1、让任何用户在无需AI插件第三方...
我来教大家“科乐长春麻将辅助器... 我来教大家“科乐长春麻将辅助器app官方下载最新版本更新”详细分享开挂1、让任何用户在无需AI插件第...
我来教大家“乐悦扯旋辅助器ap... 亲,乐悦扯旋这款游戏可以开挂的,确实是有挂的,。但是开挂要下载第三方辅助软件,乐悦扯旋的开挂软件,名...
我来教大家“上品游戏辅助器ap... 我来教大家“上品游戏辅助器app官方下载最新版本更新”详细分享开挂;原来确实真的有挂(需添加指定薇7...
我来教大家“牛魔王正厅辅助器a... 我来教大家“牛魔王正厅辅助器app官方下载最新版本更新”详细分享开挂一、牛魔王正厅AI软件牌型概率发...
我来教大家“友乐广西麻将辅助器... 我来教大家“友乐广西麻将辅助器app官方下载最新版本更新”详细分享开挂;原来确实真的有挂(需添加指定...
我来教大家“五常填大坑辅助器a... 亲,五常填大坑这款游戏可以开挂的,确实是有挂的,。但是开挂要下载第三方辅助软件,五常填大坑的开挂软件...
我来教大家“好运大菠罗比鸡辅助... 亲,好运大菠罗比鸡这款游戏可以开挂的,确实是有挂的,。但是开挂要下载第三方辅助软件,好运大菠罗比鸡的...
我来教大家“星悦福建麻将辅助器... 我来教大家“星悦福建麻将辅助器app官方下载最新版本更新”详细分享开挂;原来确实真的有挂(需添加指定...
我来教大家“天地游辅助器app... 我来教大家“天地游辅助器app官方下载最新版本更新”详细分享开挂一、天地游AI软件牌型概率发牌机制”...