| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4738 人关注过本帖, 1 人收藏
标题:求一个C语言的数字雨代码~来者不拒~
只看楼主 加入收藏
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
结帖率:99.25%
收藏(1)
已结贴  问题点数:100 回复次数:22 
求一个C语言的数字雨代码~来者不拒~
打算实现个数字雨效果~不过上网搜到的都是API或者MFC编程的~感觉这个工程比较大~为了弄这个感觉要弄到炸天了~有没有谁能弄一个参考样板出来~C语言~最好用图形库~来者不拒啊~
搜索更多相关主题的帖子: C语言 工程 最好 
2017-05-15 21:36
烟雨晨曦
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:7
帖 子:150
专家分:599
注 册:2017-3-5
收藏
得分:20 
这个类似打字游戏之前写过,用MFC写的,好久不碰了,VC,MFC都忘了,说下流程。
1.定义显示多少列
2.定义显示数字数组
3.定义一个屏幕显示多少个点
4.定义点结构体x,y,val
5.定义一个记录点的链表
6.随机数字数组每秒产生一个数字,随机放到某一列,放入链表。(大于允许显示点数则不产生数字)
7.遍历链表,将点的Y值加加(加多少自己定)
8.当点的y值大于多少时(自己定),去掉该点
9.遍历链表输出显示  循环6~9
流程大概就是这样了,代码大概就几百行吧。


2017-05-15 23:18
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
收藏
得分:20 
回复 2楼 烟雨晨曦
看不懂, 功力还不够深厚, 加油
2017-05-15 23:59
九转星河
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
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:20 
说好的数字雨,怎么变成方块雨了?不知道哪个老师教的说数组改为链表可提高效率。

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

[此贴子已经被作者于2017-5-16 21:24编辑过]

2017-05-16 21:16
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:0 
22:05 勉强算完成,数字掉啊掉的,运行就知道了,不放效果图
程序代码:
#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);
        }
    }
}
2017-05-16 22:05
九转星河
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
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
收藏
得分:20 
//粗制一个
#include<graphics.h>
#include<conio.h>
#include<time.h>
const short S=10;const short SPEED=10;
class Digit
{
private:
    char dgt[2];
    /*位置*/
    short x;
    short y;
    IMAGE img;//保存被遮的背景
public:
    short spd;
    Digit(char num,short xx,short yy):x(xx),y(yy)
    {
        dgt[0]=num;dgt[1]='\0';
        getimage(&img,x,y,S*2,S*2);//保存背景
        spd=SPEED+rand()%12;
    }
    Digit()
    {
        dgt[0]='0'+rand()%10;dgt[1]='\0';
        x=50+rand()%350;  y=rand()%100;//根据需要自行设计坐标
        getimage(&img,x,y,S*2,S*2);//保存背景
        spd=SPEED+rand()%12;
    }
    void Repos(short xx,short yy){x=xx;y=yy;}
    void Print()
    {
        settextstyle(S*2,S,"Times New Roman");
        outtextxy(x,y,dgt);
    }
    void GetImg()
    {
        getimage(&img,x,y,S*2,S*2);//保存背景
    }
    void Erase()
    {
        putimage(x,y,&img);//恢复背景
    }
    short GetX(){return x;}
    short GetY(){return y;}
    void SetX(short xx){x=xx;}
    void SetY(short yy){y=yy;}
};
int main()
{
    int i;
    initgraph(600,400);
    getch();
    srand((unsigned short)time(0));
    Digit d[10];
    while(!kbhit())
    {
        for(i=0;i<10;i++)
            if(d[i].GetY()>400)
                d[i].SetY(1);
        for(i=0;i<10;i++)
            d[i].Erase();
        for(i=0;i<10;i++)
            d[i].SetY(d[i].GetY()+d[i].spd);
        for(i=0;i<10;i++)
            d[i].GetImg();
        for(i=0;i<10;i++)
            d[i].Print();
        Sleep(150);
    }
    closegraph();
    return 0;
}
2017-05-16 22:54
快速回复:求一个C语言的数字雨代码~来者不拒~
数据加载中...
 
   



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

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