以下代码实现了代码雨的一些基本功能
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>
#define XMAX 150
#define YMAX 35
#define RAINLINES 50
char *str = "ki)udm+nh*&(^%cobpwerxz$#@<>?}{";
struct Rainpoint
{
char ch;
int x;
int y;
};
struct Rainline
{
struct Rainpoint point[YMAX];
int start;
int length;
};
struct Rainline rainline[RAINLINES];
void SetWindow();
void SetColor(int n);
void hide();
void init_rainline();
void gotoxy(int x, int y);
void display();
void update();
int main()
{
SetWindow();
SetColor(2);
hide();
init_rainline();
while (1)
{
display();
update();
};
return 0;
}
void SetWindow()
{
SetConsoleTitleA("骇客代码雨");
system("mode con cols=150 lines=35");
}
void SetColor(int n)
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), n);
}
void hide() //隐藏光标函数调用。
{
CONSOLE_CURSOR_INFO CURSORINFO = { 1,0 };
SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &CURSORINFO);
}
void init_rainline()
{
int i, j;
srand((unsigned)time(NULL));
for (i = 0; i < RAINLINES; i++)
{
rainline[i].start = rand() % YMAX / 2 + 4;
rainline[i].length = rand() % YMAX / 2 + 3;
for (j = 0; j < YMAX; j++)
{
rainline[i].point[j].x = i;
rainline[i].point[j].y = j;
if (rainline[i].start < rainline[i].length)
{
if (j < rainline[i].start)
{
rainline[i].point[j].ch = str[rand() % strlen(str)];
}
else
{
rainline[i].point[j].ch = ' ';
}
}
else
{
if (j<rainline[i].start&&j>(rainline[i].start - rainline[i].length))
{
rainline[i].point[j].ch = str[rand() % strlen(str)];
}
else
{
rainline[i].point[j].ch = ' ';
}
}
}
}
}
void display()
{
int i, j;
for (i = 0; i < RAINLINES; i++)
{
for (j = 0; j < YMAX; j++)
{
gotoxy(i * 3, j);
putchar(rainline[i].point[j].ch);
}
}
}
void gotoxy(int x, int y)
{
COORD pos;
pos.X = x;
pos.Y = y;
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}
void update()
{
int i, j;
for (i = 0; i < RAINLINES; i++)
{
rainline[i].start++;
if (rainline[i].start > YMAX)
{
rainline[i].start = YMAX;
rainline[i].length--;
}
if (rainline[i].length == 0)
{
rainline[i].start = rand() % YMAX / 2 + 4;
rainline[i].length = rand() % YMAX / 2 + 3;
}
for (j = 0; j < YMAX; j++)
{
if (rainline[i].start < rainline[i].length)
{
if (j < rainline[i].start)
{
rainline[i].point[j].ch = str[rand() % strlen(str)];
}
else
{
rainline[i].point[j].ch = ' ';
}
}
else
{
if (j<rainline[i].start&&j>(rainline[i].start - rainline[i].length))
{
rainline[i].point[j].ch = str[rand() % strlen(str)];
}
else
{
rainline[i].point[j].ch = ' ';
}
}
}
}
}