用C语言编写流星雨程序
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用C语言编写流星雨程序相关的知识,希望对你有一定的参考价值。
速求 用C语言编写的——流星雨程序 不求画面质量,不求操作质量 马马虎虎凑合下下 只需0 warning(s)、 0 error(s) 可以运行滴(这个马虎不得の)。。。恩恩,感谢感谢。。。炎热的夏季,辛苦各位勒~~
数字流星雨代码:
//流星雨.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"文件名"
参考技术A数字流星雨代码:
//流星雨.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"文件名"
参考技术B #include <stdio.h>#include <string.h>
#include <stdlib.h>
#include <conio.h>#define STARNUM 2
#define STARCHAR '*'void main()
int starx[STARNUM], stary[STARNUM];
int i, dir, len;clrscr();
for( i = 0; i < STARNUM; i++ )
starx[i] = -1;
stary[i] = -1;
srand(time(0));
while( !kbhit() ) for( i = 0; i < STARNUM; i++ )
if( starx[i] == -1 && random(3) == 0 )
starx[i] = 1+random(256)%80;
stary[i] = 1+random(256)%25;
if( starx[i] > 0 )
dir = 1-random(2)*2;
len = 8+random(256)%20;
while( len > 0 && starx[i] > 0 && starx[i] < 80 )
gotoxy(starx[i]-dir*2, stary[i]);
printf(" ");
gotoxy(starx[i], stary[i]);
putchar(STARCHAR);
gotoxy(starx[i]-dir, stary[i]);
putchar('-');
delay(15000); starx[i] += dir;
len--;
if( dir>0) gotoxy(starx[i]-dir*2, stary[i]);
else gotoxy(starx[i], stary[i]);
printf(" ");
starx[i] = -1;
gotoxy(0,0);
sleep(1);
clrscr();
520表白C语言开发《浪漫流星雨》表白程序,源码来了!
今天是520告白节,特意为大家准备了我去年用C语言表白成功的浪漫表白流星雨项目源码,把这个发给你喜欢的女生,你还害怕520找不到对象,要一个人过吗?
话不多说,直接上效果:
开发环境:Visual Studio 2019 + EasyX图形库插件即可
接下来我们看看源码:
#include<stdio.h>
#include<math.h>
#include<time.h>
#include<conio.h>
#include<graphics.h> //自己安装了才有
#include<mmsystem.h>
#pragma comment(lib,"winmm.lib")//多媒体设备接口库文件
#define PI 3.1415
#define NUM 13 //烟花弹数量
#define WIDTH 960
#define HEIGHT 640
struct Fire
{
int x, y;
int cen_x, cen_y; //中心点坐标
int r; //当前绽放半径
int max_r; //最大绽放半径
int width, height;
DWORD pixel[240][240]; //图片像素数组
bool isShow; //烟花是否准备好了
bool isDraw; //是否绘制烟花
}fire[NUM];
struct Jet //烟花弹
{
int x, y; //坐标
int hx, hy; //最高点的坐标
bool isLaunch; //烟花弹是否在发射中
IMAGE img[2];
byte n : 1; //位段 0 1 0 1 0 1 0 1 0 1
}jet[NUM];
void welcome()
{
mciSendString(L"open ./res/小幸运.mp3", 0, 0, 0);
mciSendString(L"play ./res/小幸运.mp3", 0, 0, 0);
for (int i = 0; i < 50; i++)
{
//清除屏幕
cleardevice();
int x = 500 + 180 * sin(2 * PI / 60 * i);
int y = 200 + 180 * cos(2 * PI / 60 * i);
//设置字体样式
settextstyle(i, 0, L"楷体");
settextcolor(RGB(0, 202, 0));
setbkmode(TRANSPARENT);
outtextxy(x, y, L"浪漫表白程序");
Sleep(20);
}
_getch();//按任意键继续
cleardevice();
settextstyle(25, 0, L"楷体");
outtextxy(350, 100, L"亲爱的XXX");
outtextxy(350, 150, L"自从第一天看见你");
outtextxy(350, 200, L"我的心就不能自已");
outtextxy(350, 250, L"不管天上地下都想看见你");
outtextxy(350, 300, L"...");
outtextxy(350, 350, L"...");
outtextxy(450, 400, L"--爱你的XXX");
}
void InitData(int i);
void loadImg()
{
//初始化绽放效果
IMAGE bloomImg,tImg;
loadimage(&bloomImg, L"./res/flower.jpg", 3120, 240);
for (int i = 0; i < NUM; i++)
{
InitData(i);
SetWorkingImage(&bloomImg);
getimage(&tImg, i * 240, 0, 240, 240);
SetWorkingImage(&tImg);
for (int a = 0; a < 240; a++)
{
for (int b = 0; b < 240; b++)
{
fire[i].pixel[a][b] = getpixel(a, b);
}
}
}
//初始化烟花弹
IMAGE jetImg;
loadimage(&jetImg, L"./res/launch.jpg", 200, 50);
SetWorkingImage(&jetImg);
for (int i = 0; i < NUM; i++)
{
int n = rand() % 5;
getimage(&jet[i].img[0], n*20, 0, 20, 50);
getimage(&jet[i].img[1], n*20 + 100, 0, 20, 50);
jet[i].isLaunch = false;
}
SetWorkingImage();
}
void InitData(int i)
{
fire[i].cen_x = 120;
fire[i].cen_y = 120;
fire[i].max_r = 120;
fire[i].r = 0;
fire[i].width = 240;
fire[i].height = 240;
fire[i].isDraw = false;
fire[i].isShow = false;
}
//产生烟花弹
void createJet()
{
int i = rand() % NUM;//[0~13)
if (jet[i].isLaunch == false)
{
jet[i].x = rand() % (WIDTH-20);
jet[i].y = rand() % 100 + HEIGHT;
jet[i].hx = jet[i].x;
jet[i].hy = rand() % (HEIGHT / 3 * 2);
jet[i].isLaunch = true;
}
}
//发射烟花弹
void launch()
{
for (int i = 0; i < NUM; i++)
{
if (jet[i].isLaunch)
{
putimage(jet[i].x, jet[i].y, &jet[i].img[jet[i].n],SRCINVERT);
//判断是否达到最高点了
if (jet[i].y > jet[i].hy)
{
jet[i].y -= 5;
jet[i].n++;
}
putimage(jet[i].x, jet[i].y, &jet[i].img[jet[i].n], SRCINVERT);
if (jet[i].y <= jet[i].hy)
{
jet[i].isLaunch = false;
//可以开始放烟花了
fire[i].x = jet[i].x;
fire[i].y = jet[i].y;
fire[i].isShow = true;
}
}
}
}
void bloom(DWORD *pMem)
{
for (int i = 0; i < NUM; i++)
{
if (fire[i].isShow)
{
if (fire[i].r < fire[i].max_r)
{
fire[i].r++;
fire[i].isDraw = true; //可以开始绘制烟花了
}
if (fire[i].r >= fire[i].max_r)
{
InitData(i);
}
}
if (fire[i].isDraw)
{
//求当前半径下,圆上的每个点对于的弧度
for (double a = 0; a <= 2 * PI; a += 0.01)
{
int img_x = fire[i].cen_x + fire[i].r * cos(a);//求出圆上的每个点的坐标
int img_y = fire[i].cen_y + fire[i].r * sin(a);
if (img_x > 0 && img_x < fire[i].width && img_y>0 && img_y < fire[i].height)
{
//针对现在的绽放点,对应的屏幕坐标
int win_x= fire[i].x + fire[i].r * cos(a);
int win_y = fire[i].y + fire[i].r * sin(a);
if (win_x > 0 && win_x < WIDTH && win_y>0 && win_y < WIDTH)
{
pMem[win_y * WIDTH + win_x] = BGR(fire[i].pixel[img_x][img_y]);
}
}
}
}
}
}
int main()
{
//创建窗口
initgraph(960, 640);
//设置随机数种子
srand((unsigned)time(NULL)+clock());
welcome();
loadImg();
DWORD* pMem = GetImageBuffer(); //获取窗口的内存指针
while (1)
{
for (int i = 0; i < WIDTH; i++)
{
for (int k = 0; k < 4; k++)
{
int x = rand() % WIDTH;
int y = rand() % HEIGHT;
if (y < HEIGHT)
{
pMem[y * WIDTH + x] = BLACK;
}
}
}
createJet();
launch();
bloom(pMem);
Sleep(10);
}
closegraph();
return 0;
}
以上就是我们表白程序的源码了!最后祝大家都能和喜欢的人在一起哦~
对于学习编程的小伙伴或者在工作想升职的程序员,如果你想更好的提升你的编程能力帮助你提升水平!笔者这里或许可以帮到你~
C语言C++编程学习交流圈子,QQ群:765803539【点击进入】微信公众号:C语言编程学习基地
分享(源码、项目实战视频、项目笔记,基础入门教程)
欢迎转行和学习编程的伙伴,利用更多的资料学习成长比自己琢磨更快哦!
编程学习视频分享:
以上是关于用C语言编写流星雨程序的主要内容,如果未能解决你的问题,请参考以下文章