程序代码:
// ConsoleApplication2.cpp : 定义控制台应用程序的入口点。
//
#include "stdafx.h"
#include<stdio.h>
#include<windows.h>
#include<stdlib.h>
#include<time.h>
//cmd界面默认 25行 80列
#define M 25//行
#define N 80//列
#define TIME 40//刷新的速度,这里是停顿的时间
#define midu 1//密度
void Pos(int x, int y);//设置光标位置,决定要在什么位置输出
char output[M*N + M + 1];//行*列+M个换行+1个结束符
void Updata(char rain[M][N]);
void Print(char rain[M][N]);
int main(void)
{
char rain[M][N];
memset(rain, ' ', sizeof rain);
srand((unsigned)time(NULL));//初始化随机的一个种子
system("color 0A");//设置背景颜色
while (1)
{
Updata(rain);//用于每一行向下一行移动
Sleep(TIME);//每次要刷新的速度,之前定义了,
// 因为每次都要生成新的数组,中间存在间隔
}
return 0;
}
void Updata(char rain[M][N])
{
int i, j, t;
for (i = M - 2; i >= 0; --i)
{
for (j = 0; j < N; ++j)
{
rain[i + 1][j] = rain[i][j];//把上面的一行写到下一行
}
}
int count = N * midu / 10;
for (j = 0; j < N; ++j)
{
if (rain[1][j] != ' ')
{
//探测长度 太麻烦 直接给一个概率结束
if (rand() % 2)
rain[0][j] = ' ';
else
{
rain[0][j] = rand() % 10 + '0';
--count;
}
}
}
while (count)
{
//简单粗暴的重复探测生成新雨滴
int x = rand() % 80;
if (rain[0][x] == ' ')
{
--count;
rain[0][x] = rand() % 10 + '0';
}
}
Pos(0, 0);
Print(rain);
}
void Print(char rain[M][N])
{
int i, j;
int t = 0;
for (i = 0; i < M; ++i)
{
for (j = 0; j < N; ++j)
{
output[t++] = rain[i][j];
}
}
output[t] = '\0';
printf("%s", output);
}
void Pos(int x, int y)
{
COORD pos;
HANDLE hOutput;
pos.X = x;
pos.Y = y;
hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hOutput, pos);
}