回复 10楼 yangfrancis
好~来者不拒~~~~
[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
#include <stdio.h> #include <stdlib.h> #include <windows.h> #include <time.h> #include <conio.h> #define mm 200 //单位时间数字雨最大容量 #define u 0.33 //事件发生概率 #define sp 100 //单位时间 typedef struct datrain { char a; //数字雨储存信息 int x; //数字雨的横坐标 int y; //数字雨的纵坐标 int s; //数字雨下落速度 int sc; //当前执行帧数(相对于速度而言) }Datrain; void Set(Datrain* a); //初始化数字雨 void setCursor(int flg); //设置光标,flg=1:显示光标 flg=0:隐藏光标 void setLocate(int x,int y); //设置字符显示位置 int getkey(); //获得键值 int main() { int i=0; //下标信息兼循环变量 int j=0; //循环变量 int t=0; //时间变量 Datrain a[mm]={0}; //数字雨a结果体 Datrain b[mm]={0}; //数字雨b结构体 srand((unsigned)time(NULL)); //随机数初始化 setCursor(0); //关闭光标 while(getkey()!=27) //Esc键退出 { t=(int)clock(); //获取当前时间 for(i=0;i<mm&&a[i].a;i++); //获取空闲的结构体下标信息 if(i<mm) Set(&a[i]); for(i=0;i<mm;i++) { if (a[i].a==0) continue; if(b[i].a) //获取赋值的b结构体信息 { setLocate(b[i].x,b[i].y); //设置输出位置 printf(" "); //刷新当前数据(相当于删除光标) } b[i]=a[i]; //把a结构体的信息赋值给b setLocate(a[i].x,a[i].y); //设置输出位置 printf("%c",a[i].a); //输出字符信息 ++a[i].sc; //当前执行帧数+1 if(a[i].sc>a[i].s) //如果执行帧数大于设定帧数(相当于完成了一个动作--s相当于速度) { ++a[i].y; //当前光标的纵坐标+1 a[i].sc=0; //当前帧数清零 } if(a[i].y>23) //如果下落超出范围(23代表下落的最大高度) { setLocate(b[i].x,b[i].y); printf(" "); a[i].a=0; //从新把数字雨清零 } } while(((int)clock()-t)<sp); //缓冲输出时间 } return 0; } void setCursor(int flg) //设置光标,flg=1:显示光标 flg=0:隐藏光标 { HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE); //获取输出句柄 CONSOLE_CURSOR_INFO cursor_info={100,flg}; //获取光标信息参数 info={光标透明度百分比,是否显示光标}; SetConsoleCursorInfo(hOut,&cursor_info); //设置光标信息 } void setLocate(int x,int y) //设置字符显示位置 { HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE); //获取输出取句柄 COORD loc={x,y}; //获取坐标信息 SetConsoleCursorPosition(hOut,loc); //设置当前字符显示位置 } int getkey() //获得键值 { unsigned char a=0; //设定 int n=0; if(!kbhit()) //如果当前没有键盘信息输入 return 0; //则返回 a=getch(); //获取键盘信息 if(a>127) { n=a*256; a=getch(); } return n+=a; } void Set(Datrain* a) //初始化数字雨 { if (rand()/16383.0<1-u) return ; a->a=rand()%10+'0'; //赋予随机值 a->x=rand()%60+10; //行随机化 a->y=0; //从顶端开始 a->s=rand()%9+1; //表示下落速度(最大为1最小为1/8) a->sc=0; }
[此贴子已经被作者于2017-5-17 03:51编辑过]