| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1471 人关注过本帖, 1 人收藏
标题:屏幕飘雪程序看过不少都是用数组实现的,我用链表写了一个给大家提供一个思 ...
只看楼主 加入收藏
znnwe
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2009-4-20
结帖率:0
收藏(1)
 问题点数:0 回复次数:14 
屏幕飘雪程序看过不少都是用数组实现的,我用链表写了一个给大家提供一个思路
#include <windows.h>
#include <stdlib.h>
#include <time.h>
#define D 1 //雪花下降速度
COLORREF snowcolor=0x2711EE; //雪花颜色
COLORREF snowcolor1=0x0000FF; //积雪颜色
int FENG;  //风向风速值
int MINX; //屏幕X坐标最大值
int MINY; //屏幕Y坐标最大值
////////////////////////////////////////////////////////////////////////////////
//获取屏幕分辨率
int getXY(int *MINX,int *MINY)
{
    HDC hdc=GetDC(NULL);
    int t=1;
    int x=600;
    int y=600;
    for(;t;)
    {
     if(GetPixel(hdc,x,100)==CLR_INVALID) t=0;
     x++;
     }
     t=1;
     for(;t;)
    {
     if(GetPixel(hdc,100,y)==CLR_INVALID) t=0;
     y++;
     }
     *MINX=x;
     *MINY=y;
     ReleaseDC(NULL, hdc);
}
//雪花点属性结构体
struct xue {
       int x;  //雪花的当前坐标点
       int y;
       COLORREF oldcolor; //当前雪花点的原始颜色值
       int del;    //是否删除该节点标志值不等于0则删除此节点
       int nextx;  //将要移动到的坐标点
       int nexty;
       int shudu;  //下降速度
       };
//雪花布局链表标准节点            
struct xhbiao {       //此结构体用于创建雪花的布局链表
       struct xue xh;
       struct xhbiao *next; //后继
       struct xhbiao *quet; //前驱
       };
//初始化单点雪花
int huaxue (struct xue *xuehua)  //函数功能是初始化一个新的雪花点
{
    HDC hdc=GetDC(NULL);
    xuehua->y=0;
    xuehua->x=(int)(rand()%MINX);
    xuehua->oldcolor=GetPixel(hdc,xuehua->x,xuehua->y);
    xuehua->shudu=(int)((rand()%10)*D+1);
    xuehua->del=0;
    ReleaseDC(NULL,hdc);
    return 0;
}
//创建链表
int link(struct xhbiao **tou,struct xhbiao **wei)
{
    struct xhbiao *p;
    p=(struct xhbiao*)malloc(sizeof(struct xhbiao));
    huaxue(&p->xh);
    p->next=NULL;
    p->quet=NULL;
    (*tou)=p;
    (*wei)=p;
    return 0;
}
//插入节点
int linkCHA(struct xhbiao **tou,struct xhbiao **wei)
{
    if((*tou)!=NULL)
    {
    struct xhbiao *p;
    p=(struct xhbiao*)malloc(sizeof(struct xhbiao));
    huaxue(&p->xh);
    p->next=NULL;
    p->quet=(*wei);
    (*wei)->next=p;
    (*wei)=p;
    }
    return 0;
}
//删除节点
int linkDEL(struct xhbiao *del)
{
    del->quet->next=del->next;
    del->next->quet=del->quet;
    free(del);
    return 0;
}
//维护雪堆链表清除需要删除的雪粒节点
int linkWUI(struct xhbiao **tou,struct xhbiao **wei)
{
    struct xhbiao *p;
    p=(*tou);
    for(;p!=NULL;)
    {
                       
     if(p->xh.del!=0)
     {                    
       if(p==(*tou))
       {                     
        (*tou)=p->next;
        p->next->quet=NULL;      
        free(p);
       }else if(p==(*wei))
             {
              (*wei)=p->quet;
              p->quet->next=NULL;
              free(p);
              }else {
                      linkDEL(p);
                     }               
     }   
     p=p->next;         
    }
    return 0;
}
//物理信息处理
int luoxue(struct xhbiao *tou,struct xhbiao *wei)
{
    struct xhbiao *p;  //处理雪花的物理动作
    p=tou;
    for(;p!=NULL;)
    {
     p->xh.nexty=p->xh.y+p->xh.shudu; //下降
     p->xh.nextx=p->xh.x+FENG; //(风向风速)
     p=p->next;
    }
    return 0;
}
//雪堆更新到屏幕
int xuehuagdi(struct xhbiao *tou,struct xhbiao *wei)
{
    HDC hdc=GetDC(NULL);
    COLORREF color,color1;
    int R,G,B,RGB;
    struct xhbiao *p1; //显示雪堆链表的数据
    p1=tou;
    for(;p1!=NULL;)
    {                              
    SetPixel(hdc,p1->xh.x,p1->xh.y,p1->xh.oldcolor);
    if((p1->xh.nexty<=MINY)&&(p1->xh.nextx>=0)&&(p1->xh.nextx<=MINX)) //超出屏幕边界则删除节点
    {
    color=GetPixel(hdc,p1->xh.nextx,p1->xh.nexty);
    if(color!=snowcolor)  //如果雪点下一个显示目标点与别的雪点重合则不处理等待维护函数删除此节点
    {
    color1=GetPixel(hdc,p1->xh.nextx,(p1->xh.nexty-1));
    B=abs((color>>16)&0xff-(color1>>16)&0xff);
    G=abs((color>>8)&0xff-(color1>>8)&0xff);
    R=abs((color)&0xff-(color1)&0xff);
    RGB=(R+G+B)/3;  //根据对比度判断是否堆积雪花
    if(RGB<50){                        
    p1->xh.oldcolor=color;                                                                                                                                                        
    SetPixel(hdc,p1->xh.nextx,p1->xh.nexty,snowcolor);
    p1->xh.x=p1->xh.nextx;
    p1->xh.y=p1->xh.nexty;
    }else if(RGB>50){
          SetPixel(hdc,p1->xh.nextx,(p1->xh.nexty-1),snowcolor1);
          p1->xh.del=1;
          }
    }else if(color==snowcolor){
          p1->xh.del=1;
          }  
    } else if((p1->xh.nexty>MINY)||(p1->xh.nextx<0)||(p1->xh.nextx>MINX)){
          p1->xh.del=1;
          SetPixel(hdc,p1->xh.x,p1->xh.y,p1->xh.oldcolor);
          }
    p1=p1->next;
    }  
    ReleaseDC(NULL,hdc);
    return 0;
}
/////////////////////////////////////////////////////////////////////////////////           
int WINAPI WinMain (HINSTANCE hThisInstance,
                    HINSTANCE hPrevInstance,
                    LPSTR lpszArgument,
                    int nFunsterStil)

