黑客帝國“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]);
		}
	}
}


沒找到地方傳附件。






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章