当前位置:首页 » 编程语言 » c语言下雪效果
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

c语言下雪效果

发布时间: 2022-07-28 00:25:29

1. c语言能实现页面下雪代码吗

可以是肯定的
代码如下:
#include<graphics.h>
#include<stdlib.h>
#include<time.h>

main()
{
int gdrive,gmode;

gdrive=DETECT;
initgraph(&gdrive,&gmode,"D:\\tc20\\BGI");/*D:\\tc20\\BGI改成自己tc下的BGI路径,不然不能实现*/

setbkcolor(BLACK);/*Set black backgroud color.*/
setwritemode(1); /*set XOR write mode.*/
thunder();
closegraph();
}

int thunder()
{
time_t st,et;
int i,j,x,y,rnd;
int snows[300][2],a;

srand(time(NULL));
/*initialize.*/
for(i=0;i<300;i++)
{
rnd=rand();
if(rnd<0) rnd=0;
x=rnd%400+50;

rnd=rand();
if(rnd<0) rnd=0;
y=rnd%300+50;
snows[i][0]=x;
snows[i][1]=y;
}

/* Last 30 seconds.*/
st=time(NULL);
et=st;
a=2;
setcolor(WHITE);

for(i=0;i<300;i++)
{
line(snows[i][0]-a,snows[i][1]-a,snows[i][0]+a,snows[i][1]+a);
line(snows[i][0]-a,snows[i][1],snows[i][0]+a,snows[i][1]);
line(snows[i][0]-a,snows[i][1]+a,snows[i][0]+a,snows[i][1]-a);
line(snows[i][0],snows[i][1]+a,snows[i][0],snows[i][1]);
line(snows[i][0],snows[i][1],snows[i][0],snows[i][1]);
}

while((et-st)<60L)
{
/*Erase it.*/
for(i=0;i<300;i++)
{
line(snows[i][0]-a,snows[i][1]-a,snows[i][0]+a,snows[i][1]+a);
line(snows[i][0]-a,snows[i][1],snows[i][0]+a,snows[i][1]);
line(snows[i][0]-a,snows[i][1]+a,snows[i][0]+a,snows[i][1]-a);
line(snows[i][0],snows[i][1]+a,snows[i][0],snows[i][1]);
line(snows[i][0],snows[i][1],snows[i][0],snows[i][1]);
}

/*Delay.*/
for(i=0;i<1000;i++)
{
for(j=0;j<1000;j++)
;
}

/*Fall off.*/
for(i=0;i<300;i++)
{
/*Disturb.*/
rnd=rand();
if(rnd<0) rnd=0;
rnd=rnd%4;
if(rnd%2==0) rnd=-rnd;
snows[i][0]+=rnd;
snows[i][1]+=2;

if(snows[i][1]>349)
{
/*Generate it.*/
rnd=rand();
if(rnd<0) rnd=0;
x=rnd%400+50;

rnd=rand();
if(rnd<0) rnd=0;
y=rnd%300+50;
snows[i][0]=x;
snows[i][1]=y;
}
/*Show it.*/

line(snows[i][0]-a,snows[i][1]-a,snows[i][0]+a,snows[i][1]+a);
line(snows[i][0]-a,snows[i][1],snows[i][0]+a,snows[i][1]);
line(snows[i][0]-a,snows[i][1]+a,snows[i][0]+a,snows[i][1]-a);
line(snows[i][0],snows[i][1]+a,snows[i][0],snows[i][1]);
line(snows[i][0],snows[i][1],snows[i][0],snows[i][1]);

}

et=time(NULL);
}
}

2. 如何用C语言实现“池塘夜降彩色雨”

用C是比较麻烦的
需要图形接口。
可以用VC/VS的自带图形库
也可以用TC2.0的graphic接口。
或者使用第三方库。

初始化图形接口后
在屏幕上打随机的彩色点,实现下降效果即可。

3. 怎么用C语言写下雪的动画效果

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<time.h>

/*
*清除屏幕的shell命令/控制台命令,还有一些依赖平台的实现
*如果定义了__GNUC__就假定是使用gcc编译器,为Linux平台
*否则认为是Window平台
*/
#ifdefined(__GNUC__)
//下面是依赖Linux实现
#include<unistd.h>
#definesleep_ms(m)
usleep(m*1000)

//向上移动光标函数Linux
staticvoid__curup(intheight)
{
inti=-1;
while(++i<height)
printf("33[1A");//先回到上一行
}
#else

