當前位置:首頁 » 編程語言 » 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);