黑客帝国数字雨代码

知识点:循环、条件判断、函数、结构体

// 黑客帝国数字雨特效.cpp 
#include "stdafx.h"
#include 
#include   //图形库头文件
#include 
#define WIDTH 960 //宏定义,定义宽和高
#define HEIGTH 640 
#define STR_SIZE 20    //数字雨数组最大存储
#define STR_NUM 128  //1920/15=128 数字雨的串数
#define STR_WIDTH 15 //雨的距离15,字符宽度
struct Rain  //雨的结构
{
     
	int x;//数字雨横向位置
	int y;//y坐标
	int speed;//下降速度
	char str[STR_SIZE];//数字雨数组
}rain[STR_NUM];//结构体数组
char CreateCh(){
        //随机产生一个字符
	char temp=0;
	int flag=rand()%3; //rand随机产生0~3的数字:0、1、2,所以概率每个都是1/3。
	switch (flag)
	{
     
	case 0:temp=rand()%26+'a';break;
	case 1:temp=rand()%26+'A';break;
	default:temp=rand()%10+'0';break;
	}
	return temp;
}
void GameInit(){
       //初始化
	//初始化基础数据
	for(int i=0;i<STR_NUM;++i){
     
		rain[i].x=i*STR_WIDTH;
		rain[i].y=rand()%HEIGTH;  //y坐标产生在屏幕任意位置都可以,就模上规定屏幕的宽度。
		rain[i].speed=rand()%5+5;  //速度不可能为零吧!这样就是最低速度5,最高速度10。
	}
	//初始化字符串
	for(int i=0;i<STR_NUM;++i){
         //数据初始化。这里就相当于二维数组,随机产生字符。
		for(int j=0;j<STR_SIZE;++j){
     
			rain[i].str[j]=CreateCh();
		}
	}
}
void GameDraw(){
       //画
	cleardevice();//清屏小尾巴+闪烁;意义:每动一次重新画一遍
	for(int i=0;i<STR_NUM;++i){
     
		for(int 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 RainDrop(){
       //下雨
	for(int i=0;i<STR_NUM;++i){
     
		rain[i].y+=rain[i].speed;
		if(rain[i].y-STR_WIDTH*STR_SIZE>HEIGTH){
      //如果尾巴(rain[i].y-STR_WIDTH*STR_SIZE)下落到地面,重新回到头顶上
			rain[i].y=0;
		}
	}
}
void ChangeCh(){
       //随机改变字符
	for(int i=0;i<STR_NUM;++i){
     
		rain[rand()%STR_NUM].str[rand()%STR_SIZE]=CreateCh();  //随机选一个结构体的随机一位字符改变它
	}
}
int main()
{
     
	initgraph(WIDTH,HEIGTH);//创建窗口
	srand(GetTickCount());
	GameInit();
	DWORD t1,t2;
	t1=t2=GetTickCount();  //从操作系统启动到现在所经过的毫秒数
	while (true)
	{
     
		BeginBatchDraw();//双缓冲绘图开始,先在内存里画好。防止闪瞎狗眼
		                //任何绘图操作都将暂时不输出到屏幕上,直到执行 FlushBatchDraw 或 EndBatchDraw 才将之前的绘图输出
		GameDraw();
		ChangeCh();
		if(t2-t1>20){
       //超过20毫秒时。区别:使RainDrop()下落延时20毫秒
			RainDrop();
			t1=t2;
		}
		t2=GetTickCount();  //t2再重新获取一下时间
		EndBatchDraw();//内存已画好,开始显示。
//		Sleep(20);  //单位是毫秒,20毫秒。使整个程序暂停20毫秒以后从这里开始继续运行。并不好,会有卡顿感,不建议使用。区别:使整个程序延时20毫秒
	}
	getchar();
	closegraph();//关闭窗口
	return 0;
}

你可能感兴趣的:(黑客帝国数字雨代码)