ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

贪吃蛇闪烁现象

2021-05-29 22:53:12  阅读:192  来源: 互联网

标签:20 函数 clock 打印 贪吃蛇 printf 现象 闪烁


界面效果:

界面闪烁的原因是“如果打印左上角第一个字符到打印右下角最后一个字符时间间隔超过20ms,就会闪烁”

打印背景:

法一:根据一个整型二维数组来判断打印方块或空格

BlackBlock整型字符串为:

 1 int BlackBlock[20][23] = {
 2     { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
 3     { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
 4     { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
 5     { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
 6     { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
 7     { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
 8     { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
 9     { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
10     { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
11     { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
12     { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
13     { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
14     { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
15     { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
16     { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
17     { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
18     { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
19     { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
20     { 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1 },
21     { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
22 };

打印的函数:

 1 void show1()
 2 {
 3     int i, j;
 4     while (1)
 5     {
 6         system("cls");        //清屏
 7         for (i = 0; i < 20; i++)
 8         {
 9             for (j = 0; j < 23; j++)
10             if (1 == BlackBlock[i][j])
11                 printf("█");
12             else
13                 printf("  ");
14             printf("\n");
15         }
16         Sleep(1000);    //时间间隔是1000ms,即1s,若无此函数则循环高速进行,不停闪烁
17     }
18 }
19     

这种方法,打印的背景闪烁很明显,很严重,用clock()函数测出每循环打印一次的时间:

 1 void show1()
 2 {
 3     int i, j;
 4     while (1)
 5     {
 6         start = clock();            //用clock()函数检测打印一次所需时间,测试后结果为24ms~53ms,超过20ms,人眼所能识别最小的时间间隔是20ms,所以会造成闪烁现象
 7         system("cls");
 8         for (i = 0; i < 20; i++)
 9         {
10             for (j = 0; j < 23; j++)
11             if (1 == BlackBlock[i][j])
12                 printf("█");
13             else
14                 printf("  ");
15             printf("\n");
16         }
17         stop = clock();
18         duration = ((double)(stop - start)) / CLK_TCK;
19         printf("duration = %lf\n", duration);
20         Sleep(1000);    //时间间隔是1000ms,即1s
21     }
22 }
用clock()函数检测打印一次所需时间,测试后结果为24ms~53ms,超过20ms,人眼所能识别最小的时间间隔是20ms,所以会造成闪烁现象
法二:直接打印字符串
字符串数组为:
 1 char BackGround[20][48] = {
 2     "███████████████████████\n",
 3     "█                                          █\n",
 4     "█                                          █\n",
 5     "█                                          █\n",
 6     "█                                          █\n",
 7     "█                                          █\n",
 8     "█                                          █\n",
 9     "█                                          █\n",
10     "█                                          █\n",
11     "█                                          █\n",
12     "█                                          █\n",
13     "█                                          █\n",
14     "█                                          █\n",
15     "█                                          █\n",
16     "█                                          █\n",
17     "█                                          █\n",
18     "█                                          █\n",
19     "█                                          █\n",
20     "█                                          █\n",
21     "███████████████████████\n"
22 };

显示的函数:
 1 void show2()
 2 {
 3     int i;
 4     while (1)
 5     {
 6         system("cls");
 7         for (i = 0; i < 20; i++)
 8             printf(BackGround[i]);
 9         Sleep(1000);
10     }
11     
12 }

这种方法打印的背景几乎看不到闪烁现象,也用clock()函数测出每循环打印一次的时间:

 1 void show2()
 2 {
 3     int i;
 4     while (1)
 5     {
 6         system("cls");
 7 
 8         ////用clock()函数检测打印一次所需时间,测试后结果为0ms~10ms,
 9         //且大多数情况下在0ms ~ 4ms,远小于20ms,所以几乎看不到闪烁现象
10         start = clock();    
11         for (i = 0; i < 20; i++)
12             printf(BackGround[i]);
13         stop = clock();
14         duration = ((double)(stop - start)) / CLK_TCK;
15         printf("duration = %lf\n", duration);
16         Sleep(1000);
17     }
18     
19 }
用clock()函数检测打印一次所需时间,测试后结果为0ms~10ms,
且大多数情况下在0ms ~ 4ms,远小于20ms,所以几乎看不到闪烁现象

法三:直接用一个一维字符数组存放法二中的所有字符串:
 1 char backGround[960] = {
 2     "███████████████████████\n"
 3     "█                                          █\n"
 4     "█                                          █\n"
 5     "█                                          █\n"
 6     "█                                          █\n"
 7     "█                                          █\n"
 8     "█                                          █\n"
 9     "█                                          █\n"
10     "█                                          █\n"
11     "█                                          █\n"
12     "█                                          █\n"
13     "█                                          █\n"
14     "█                                          █\n"
15     "█                                          █\n"
16     "█                                          █\n"
17     "█                                          █\n"
18     "█                                          █\n"
19     "█                                          █\n"
20     "█                                          █\n"
21     "███████████████████████\n"
22 };

显示的函数:

1 void show3()
2 {
3     while (1)
4     {
5         system("cls");
6         printf(backGround);
7         Sleep(1000);
8     }
9 }

法三的闪烁现象几乎看不到,这在法二的基础上又是一次改进和优化。

总结:各个函数的时间消耗主要在调用printf函数和打印字符,三种方法打印的字符都一样多,所以调用printf()的次数越少,则时间间隔越小,越优化,闪烁越不明显。






 

标签:20,函数,clock,打印,贪吃蛇,printf,现象,闪烁
来源: https://blog.51cto.com/u_14201949/2832033

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有