您的位置:

c语言下雪效果,c语言雪花算法

本文目录一览:

怎么用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; iMaxX; 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( xtox )

{

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( xtox )

{

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( x0 Map[x-1]Map[x] ) Map[x-1]=Map[x];

if( xMaxX-1 Map[x+1]Map[x] ) Map[x+1]=Map[x];

break;

case 3:

Map[x]-=3;

if( x1 Map[x-2]Map[x] ) Map[x-1]=Map[x];

if( x0 Map[x-1]Map[x] ) Map[x-1]=Map[x];

if( xMaxX-2 Map[x+2]Map[x] ) Map[x+1]=Map[x];

if( xMaxX-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;

}

}

怎么用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 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语言的经验,方法?

想学一门编程语言,不知道学什么才好? 毫无疑问 C 语言啊。

C 语言是整个计算机体系的基础,往下可以操作硬件(不止X86计算机,还有ARM,DSP,单片机等各种微处理器)写Firmware,写驱动、写OS,写编译器,往上可以写 App,并且大部分的计算机书籍里的算法都是C语言描述的。

所以学会了 C 语言,就是掌握了软件领域的必备技能,以后再学其他的比如C++,Java,各种解释性语言、就是小 Case 了。

请点击输入图片描述

下图是一个网上流行的程序员“鄙视链”。其实我想说的是,还是有一定道理的,哈哈哈,笑而不语。

请点击输入图片描述

要想学好一门编程语言,看书远远不够,一定要把书里的代码搬到电脑里。

相信大多数人都是使用的Widnows,那么就下载安装一个Visual Studio吧,用哪个版本?最新版的当然好,2015,2013也行

学习编程忌讳光看不敲,看得懂不代表你会,说不定关上书或者视频,你根本无法下手

据我的了解,大部分c语言的入门者学不好c语言,都是因为一个心态问题:初学编程,费了偌大的劲,理解了这,理解了那,竟然只是在黑框下打印出了几个数字。

我觉得,初学一门编程语言一定要用合适的方式培养兴趣,黑框显然不是一个好方法。

所以,我建议在学习c语言的过程中,把系统API什么的也加进去一起学吧,教人写个带界面的程序比教人成天面对控制台程序,效果可能会好很多,因为这让人觉得学习c语言能做事情。

5

说说我当时写的一些小程序,简单但比较好玩,适合培养编程兴趣(代码量依次增大):1、点击,打开一个对话框,问你是猪不?然后告诉他,说不是的会自动关机,让他选吧。要是他点是,就嘲笑他,点不是,就关机吧。

2、桌面下雪程序,在冬天大家都期待下雪的时候,做个简单的下雪程序,用到windows几个基本的api就行了,把这个程序发给大家,不懂的人会觉得非常神奇。我曾经发给几个mm,她们貌似都非常喜欢。

3、桌面贪吃蛇,就是用桌面图标玩贪吃蛇,当时听说的时候,觉得太有创意了,网上曾风靡一时啊,但是原理其实很简单,如果你把这个演示给你的同学看,他们会把你视为偶像的。

4、然后呢,对qq有兴趣的,去看看早期的qq是怎么写的吧,我记得有一篇《qq是怎样练成的》,还有源代码。改编一下,补充内容,甚至可以去参加学校的软件比赛去了,哈哈。

写几个好玩的程序以后,相信你就知道该如何学习编程了,要多给自己找乐趣。

最后希望大家能够坚持,学习是很枯燥的一件事情,只要熬出了头,你会发现一切都是值得的!

c语言下雪效果,c语言雪花算法

2022-11-26
特效代码c语言,c语言特效源代码

2023-01-06
java桌面下雪屏保(电脑下雪屏保)

2022-11-12
c语言笔记讲解,c语言程序笔记

2022-11-23
切比雪夫滤波器c语言,设计一个切比雪夫低通滤波器

2022-11-29
c语言转换成语,用c语言进行进制转换

本文目录一览: 1、c语言怎么载入成语库 2、关于c语言成语的疑问 3、跪求c语言小游戏“成语接龙”代码,急急急!谢谢 4、C++设计猜成语程序 5、怎么用c语言选择结构输出一到七开头的成语? c语言

2023-12-08
基础c语言笔记,C语言笔记

2023-01-06
c语言知识笔记,c语言最全笔记

2023-01-04
js雪花代码,雪花算法js

本文目录一览: 1、求网页飘雪花源代码 2、网页飘雪花的代码是什么 3、Dreamweaver海报首页怎样做出雪花飘 4、淘宝里首页飘雪花 怎么弄啊 js代码放在哪里啊 本人小白 希望大神详解....

2023-12-08
c语言接龙游戏,c语言游戏开发教程

2022-11-27
一篇c语言笔记,c语言入门笔记

2022-12-02
c到c语言笔记,cc在c语言

2022-11-27
万物基础c语言,c语言万物之源

本文目录一览: 1、.Net与C语言都是编程语言吗?有什么关系和不同吗? 2、如何用C语言表示上帝创造万物的过程? 3、c语言和java的区别? 4、C/C++语言特点是什么? 5、C语言是由什么语言

2023-12-08
告白c语言,表白的C语言程序

2023-01-06
c语言trackbar,c语言trace库

2022-12-01
c语言strap,c语言strlen

2022-11-30
计算机c语言入门表,c语言最全入门笔记

2022-11-30
c语言算法初步,c语言基础算法

2023-01-04
c语言中心极限定理,用c语言求极限

2023-01-05
算法的c语言,C语言的基本算法

2023-01-05