| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4670 人关注过本帖, 1 人收藏
标题:求一个C语言的数字雨代码~来者不拒~
取消只看楼主 加入收藏
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
结帖率:99.25%
收藏(1)
已结贴  问题点数:100 回复次数:11 
求一个C语言的数字雨代码~来者不拒~
打算实现个数字雨效果~不过上网搜到的都是API或者MFC编程的~感觉这个工程比较大~为了弄这个感觉要弄到炸天了~有没有谁能弄一个参考样板出来~C语言~最好用图形库~来者不拒啊~
搜索更多相关主题的帖子: C语言 工程 最好 
2017-05-15 21:36
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 2楼 烟雨晨曦
终于简单用数组完成了规定数量的数字雨~等下我试试改用链表提高效率~谢啦~真的就几百行~~~~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-16 00:26
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
以下是方块雨部分的代码~
由于这只是游戏中其中一小部分的代码~所以看上去很多内容是不完整的~~~

有兴趣可以看看~

程序代码:
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编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-16 03:47
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
附加效果截图~

图片附件: 游客没有浏览图片的权限,请 登录注册

图片附件: 游客没有浏览图片的权限,请 登录注册

图片附件: 游客没有浏览图片的权限,请 登录注册

图片附件: 游客没有浏览图片的权限,请 登录注册

图片附件: 游客没有浏览图片的权限,请 登录注册


看上去好像很好玩的样子~实际上这还只是个界面而已~~~~~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-16 03:51
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 8楼 xzlxzlxzl
厉害了~~连速度因素也考虑进去了~高!~~~~

以下是引用xzlxzlxzl在2017-5-16 21:16:52的发言:

说好的数字雨,怎么变成方块雨了?不知道哪个老师教的说数组改为链表可提高效率。

21:30
计时开始,看多长时间做一个数字雨。


其实不一定~看你怎么处理~~~链表是把到达底部的元素删除~到时就不用搜索该元素了~因此能提高效率~~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-16 22:48
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 10楼 yangfrancis
好~来者不拒~~~~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-16 23:23
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 8楼 xzlxzlxzl
while((clock()-t)<100);
这个应该写到内循环外面吧~研究了一下~几乎都可以理解~不过感觉如果能对下落到目的地的雨点立即删除其光标则效果会更佳~就是挑剔一下哈~


[此贴子已经被作者于2017-5-17 03:52编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-17 02:37
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
打算好好研究这个数字雨~把8楼的代码改了一下顺便附上注释~

程序代码:
#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编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-17 03:27
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 10楼 yangfrancis
C++啊~~表示还没接触到呢~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-17 03:42
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 17楼 Emotiona
13楼的有注释~~~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-17 15:17
快速回复:求一个C语言的数字雨代码~来者不拒~
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.035910 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved