c语言雪花飘落代码(c# 雪花算法)

http://www.itjxue.com  2023-02-26 07:34  来源:未知  点击次数: 

急用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;isnownum;i++) putimage(snow[i].x,snow[i].y,save4,0); for(i=0;isnownum;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].y500) //雪花落下后重新计算雪花属性 { 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(); }

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

#include?stdio.h

#include?stdlib.h

#include?string.h

#include?time.h

/*

*?清除屏幕的shell?命令/控制台命令,还有一些依赖平台的实现

*?如果定义了?__GNUC__?就假定是?使用gcc?编译器,为Linux平台

*????否则?认为是?Window?平台

*/

#if?defined(__GNUC__)

//下面是依赖?Linux?实现

#include?unistd.h

#define?sleep_ms(m)?\

????????usleep(m?*?1000)

//向上移动光标函数?Linux

static?void?__curup(int?height)

{

????int?i?=?-1;

????while?(++iheight)

????????printf("\033[1A");?//先回到上一行??

}

#else?

//?创建等待函数?1s?60?帧?相当于?16.7ms?=?1帧,?我们取16ms

//?咱么的这屏幕?推荐?1s?25帧吧?40ms

//?这里创建等待函数?以毫秒为单位?,?需要依赖操作系统实现

#include?Windows.h

#define?sleep_ms(m)?\

????????Sleep(m)

//向上移动光标

static?void?__curup(int?height)

