天天看點

02、C語言--黑客帝國(數字雨)

數字雨效果

在黑客帝國電影場景中,曾出現大量的數字雨特效。在現實的生活中,雨往往給人一種清新的感覺,而雨後的感覺則是新生。

也許,電影中所表達的意思便是對自我的啟迪乃至新生的過程。

02、C語言--黑客帝國(數字雨)

代碼如下所示:

#include <stdio.h>
#include <graphics.h>
// 視窗的寬和高
#define WIDTH 960
#define HEIGHT 640
#define STR_SIZE 25	 // 數字雨數組最大存儲
#define STR_NUM 128	 // 數字雨的串數
#define STR_WIDTH 15 // 字元串寬度
// 雨的結構
struct Rain {
	int x;
	int y;
	int speed;			// 下降速度
	char str[STR_SIZE];	// 數字雨數組
}rain[STR_NUM];

char CreateCh() {
	char temp = 0;
	int flag = rand() % 3;
	if (flag == 0) {
		temp = rand() % 26 + \'a\';
	} else if (flag == 1) {
		temp = rand() % 26 + \'A\';
	} else {
		temp = rand() % 10 + \'0\';
	}
	return temp;
}

void GameInit() {
	// 初始化基礎資料
	for (size_t i = 0; i < STR_NUM; i++) {
		rain[i].x = i * STR_WIDTH;
		rain[i].y = rand() % HEIGHT;
		rain[i].speed = (rand() % 5) + 5;
	}
	// 初始化字元串
	for (size_t i = 0; i < STR_NUM; i++) {
		for (size_t j = 0; j < STR_SIZE; j++) {
			rain[i].str[j] = CreateCh();
			if (rain[i].y > HEIGHT) {
				rain[i].y = 0;
			}
		}
	}
}

void GameDraw() {
	cleardevice();
	for (size_t i = 0; i < STR_NUM; i++) {
		for (size_t j = 0; j < STR_SIZE; j++) {
			outtextxy(rain[i].x, rain[i].y - STR_WIDTH * j, rain[i].str[j]);
			settextcolor(RGB(0, 255 - (13 * j), 0));
		}
	}
}

void GamePlay() {
	for (size_t i = 0; i < STR_NUM; i++) {
		rain[i].y += rain[i].speed;
		if (rain[i].y - STR_SIZE * STR_WIDTH > WIDTH) {
			rain[i].y = 0;
		}
	}
}

void ChangeCh() {
	for (size_t i = 0; i < STR_NUM; i++) {
		rain[rand() % STR_NUM].str[rand() % STR_SIZE] = CreateCh();
	}
}

int main() {
	initgraph(WIDTH, HEIGHT);
	srand(GetTickCount());
	DWORD t1, t2;
	t1 = t2 = GetTickCount();
	GameInit();
	while (true) {
		BeginBatchDraw();
		GameDraw();
		ChangeCh();
		if (t2 - t1 > 20) {	// 使遊戲下落延時
			GamePlay();
			t1 = t2;
		}
		t2 = GetTickCount();	
		EndBatchDraw();
		// Sleep(20); // 使整個程式延時
	}
	getchar();
	closegraph();
	return 0;
}