回复 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编辑过]
