| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 4573 人关注过本帖, 1 人收藏
标题:求一个C语言的数字雨代码~来者不拒~
只看楼主 加入收藏
九转星河
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
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
收藏
得分:0 
回复 14楼 九转星河
其实我也没接触过标准c的图形编程

还可以给下落的数字加上一点偏移量。范围控制在-0.4*速度 ~ 0.4*速度。效果也是不错的,我曾用来做过雪景
2017-05-17 10:12
yangfrancis
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:贵宾
威 望:141
帖 子:1510
专家分:7661
注 册:2014-5-19
收藏
得分:0 
回复 14楼 九转星河
不对哦。感觉你早就会这种了啊。像putimage这种函数晚生还是从你的帖子里偷学的。
2017-05-17 10:19
Emotiona
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:311
专家分:581
注 册:2017-3-7
收藏
得分:0 
回复 8楼 xzlxzlxzl
看不懂,怎么办
2017-05-17 14:59
九转星河
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
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
想不到今晚晚上8点有数字雨网上公开课~有没有有兴趣去听一下的~看情况再发网址~不过估计是MFC或者API的编程~反正我就没啥时间去听了~继续完善那个通用链表转置和排序部分~然后加入消灭星星工程里面~到时候代码就突破1500行了~初步估计勉强可以玩的代码规模在2000行左右~还有很大完善空间~

PS~估计没有人会回~想不到具体内容是数字雨为封面的屏保~

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


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-17 17:14
xzlxzlxzl
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:湖北
等 级:贵宾
威 望:125
帖 子:1091
专家分:5825
注 册:2014-5-3
收藏
得分:0 
回复 18楼 九转星河
1,while((clock()-t)<100);的确应该下移一行到for循环外面,当时心里是这样想的,循环层多了就混了,为尽快提交代码,没仔细看运行情况,谢谢提醒!
2,变量j是多余定义的。没有说明数组b[mm]的用途,其实这个数组可以不需要,那样就需要多写几行代码。
3,非要迷信链表效率高,就像说通过地址总线直接访问的内存效率低于闪存一样好笑,或者说串行总线效率高于并行总线(排除电气参数不一致的干扰)。在某些情况下使用链表有一定长处(如适用某些特定算法、内存消耗不确定),但设计游戏的一定是在指定的区域下(二维数组)渲染图形最快速、高效。//我所理解的效率:以最少的动作获得最快解决问题的速度
2017-05-17 20:58
快速回复:求一个C语言的数字雨代码~来者不拒~
数据加载中...
 
   



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

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