C语言实现流星雨

来源:互联网 发布:大数据风控查询 编辑:程序博客网 时间:2024/04/28 09:29

程序模拟一组流星飞向地面的情景。流星用大写字母不表示。程序产生一组流星(比如10个),从屏幕顶部下降飞向地面。一组流星中,每个流星的字符颜色是随机的,下降的位置是随机的,下降的速度也是随机的。


数字流星雨代码:

// 流星雨.cpp : Defines the entry point for the console application.///////////////////////////////////////////////////// // 程序名称:数字流星雨 // 最后修改:2006-10-15/////////////////////////////////////////////////// #include <windows.h>#include <time.h>#include <stdlib.h>#include "graphics.h"#include <conio.h>#include <math.h>/***********************宏定义**********************/#define PI 3.1415926//圆周率#define WIDTH 200//屏幕宽度,流星出生区域#define HEIGHT 150//屏幕高度,流星出生区域#define V 20//流星速度,单次移动的像素数#define LENGTH20//流星字符数#define DELAY 30//延时#define NUM 45//流星个数/******************定义流星结构体*******************/struct meteor{int x0;int y0;int yh;char str[LENGTH];}me[NUM] = {0};/*********************函数声明**********************/char AsciiRand();void Move(char *p);void InitMeteor(struct meteor *me);int color(int y, int y0, int yh);void Meteors(struct meteor me[]);/***********************主函数**********************////int main(void)int _tmain(int argc, _TCHAR* argv[]){char c = '\0'; //接收键盘输入的变量initgraph(WIDTH, HEIGHT); //初始化 WIDTH * HEIGHT的绘图窗口HWND hwnd = GetHWnd(); //获得窗口句柄SetWindowText(hwnd, "Gavin Liu 数字流星雨"); //修改窗口名称ShowWindow (hwnd, SW_SHOWMAXIMIZED); //最大化显示窗口MessageBox(hwnd, TEXT("点击【确定】开始演示流星雨效果,Esc键退出"), TEXT("提示"), MB_OK | MB_ICONWARNING); //弹出提示srand((unsigned)time(NULL)); //设置随机种子for(int i = 0; i < NUM; i++){ //对NUM个流星体初始化InitMeteor(&me[i]);}while(c != 27){BeginBatchDraw(); //开始批量绘图Meteors(me); //绘制一帧动画FlushBatchDraw(); //执行未完成的绘制任务Sleep(DELAY);  //延时cleardevice(); //清屏for(int i = 0; i < NUM; i++){me[i].yh += V;Move(me[i].str);if(me[i].yh > HEIGHT + LENGTH * V){InitMeteor(&me[i]);}}if(kbhit()){c = getch();}}EndBatchDraw();  //结束批量绘图closegraph(); //结束绘图环境return 0;}/***********************函数体**********************/char AsciiRand(){  //产生随机可见ASCII码return ((char)(rand() % (126 -33) + 33));}void Move(char *p){  //字符后移,可以使显示时字符相对屏幕位置不变char *pt = p + LENGTH;while(pt > p){*(--pt) = *(pt - 1);}*p = AsciiRand(); }void InitMeteor(struct meteor *me){ //对一颗流星初始化me->x0 = rand() % WIDTH;me->yh = me->y0 = rand() % HEIGHT;for(int i = 0; i < LENGTH; i++){*(me->str + i) = AsciiRand();}}int color(int y, int y0, int yh) {//确定流星的颜色int color;//出生点之前的流星体置成黑色if(y < y0){color = 0;}//流星颜色自头至尾按照余弦函数递减else{//尾迹消失color = (int)(255* cos((yh - y) * PI / ( 2 * LENGTH * V)));}return color;}//打印一帧流星的画面void Meteors(struct meteor me[]){//设置格式:背景透明,字符高度,字体粗细,字体setbkmode(TRANSPARENT);setfont(12, 12, "宋体");//开始打印一帧图像int y;for(int n = 0; n < NUM; n++){for(int j = 0; j < LENGTH; j++){//流星中第j个字符的纵坐标y = me[n].yh - j * V;//设置颜色,流星的头部是白色的setcolor(RGB(255 * (0 == j), color(y, me[n].y0, me[n].yh), 255 * (0 == j)));//打印字符outtextxy(me[n].x0, y, me[n].str[j]);}}}

转载请注明出处:http://blog.csdn.net/utimes/article/details/8021662

原创粉丝点击