目录

一、函数段

二、完整代码

三、运行效果


一、函数段

1、显示图形界面

(1)安装EasyX图形库,官网地址:EasyX Graphics Library for C++

(2)图形库头文件


#include<graphics.h>


(3)宏定义 设置图形化界面大小


#define WIDTH 960  //窗口宽度
#define HEIGTH 640  //窗口高度


(4)图形化窗口的使用


initgraph(WIDTH, HEIGTH);  //打开图形化窗口
getchar();
closegraph();  //关闭图像化窗口


2、数字雨的结构体struct

(1)定义属性代码段


struct Rain
{
	int x;  //数字雨横向位置
	int y;  //y坐标
	int speed;  //下降速度
	char str[STR_SIZE];  //数字雨数组
}rain[STR_NUM];


3、随机字符

(1)随机数生成数字雨,srand()需要头文件#include<Windows.h>


srand(GetTickCount());  //利用ASCII码值随机生成,GetTickCount();直接获取电脑开机到现在的毫秒数


(2)switch语句或if-else if语句随机生成数字0、1、2,且产生概率相同

4、初始化

(1)初始化基础数据

(2)初始化字符串


void GameInit()
{
	for (int i = 0; i < STR_NUM; i++){
		rain[i].x = i * STR_WIDTH;
		rain[i].y = rand() % HEIGTH;
		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();
		}
	}
}


5、输出字符

(1)字符串颜色设置


settextcolor(RGB(255.0 / STR_SIZE * i, 255.0 / STR_SIZE * j, 0));
//settextcolor(RGB(0, 255 - 13 * j, 0));


6、字符移动

7、变换字符

8、主函数main()

(1)如何解决字符下降速度较快问题

方法一:if()条件判断语句实现


DWORD t1, t2;
t1 = t2 = GetTickCount();
while
{
    if (t2 - t1 > 20)  //使游戏下落延时
    {
         GamePlay();
         t1 = t2;
    }
    t2 = GetTickCount();
}


方法二:Sleep()函数实现,功能: 等待一段时间

#include<Windows.h>  //适用于Windows系统
#include <unistd.h>  //适用于Linux系统

Sleep(20);  //使整个程序延时

(2)图形化界面的打开与关闭


initgraph(WIDTH, HEIGTH);  //打开图形化窗口
closegraph();  //关闭图像化窗口


二、完整代码

#include<stdio.h>
#include<math.h>
#include<graphics.h>  //图形化界面头文件
#include<Windows.h>
#define WIDTH 960  //窗口宽度
#define HEIGTH 640  //窗口高度
#define STR_SIZE 20  //字符串数组的最大存储长度
#define STR_NUM 128  //字符串数量
#define STR_WIDTH 15  //字符串宽度

// 数字雨的结构体
struct Rain
{
	int x;  //数字雨横向位置
	int y;  //y坐标
	int speed;  //下降速度
	char str[STR_SIZE];  //数字雨数组
}rain[STR_NUM];

//随机字符
char CreateCh()
{
	int flag = rand() % 3;  //随机产生数字0、1、2,且产生概率相同
	switch (flag)
	{
	case 0:
		return rand() % 26 + 'A';
		break;
	case 1:
		return rand() % 26 + 'a';
		break;
	case 2:
		return rand() % 10 + '0';
		break;
	default:
		break;
	}

}

//初始化
void GameInit()
{
	for (int i = 0; i < STR_NUM; i++)
	{
		rain[i].x = i * STR_WIDTH;
		rain[i].y = rand() % HEIGTH;
		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++)
		{
			settextcolor(RGB(255.0 / STR_SIZE * i, 255.0 / STR_SIZE * j, 0));
			//settextcolor(RGB(0, 255 - 13 * j, 0));
			outtextxy(rain[i].x, rain[i].y + j * STR_WIDTH, rain[i].str[j]);
			//使用rain[i].y + j * STR_WIDTH输出一串随机字符
		}
	}
}

//字符移动
void GamePlay()
{
	for (int i = 0; i < STR_NUM; i++)
	{
		rain[i].y += rain[i].speed;
		if (rain[i].y - STR_SIZE * STR_WIDTH > HEIGTH)
		{
			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());  //利用ASCII码值随机生成,GetTickCount();直接获取电脑开机到现在的毫秒数
	GameInit();
	DWORD t1, t2;
	t1 = t2 = GetTickCount();
	while (1)
	{
		BeginBatchDraw();
		GameDraw();
		ChangeCh();
		if (t2 - t1 > 20)  //使游戏下落延时
		{
			GamePlay();
			t1 = t2;
		}
		t2 = GetTickCount();
		EndBatchDraw();
		//Sleep(20);  //使整个程序延时
	}
	getchar();
	closegraph();  //关闭图像化窗口
	return 0;
}

三、运行效果

PS:可以自己试着运行一下,感受数字雨的动态效果

数字雨代码编程python可复制_数字雨代码编程python可复制

注意:

(1)如何解决字符串频闪问题


BeginBatchDraw();
EndBatchDraw();


(2)如何解决不兼容问题

方法:项目-属性-配置属性-常规-字符集-使用多字节字符集

数字雨代码编程python可复制_c语言_02