求一个C语言的数字雨代码~来者不拒~
打算实现个数字雨效果~不过上网搜到的都是API或者MFC编程的~感觉这个工程比较大~为了弄这个感觉要弄到炸天了~有没有谁能弄一个参考样板出来~C语言~最好用图形库~来者不拒啊~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
void Del_Clum(PClum* p) { PClum pt=(*p)->prior; pt->next=(*p)->next; if ((*p)->next!=NULL) (*p)->next->prior=pt; Free_Node((void** )p); } void Link_Clum(PClum p1,PClum p2) { if (p1==NULL||p2==NULL) return ; p1->next=p2; p2->prior=p1; } void Show_Init_Map() //初始特效设计 { COLORREF re_linecolor=getlinecolor(); COLORREF bgcolor=TRANSPARENT; Game_Start=false; int widht=(BOX2_WIDTH)/(MAP_SIZE); //Main盒子的宽 int height=(BOX2_HEIGHT)/(MAP_SIZE); //Main盒子的高 int i=0; int j=0; int t=0; int show_Map[(BOX2_WIDTH)/(MAP_SIZE)*(BOX2_HEIGHT)/(MAP_SIZE)]={0}; int temp_Map[(BOX2_WIDTH)/(MAP_SIZE)*(BOX2_HEIGHT)/(MAP_SIZE)]={0}; int show_Map2[(BOX2_WIDTH)/(MAP_SIZE)*(BOX2_HEIGHT)/(MAP_SIZE)]={0}; //记录数据纵坐标 Map_Data show[(BOX2_WIDTH)/(MAP_SIZE)*(BOX2_HEIGHT)/(MAP_SIZE)]={0}; PClum head=NULL; //头节点 PClum end=NULL; //尾节点 for (i=0;i<widht*height;++i) temp_Map[i]=i; for (i=0,t=widht*height;i<widht*height;i++,t--) //生成方块数量的随机数 { int s=rand()%t; show_Map[i]=temp_Map[s]; show_Map[i]%=widht; for (j=s;j<t-1;++j) temp_Map[j]=temp_Map[j+1]; } setlinecolor(bgcolor); Creat_Node((void** )&head,sizeof(Clum)); //创建头节点 Creat_Node((void** )&end,sizeof(Clum)); //创建尾节点 Link_Clum(head,end); for (t=0;t<widht*height;++t) //初始化方块数据 { show[t].color=Map[widht-show_Map2[show_Map[t]]++-1][show_Map[t]].color; //获取初始化方块颜色 show[t].x=show_Map[t]; //获取方块下落的横坐标 } memset(show_Map2,0,sizeof(show_Map2)); //重置数组 for (t=0;t<widht*height;++t) { PClum pclum=end->prior; PClum pt=NULL; PClum ps=head; Creat_Node((void** )&pt,sizeof(Clum)); pt->map_data=show[t]; Link_Clum(pclum,pt); //链接两个节点 Link_Clum(pt,end); BeginBatchDraw(); while ((ps=ps->next)&&(ps!=end)) { int left=Box_Main.point.left+ps->map_data.x*MAP_SIZE; //获取方块的顶点信息 int top=Box_Main.point.top+ps->map_data.y*MAP_SIZE; int right=left+MAP_SIZE; int bottom=top+MAP_SIZE; if (ps->map_data.y>0) { setfillcolor(bgcolor); fillrectangle(left,top-MAP_SIZE,right,bottom-MAP_SIZE); } setfillcolor(ps->map_data.color); //设置方块颜色 fillrectangle(left,top,right,bottom); //填充方块颜色 Draw_Line_Rectangle //绘制边框信息 ( Box_Main.point.left, Box_Main.point.top, Box_Main.point.left+Box_Main.width, Box_Main.point.top+Box_Main.height, Box_Main.color.line_color, bgcolor ); if (ps->map_data.y<widht-show_Map2[ps->map_data.x]-1) ++ps->map_data.y; else { show_Map2[ps->map_data.x]++; PClum pt=ps->prior; Del_Clum(&ps); ps=pt; } } EndBatchDraw(); //结束批量绘图 Sleep(FALL_TIME); //缓冲时间 } Free_Node((void** )&head); //释放头节点 Free_Node((void** )&end); //释放尾节点 Data.timer.TIME_START=clock(); //游戏时间重新开始 FlushMouseMsgBuffer(); //清理鼠标缓冲区 }
[此贴子已经被作者于2017-5-16 03:52编辑过]
#include <stdio.h> #include <stdlib.h> #include <windows.h> #include <time.h> #include <conio.h> #define mm 200 struct datrain { char a; int x,y,s,sc; }; void setCursor(int flg) { //设置光标,flg=1:显示光标 flg=0:隐藏光标 HANDLE hOut=GetStdHandle(STD_OUTPUT_HANDLE); CONSOLE_CURSOR_INFO cursor_info={100,flg}; 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; int n=0; if(!kbhit())return 0; a=getch(); if(a>127) { n=a*256; a=getch(); } n=n+a; return n; } void main() { int i,j,t; struct datrain a[mm],b[mm]; for(i=0;i<mm;i++)a[i].a=b[i].a=0; //初始化数据 srand(clock()); //随机数初始化 setCursor(0); //关闭光标 while(getkey()!=27) //Esc键退出 { t=clock(); for(i=0;i<mm&&a[i].a;i++); if(i<mm&&rand()%3==0) { a[i].a=rand()%10+'0'; a[i].x=rand()%60+10; a[i].y=0; a[i].s=rand()%9+1; a[i].sc=0; } for(i=0;i<mm;i++) { if(b[i].a) { setLocate(b[i].x,b[i].y); printf(" "); } b[i]=a[i]; if(a[i].a) { setLocate(a[i].x,a[i].y); printf("%c",a[i].a); } a[i].sc++; if(a[i].sc>a[i].s) { a[i].y++; if(a[i].y>23)a[i].a=0; a[i].sc=0; } while((clock()-t)<100); } } }