黑客帝国“01”瀑布流C++

原文《帅爆了!C++也可以弄出黑客帝国的数字瀑布流这个做屏保觉得帅~》http://www.ic2012.cn/read-htm-tid-386-ordertype-desc-ds-1.html采用VC++6.0和EasyX2012立冬版;(加了一些废话)

本人使用VS2013社区版和EasyX_20151015(beta)版;(比如EasyX15版字体设置由setfont改为了settextstyle等)

本人初学C++,想找个地方系统的存储源代码以方便本人学习,如此而已。


#include <stdafx.h>
#include <windows.h> 
#include <time.h> 
#include <stdlib.h> 
#include <graphics.h> 
#include <conio.h> 
#include <math.h> 


/***********************宏定义**********************/
#define PI 3.1415926	 //圆周率 
#define WIDTH 1500	 //屏幕宽度,流星出生区域 
#define HEIGHT 800	 //屏幕高度,流星出生区域 
#define V 20	 //流星速度,单次移动的像素数 
#define LENGTH	20	 //流星字符数 
#define DELAY 30	 //延时 
#define NUM 45	 //流星个数 


/******************定义流星结构体*******************/
struct meteor
{
	int x0;
	int y0;
	int yh;
	char str[LENGTH];	//默认20个
}me[NUM] = { 0 };		//默认45颗流星

/*********************函数声明**********************/
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)
{
	//接收键盘输入的变量 
	char c = '\0';

	//初始化 WIDTH * HEIGHT的绘图窗口 
			// win api 获取显示器分辨率方法:
	initgraph(WIDTH, HEIGHT);
			//	int width = GetSystemMetrics(SM_CXSCREEN);
			//  int height = GetSystemMetrics(SM_CYSCREEN);

	//获得窗口句柄 
	HWND hwnd = GetHWnd();

	//修改窗口名称 
	SetWindowText(hwnd, _T("黑客帝国“01”瀑布流"));

	//最大化显示窗口 
			//ModifyStyle(WS_CAPTION, 0);
	ShowWindow(hwnd, SW_SHOWMAXIMIZED);
			//ChangeDisplaySettings
			//全屏http://download.csdn.net/source/271342
				//http://wenku.baidu.com/view/a02e4bf8aef8941ea76e052c.html

			// Set WS_EX_LAYERED on this window 
			//SetWindowLong(hwnd,GWL_EXSTYLE,GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED);

			// 透明度:
			//SetLayeredWindowAttributes(hwnd, 0, (255 * 70) / 100, LWA_ALPHA);
	

	//弹出提示 
	MessageBox(hwnd, TEXT("点击【确定】,现在开始演示“01”瀑布流效果,Esc键退出"), TEXT("提示"), MB_OK | MB_ICONWARNING);

	//设置随机种子 
	srand((unsigned)time(NULL));

	//对NUM个流星体初始化 
	for (int i = 0; i < NUM; i++)
	{
		InitMeteor(&me[i]);
	}

	while (c != 27)
	{
		//开始批量绘图 
		BeginBatchDraw();

		//绘制一帧动画 
		Meteors(me);

		//执行未完成的绘制任务 
		FlushBatchDraw();

		//延时 
		Sleep(DELAY);

		//清屏 
		cleardevice();

		for (int i = 0; i < NUM; i++)
		{
			//流星向下移动一步(V个像素) 
			me[i].yh += V;
			Move(me[i].str);

			//若某个流星完全走出画面,则初始化 
			if (me[i].yh > HEIGHT + LENGTH * V)
			{
				InitMeteor(&me[i]);
			}
		}

		//如果Esc键按下退出 
		if (_kbhit())
		{
			c = _getch();
		}
	}

	//结束批量绘图 
	EndBatchDraw();



	//结束绘图环境 
	closegraph();
	return 0;
}

/***********************函数体**********************/

产生随机可见ascii码 
//char asciirand()
//{
//	return ((char)(rand() % (126 - 33) + 33));
//}

//产生随机01字符
char zoRand()
{
	return ((char)(rand() % 2 + '0'));
}



//字符后移,可以使显示时字符相对屏幕位置不变 
void Move(char *p)
{
	char *pt = p + LENGTH;
	while (pt > p)
	{
		*(--pt) = *(pt - 1);
	}
	//*p = AsciiRand();
	*p = zoRand();
}

//对一颗流星初始化 
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();
		*(me->str + i) = zoRand();
	}
}

//确定流星的颜色 
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)));

		//尾迹不消失 
		//color = 255; 
	}
	return color;
}


//打印一帧流星的画面 
void Meteors(struct meteor me[])
{
	//设置格式:背景透明,字符高度,字体粗细,字体 
	setbkmode(TRANSPARENT);
	settextstyle(16, 0,_T("Arial"));

	//开始打印一帧图像 
	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]);
		}
	}
}


没找到地方传附件。






  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值