{
  srand(time(NULL));                  
  struct xhbiao *tou,*p,*wei;  //tou为新建表的表头wei为表尾p为新节点的指针
  tou=NULL;
  wei=NULL;
  FENG=0;
  int i,j,k;
  k=0;
  ////////////////////////////////////////////////////////////////////////////////               
  MINY=1100;
  MINX=1300;
  link(&tou,&wei);
  for(i=0;i<=8;)
  {
  for(j=0;j<=k;j++)
  {
   linkCHA(&tou,&wei);                 
  }              
  luoxue(tou,wei);
  xuehuagdi(tou,wei);
  linkWUI(&tou,&wei);
  Sleep(30);
  k=rand()%22;
  }
    return 0;
}
搜索更多相关主题的帖子: include 分辨率 最大值 雪花 
2011-12-19 18:41
znnwe
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2009-4-20
收藏
得分:0 
欢迎大家来指点一下
2011-12-19 18:42
znnwe
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2009-4-20
收藏
得分:0 
工程打包附件已移至资源频道
方法方法方法方法方法

[ 本帖最后由 znnwe 于 2012-1-1 17:47 编辑 ]
2011-12-19 18:43
znnwe
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2009-4-20
收藏
得分:0 
用DEV编写程序只有7.5K
2011-12-19 18:45
小赵q1
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:4
帖 子:492
专家分:777
注 册:2011-8-26
收藏
得分:0 
写得不错,值得鼓励,我再学一个月也会达到这种程度的,你的代码我收藏了。哈哈
2011-12-20 18:31
离开天空的云
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:110
专家分:198
注 册:2011-8-12
收藏
得分:0 
...看不懂++
2011-12-20 19:23
烟雾中的迷茫
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
帖 子:621
专家分:1069
注 册:2011-2-9
收藏
得分:0 
为什么 都是小点的雪  为什么没有大点的
2011-12-20 20:17
znnwe
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2009-4-20
收藏
得分:0 
给你一个点你就能描绘整个世界,我的程序只是一个数据结构用于存储坐标点,至于你想画什么就随你了,都说了只是一个思路,比数组描述的更象一点
2011-12-23 16:14
znnwe
Rank: 1
等 级:新手上路
帖 子:17
专家分:0
注 册:2009-4-20
收藏
得分:0 
回复 6楼 离开天空的云
给你一个点你就能描绘整个世界,我的程序只是一个数据结构用于存储坐标点,至于你想画什么就随你了,都说了只是一个思路,比数组描述的更象一点
2011-12-23 16:15
有容就大
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:东土大唐
等 级:版主
威 望:74
帖 子:9048
专家分:14309
注 册:2011-11-11
收藏
得分:0 
楼主不好意思我复制黏贴后编译出N多错误?你调试通过了吗?

梅尚程荀
马谭杨奚







                                                       
2011-12-23 18:10
快速回复:屏幕飘雪程序看过不少都是用数组实现的,我用链表写了一个给大家提供一 ...
数据加载中...
 
   



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

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