用C语言实现 流星雨

[复制链接]
查看11 | 回复1 | 2009-6-23 09:50:00 | 显示全部楼层 |阅读模式
用C语言?楼主还是自己写吧!相信会很有提高。我只给个提示:在字符界面的程序里,有两种方式可以用来控制字符在屏幕上的位置1.cprintf之类的函数,可以指定位置、字符属性地在屏幕上显示字符串。2.直接写屏技术。原理就是直接写字符屏幕缓冲区地址。屏幕上的字符与内存的特定地位一一对应。内存里写什么内容,屏幕上就显示什么内容。
回复

使用道具 举报

千问 | 2009-6-23 09:50:00 | 显示全部楼层
数字流星雨代码://流星雨.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 LENGTH 20//流星字符数#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]);}}}

扩展资料:include用法:#include命令预处理命令的一种,预处理命令可以将别的源代码内容插入到所指定的位置;可以标识出只有在特定条件下才会被编译的某一段程序代码;可以定义类似标识符功能的宏,在编译时,预处理器会用别的文本取代该宏。插入头文件的内容#include命令告诉预处理器将指定头文件的内容插入到预处理器命令的相应位置。有两种方式可以指定插入头文件:1、#include<文件名>2、#include"文件名"
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行