{

????COORD?cr?=?{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

*/

#define?cerr(msg,...)?\

????fprintf(stderr,?"[%s:%s:%d]"?msg?"\n",__FILE__,__func__,__LINE__,##__VA_ARGS__);

/*

*??屏幕结构体,?具有?宽高

*??frate??:?绘制一帧的周期,?单位是?毫秒

*??width??:?屏幕的宽,基于窗口的左上角(0,0)

*??height?:?屏幕的高

*??pix????:?用一维模拟二维?主要结构如下

*?????????????0?0?0?1?0?0?1?0?1?0

*?????????????0?1?0?1?0?1?0?1?2?0

*?????????????.?.?.

*?????????????=?0表示没像素,?1表示1个像素,2表示2个像素....

*/

struct?screen?{

????int?frate;?//?也可以用?unsigned?结构

????int?width;

????int?height;

????char?*pix;

};

/*

*?创建一个?屏幕结构指针?返回

*

*?int?frate????:?绘制一帧的周期

*?int?width????:?屏幕宽度

*?int?height????:?屏幕高度

*?return????????:?指向屏幕结构的指针

*?*/

struct?screen*?screen_create(int?frate,?int?width,?int?height);

/*

*?销毁一个?屏幕结构指针,?并为其置空

*?struct?screen**?:?指向?屏幕结构指针的指针,?二级销毁一级的

*?*/

void?screen_destory(struct?screen**?pscr);

/**

*?屏幕绘制函数,主要生成一个雪花效果

*

*?struct?screen*?:?屏幕数据

*?return??????????:?0表示可以绘制了,1表示图案不变

*/

int?screen_draw_snow(struct?screen*?scr);

/**

*?屏幕绘制动画效果,?绘制雪花动画

*

*?struct?screen*?:?屏幕结构指针

*/

void?screen_flash_snow(struct?screen*?scr);

//?主函数,主业务在此运行

int?main(int?argc,?char?*argv[])

{

????struct?screen*?scr?=?NULL;

????//创建一个屏幕对象

????scr?=?screen_create(_INT_FRATE,?_INT_WIDTH,?_INT_HEIGHT);

????if?(NULL?==?scr)

????????exit(EXIT_FAILURE);

????//绘制雪花动画

????screen_flash_snow(scr);

????//销毁这个屏幕对象

????screen_destory(scr);

????return?0;

}

/*

*?创建一个?屏幕结构指针?返回

*

*?int?frate????:?绘制一帧的周期

*?int?width????:?屏幕宽度

*?int?height????:?屏幕高度

*?return????????:?指向屏幕结构的指针

*?*/

struct?screen*

????screen_create(int?frate,?int?width,?int?height)

{

????struct?screen?*scr?=?NULL;

????if?(frate0?||?width?=?0?||?height?=?0)?{

????????cerr("[WARNING]check?is?frate0?||?width=0?||?height=0?err!");

????????return?NULL;

????}

????//后面是?为?scr-pix?分配的内存?width*height

????scr?=?malloc(sizeof(struct?screen)?+?sizeof(char)*width*height);

????if?(NULL?==?scr)?{

????????cerr("[FATALG]Out?of?memory!");

????????return?NULL;

????}

????scr-frate?=?frate;

????scr-width?=?width;

????scr-height?=?height;

????//减少malloc次数,malloc消耗很大,内存泄露呀,内存碎片呀

????scr-pix?=?((char?*)scr)?+?sizeof(struct?screen);

????return?scr;

}

/*

*?销毁一个?屏幕结构指针,?并为其置空

*?struct?screen**?:?指向?屏幕结构指针的指针,?二级销毁一级的

*?*/

void

screen_destory(struct?screen**?pscr)

{

????if?(NULL?==?pscr?||?NULL?==?*pscr)

????????return;

????free(*pscr);

????//?避免野指针

????*pscr?=?NULL;

}

//构建开头?的雪花,下面宏表示每?_INT_SHEAD?个步长,一个雪花,需要是2的幂

//static?可以理解为?private,?宏,位操作代码多了确实难读

#define?_INT_SHEAD?(12)

static?void?__snow_head(char*?snow,?int?len)

{

????int?r?=?0;

????//数据需要清空

????memset(snow,?0,?len);

????for?(;;)?{

????????//取余一个技巧?2^3?-?1?=?7?=?111?,?并就是取余数

????????int?t?=?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)

static?void?__snow_next(struct?screen*?scr,?int?idx)

{

????int?width?=?scr-width;

????char*?psnow?=?scr-pix?+?width*(idx?-?1);

????char*?snow?=?psnow?+?width;

????int?i,?j,?t;?//?i索引,?j保存下一个瞬间雪花的位置,t?临时补得,解决雪花重叠问题

?????????????????//为当前行重置

????memset(snow,?0,?width);

????//通过上一次雪花位置?计算下一次雪花位置

????for?(i?=?0;?iwidth;?++i)?{

????????for?(t?=?psnow[i];?t0;?--t)?{?//?雪花可以重叠

???????????????????????????????????????//?rand()%_INT_SWING?-?1?表示?雪花?横轴的偏移量,相对上一次位置

????????????j?=?i?+?rand()?%?_INT_SWING?-?1;

????????????j?=?j0???width?-?1?:?j?=?width???0?:?j;?//?j如果越界了,左边越界让它到右边,右边越界到左边

????????????++snow[j];

????????}

????}

}

/**

*?屏幕绘制函数,主要生成一个雪花效果

*

*?struct?screen*?:?屏幕数据

*?return??????????:?0表示可以绘制了,1表示图案不变

*/

int

screen_draw_snow(struct?screen*?scr)

{

????//?静态变量,默认初始化为0,每次都共用

????static?int?__speed?=?0;

????int?idx;

????if?(++__speed?!=?_INT_VSNOW)

????????return?1;

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

????__speed?=?0;

????//这里重新构建雪花界面,先构建头部,再从尾部开始构建

????for?(idx?=?scr-height?-?1;?idx??0;?--idx)

????????__snow_next(scr,?idx);

????//构建头部

????__snow_head(scr-pix,?scr-width);

????return?0;

}

//buf?保存scr?中pix?数据,构建后为?(width+1)*height,?后面宏是雪花图案

#define?_CHAR_SNOW?‘*‘

static?void?__flash_snow_buffer(struct?screen*?scr,?char*?buf)

{

????int?i,?j,?rt;

????int?height?=?scr-height,?width?=?scr-width;

????int?frate?=?scr-frate;?//刷新的帧频率????

????????????????????????????//每次都等一下

????for?(;;sleep_ms(frate))?{

????????//开始绘制屏幕

????????rt?=?screen_draw_snow(scr);

????????if?(rt)

????????????continue;

????????for?(i?=?0;iheight;?++i)?{

????????????char*?snow?=?scr-pix?+?i*width;

????????????for?(j?=?0;?jwidth;?++j)

????????????????buf[rt++]?=?snow[j]???_CHAR_SNOW?:?‘?‘;

????????????buf[rt++]?=?‘\n‘;

????????}

????????buf[rt?-?1]?=?‘\0‘;

????????//正式绘制到屏幕上

????????puts(buf);

????????//清空老屏幕,屏幕光标回到最上面

????????__curup(height);

????}

}

#undef?_CHAR_SNOW

/**

*?屏幕绘制动画效果,?绘制雪花动画

*

*?struct?screen*?:?屏幕结构指针

*/

void

screen_flash_snow(struct?screen*?scr)

{

????char*?buf?=?NULL;

????//?初始化随机数种子,改变雪花轨迹

????srand((unsigned)time(NULL));

????buf?=?malloc(sizeof(char)*(scr-width?+?1)*scr-height);

????if?(NULL?==?buf)?{

????????cerr("[FATAL]Out?of?memory!");

????????exit(EXIT_FAILURE);

????}

????__flash_snow_buffer(scr,?buf);

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

????free(buf);

????buf?=?NULL;

}

用c语言编写一个程序,输出下列雪花图案!

#include?"stdio.h"

#define?ROW?14

#define?COL?12

int?main()

{

char?ch[ROW][COL]; //多定义一行一列,0行和0列不用

int?i,j;

for(i=0;iROW;i++)

for(j=0;jCOL;j++)

ch[i][j]='?'; //初始化为空格

ch[1][4]=ch[13][4]='*';

for(i=2;i=8;i+=2)

{

ch[3][i]='*';

ch[11][i]='*';

}

for(i=3;i=7;i+=2)

{

ch[5][i]='*';

ch[9][i]='*';

}

for(i=1;i=11;i+=2)

{

ch[7][i]='*';

}

printf("??");

for(i=1;iCOL;i++)

printf("?%d",i);

printf("\n");

for(i=1;iROW;i++)

{

printf("%-2d",i);

for(j=1;jCOL;j++)

{

printf("?%c",ch[i][j]);

}

printf("\n");

}

return?0;

}

(责任编辑:IT教学网)

更多

推荐Fireworks教程文章