以下代码实现了代码雨的一些基本功能
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <time.h>#define XMAX 150
#define YMAX 35
#define RAINLINES 50char *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 = ' ';}}}}
}