//创建等待函数1s60帧相当于16.7ms=>1帧,我们取16ms
//咱么的这屏幕推荐1s25帧吧40ms
//这里创建等待函数以毫秒为单位,需要依赖操作系统实现
#include<Windows.h>
#definesleep_ms(m)
Sleep(m)

//向上移动光标
staticvoid__curup(intheight)
{
COORDcr={0,0};
//GetStdHandle(STD_OUTPUT_HANDLE)获取屏幕对象,设置光标
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),cr);
}
#endif/*__GNUC__跨平台的代码都很丑陋*/

//定义初始屏幕的宽高像素宏
#define_INT_WIDTH(100)
#define_INT_HEIGHT(50)
//屏幕刷新帧的速率
#define_INT_FRATE(40)
//雪花飘落的速率,相对于屏幕刷新帧的倍数
#define_INT_VSNOW(10)

/*
*错误处理宏,msg必须是""括起来的字符串常量
*__FILE__:文件全路径
*__func__:函数名
*__LINE__:行数行
*__VA_ARGS__:可变参数宏,
*##表示直接连接,例如a##b<=>ab
*/
#definecerr(msg,...)
fprintf(stderr,"[%s:%s:%d]"msg" ",__FILE__,__func__,__LINE__,##__VA_ARGS__);

/*
*屏幕结构体,具有宽高
*frate:绘制一帧的周期,单位是毫秒
*width:屏幕的宽,基于窗口的左上角(0,0)
*height:屏幕的高
*pix:用一维模拟二维主要结构如下
*0001001010
*0101010120
*...
*=>0表示没像素,1表示1个像素,2表示2个像素....
*/
structscreen{
intfrate;//也可以用unsigned结构
intwidth;
intheight;
char*pix;
};

/*
*创建一个屏幕结构指针返回
*
*intfrate:绘制一帧的周期
*intwidth:屏幕宽度
*intheight:屏幕高度
*return:指向屏幕结构的指针
**/
structscreen*screen_create(intfrate,intwidth,intheight);

/*
*销毁一个屏幕结构指针,并为其置空
*structscreen**:指向屏幕结构指针的指针,二级销毁一级的
**/
voidscreen_destory(structscreen**pscr);

/**
*屏幕绘制函数,主要生成一个雪花效果
*
*structscreen*:屏幕数据
*return:0表示可以绘制了,1表示图案不变
*/
intscreen_draw_snow(structscreen*scr);

/**
*屏幕绘制动画效果,绘制雪花动画
*
*structscreen*:屏幕结构指针
*/
voidscreen_flash_snow(structscreen*scr);

//主函数,主业务在此运行
intmain(intargc,char*argv[])
{
structscreen*scr=NULL;

//创建一个屏幕对象
scr=screen_create(_INT_FRATE,_INT_WIDTH,_INT_HEIGHT);
if(NULL==scr)
exit(EXIT_FAILURE);

//绘制雪花动画
screen_flash_snow(scr);

//销毁这个屏幕对象
screen_destory(&scr);

return0;
}

/*
*创建一个屏幕结构指针返回
*
*intfrate:绘制一帧的周期
*intwidth:屏幕宽度
*intheight:屏幕高度
*return:指向屏幕结构的指针
**/
structscreen*
screen_create(intfrate,intwidth,intheight)
{
structscreen*scr=NULL;

if(frate<0||width<=0||height<=0){
cerr("[WARNING]checkisfrate<0||width<=0||height<=0err!");
returnNULL;
}

//后面是为scr->pix分配的内存width*height
scr=malloc(sizeof(structscreen)+sizeof(char)*width*height);
if(NULL==scr){
cerr("[FATALG]Outofmemory!");
returnNULL;
}
scr->frate=frate;
scr->width=width;
scr->height=height;
//减少malloc次数,malloc消耗很大,内存泄露呀,内存碎片呀
scr->pix=((char*)scr)+sizeof(structscreen);

returnscr;
}

/*
*销毁一个屏幕结构指针,并为其置空
*structscreen**:指向屏幕结构指针的指针,二级销毁一级的
**/
void
screen_destory(structscreen**pscr)
{
if(NULL==pscr||NULL==*pscr)
return;
free(*pscr);
//避免野指针
*pscr=NULL;
}

//构建开头的雪花,下面宏表示每_INT_SHEAD个步长,一个雪花,需要是2的幂
//static可以理解为private,宏,位操作代码多了确实难读
#define_INT_SHEAD(1<<2)
staticvoid__snow_head(char*snow,intlen)
{
intr=0;

//数据需要清空
memset(snow,0,len);
for(;;){
//取余一个技巧2^3-1=7=>111,并就是取余数
intt=rand()&(_INT_SHEAD-1);
if(r+t>=len)
break;
snow[r+t]=1;
r+=_INT_SHEAD;
}
}
#undef_INT_SHEAD

//通过上一个scr->pix[scr->width*(idx-1)]=>scr->pix[scr->width*idx]
//下面的宏规定雪花左右摇摆0向左一个像素,1表示不变,2表示向右一个像素
#define_INT_SWING(3)
staticvoid__snow_next(structscreen*scr,intidx)
{
intwidth=scr->width;
char*psnow=scr->pix+width*(idx-1);
char*snow=psnow+width;
inti,j,t;//i索引,j保存下一个瞬间雪花的位置,t临时补得,解决雪花重叠问题


//为当前行重置
memset(snow,0,width);
//通过上一次雪花位置计算下一次雪花位置
for(i=0;i<width;++i){
for(t=psnow[i];t>0;--t){//雪花可以重叠
//rand()%_INT_SWING-1表示雪花横轴的偏移量,相对上一次位置
j=i+rand()%_INT_SWING-1;
j=j<0?width-1:j>=width?0:j;//j如果越界了,左边越界让它到右边,右边越界到左边
++snow[j];
}
}
}

/**
*屏幕绘制函数,主要生成一个雪花效果
*
*structscreen*:屏幕数据
*return:0表示可以绘制了,1表示图案不变
*/
int
screen_draw_snow(structscreen*scr)
{
//静态变量,默认初始化为0,每次都共用
staticint__speed=0;
intidx;

if(++__speed!=_INT_VSNOW)
return1;

//下面就是到了雪花飘落的时刻了既__speed==_INT_VSNOW
__speed=0;

//这里重新构建雪花界面,先构建头部,再从尾部开始构建
for(idx=scr->height-1;idx>0;--idx)
__snow_next(scr,idx);

//构建头部
__snow_head(scr->pix,scr->width);

return0;
}

//buf保存scr中pix数据,构建后为(width+1)*height,后面宏是雪花图案
#define_CHAR_SNOW‘*‘
staticvoid__flash_snow_buffer(structscreen*scr,char*buf)
{
inti,j,rt;
intheight=scr->height,width=scr->width;
intfrate=scr->frate;//刷新的帧频率

//每次都等一下
for(;;sleep_ms(frate)){
//开始绘制屏幕
rt=screen_draw_snow(scr);
if(rt)
continue;

for(i=0;i<height;++i){
char*snow=scr->pix+i*width;
for(j=0;j<width;++j)
buf[rt++]=snow[j]?_CHAR_SNOW:‘‘;
buf[rt++]=‘ ‘;
}
buf[rt-1]=‘‘;

//正式绘制到屏幕上
puts(buf);

//清空老屏幕,屏幕光标回到最上面
__curup(height);
}
}
#undef_CHAR_SNOW

/**
*屏幕绘制动画效果,绘制雪花动画
*
*structscreen*:屏幕结构指针
*/
void
screen_flash_snow(structscreen*scr)
{
char*buf=NULL;
//初始化随机数种子,改变雪花轨迹
srand((unsigned)time(NULL));

buf=malloc(sizeof(char)*(scr->width+1)*scr->height);
if(NULL==buf){
cerr("[FATAL]Outofmemory!");
exit(EXIT_FAILURE);
}

__flash_snow_buffer(scr,buf);

//1.这里理论上不会执行到这,没加控制器.2.对于buf=NULL,这种代码可以省掉,看编程习惯
free(buf);
buf=NULL;
}

4. C语言程序设计

用flash就行啊,真是的...

5. 怎么用c写 下雨或下雪的 程序

初始化
void Init_Data()
{
int i;
for( i=0; i< POINT; i++)
{
Snow[i].x=0;
Snow[i].y=0;
Snow[i].size=0;
}
for( i=0; i<MaxX; i++)
Map[i]=MaxY;
}
显示:
void MakeSnow()
{
int i;
if( CurSnow>=POINT ) return;
for( i=0; Snow[i].size; i++ )
;
CurSnow++;
Snow[i].x=random(MaxX);
Snow[i].y=random(DOWNSPEED);
Snow[i].size=random(MaxSize)+1;

}
设定显示坐标
void ShowSnow( int x, int y, int size, int flag )
{
int color=0;

if ( flag ) color=15;
switch( size )
{
case 1:
putpixel( x, y, color );
break;
case 2:
setcolor( color );
line( x-1, y-1, x+1, y+1 );
line( x-1, y+1, x+1, y-1 );
break;
case 3:
setcolor( color );
line( x-1, y-1, x+1, y+1 );
line( x-1, y+1, x+1, y-1 );
/*
line( x-2, y-2, x+2, y+2 );
line( x-2, y+2, x+2, y-2 );*/

line( x-2, y, x+2, y );
line( x, y-2, x, y+2 );
break;
}

}
雪花移动效果:
void Move( int n, int tox, int toy )
{
int x, y, size, i, j;
float person;

x=Snow[n].x;
y=Snow[n].y;
size=Snow[n].size;
/* check end */
j=y;
if( x<tox )
{
person=(DOWNSPEED *1.0) / ( tox-x )*1.0;
for( i=x; i<=tox; i++ )
{
if( j>=Map[i] )
{
tox=i-size;
break;
}
j+=(int)( (i-x+1)*person );
}
}
else if( x>tox )
{
person=(DOWNSPEED *1.0) / ( x-tox )*1.0;
for( i=x; i>=tox; i-- )
{
if( j>=Map[i] )
{
tox=i+size;
break;
}
j+=(int)( (x-i+1)*person );
}
}

if( y+DOWNSPEED>=Map[tox] )
{
switch( size )
{
case 1:
Map[x]--;
break;
case 2:
Map[x]-=2;
if( x>0 && Map[x-1]>Map[x] ) Map[x-1]=Map[x];
if( x<MaxX-1 && Map[x+1]>Map[x] ) Map[x+1]=Map[x];
break;
case 3:
Map[x]-=3;
if( x>1 && Map[x-2]>Map[x] ) Map[x-1]=Map[x];
if( x>0 && Map[x-1]>Map[x] ) Map[x-1]=Map[x];

if( x<MaxX-2 && Map[x+2]>Map[x] ) Map[x+1]=Map[x];
if( x<MaxX-1 && Map[x+1]>Map[x] ) Map[x+1]=Map[x];
break;
}
CurSnow--;
y=Map[x]+size;
Snow[n].x=x;
Snow[n].y=y;
Snow[n].size=0;
}
else /* not end */
{
Snow[n].x=tox;
Snow[n].y=toy;
}
}

6. C语言程序设计,下雪动画程序答辩老师会问什么问题

就加两个函数有那么困难吗?一个可以找到指定que的test结构进行修改edit,一个可以增加新的test数据append’一个删除指定que号的delete不就得了。

7. 急用C语言的雪花代码 请高手指教谢谢了~~!

# include <dos.h> # include <time.h> # include <conio.h> # include <stdio.h> # include <stdlib.h> # include <graphics.h> struct Snow //雪的结构体 { int x; int y; int size; int speed; }snow[200]; int snownum=0; //初始化雪花数量 void *save1,*save2,*save3,*save4; //储存各个元素 void Copy() //储存元素主程序 { setcolor(0); setfillstyle(1,15); fillellipse(200,200,2,2); //大雪花 fillellipse(200,210,2,1); //中雪花 fillellipse(210,200,1,1); //小雪花 save1=malloc(imagesize(196,196,204,204)); //储存大雪花 save2=malloc(imagesize(196,196,204,204)); //储存中雪花 save3=malloc(imagesize(196,196,204,204)); //储存小雪花 save4=malloc(imagesize(196,196,204,204)); //储存背景色的图块 getimage(196,196,204,204,save1); getimage(196,208,204,212,save2); getimage(208,198,212,202,save3); getimage(96,96,104,104,save4); cleardevice(); } void DrawSnow() //下雪主程序 { int i; randomize(); while(!kbhit()) { if(snownum!=120) //初始设置雪花属性 { snow[snownum].speed=2+random(3); snow[snownum].x=20+random(600); snow[snownum].y=0; snow[snownum].size=random(3); snownum++; } for(i=0;i<snownum;i++) putimage(snow[i].x,snow[i].y,save4,0); for(i=0;i<snownum;i++) { snow[i].y+=snow[i].speed; switch(snow[i].size) //选择下落的雪花大小 {case 0: putimage(snow[i].x,snow[i].y,save1,0); break; case 1: putimage(snow[i].x,snow[i].y,save2,0); break; case 2: putimage(snow[i].x,snow[i].y,save3,0); break; } if(snow[i].y>500) //雪花落下后重新计算雪花属性 { snow[i].speed=3+random(3); snow[i].x=20+random(600); snow[i].y=0; snow[i].size=random(3); } } delay(5000); } } void main() {int driver=DETECT,mode; initgraph(&driver,&mode,""); Copy(); DrawSnow(); }

8. 求一个用c语言制作的下雪程序(非c++)

SendMessage(气象局,"人工降雪",NULL,NULL,NULL,NULL);