极简 代码雨/屏保 c++代码,原创。
此代码雨也可以作秀告白。
基于Easyx,
在vs端使用,
若是其他编译器自行修改scanf等函数。
也就 百行 而已。
先放效果图吧:
若想直接体验,
百度网盘软件如下:
链接:https://pan.baidu.com/s/1h_k7K863o55Z7q6lhkuQWw
提取码:1234
------------------------------------------- 重大更新 -------------------------------------------
2020.12.2——如果vs报错,outtextxy无法找到重构,
解决办法:项目——属性
1.顶部平台(改为所有平台)
2.左侧配置属性——高级——字符集(改为使用多节字符集)
------------------------------------------- 重大更新 -------------------------------------------
代码如下:
#include<graphics.h> #include<cstdio> #include<Windows.h> #include<cstring> #define N 50 #define M 10 int X, Y, n, choice; char SS[20][9]; struct pt { TCHAR s[M]; int x, y; int a, b, c; }S[N]; void Init(int i) { for (int k = 0; k <= M; ++k) { if (rand() % 3) { S[i].s[k] = 'a' + rand() % 26; } else S[i].s[k] = '0' + rand() % 9; } S[i].x = rand() % X; S[i].y = rand() % Y; if (!rand() % 3)S[i].y = 0; do { S[i].a = rand() % 240; S[i].b = rand() % 240; S[i].c = rand() % 240; } while (S[i].a + S[i].b + S[i].c < 510); } void out_s() { int i, k; for (i = 0, k = 0; i < N; ++i, k = 0) { settextcolor(RGB(255, 255, 255)); outtextxy(S[i].x, S[i].y + k * 16, S[i].s[k]); for (; k < n; ++k) { int x = (M - k + 1) / (double)M * S[i].a; int y = (M - k + 1) / (double)M * S[i].b; int z = (M - k + 1) / (double)M * S[i].c; settextcolor(RGB(x, y, z)); if(choice!=3)outtextxy(S[i].x, S[i].y + k * 16, SS[k]); else outtextxy(S[i].x, S[i].y + k * 16, S[i].s[k]); } S[i].y++; if (S[i].y > Y) Init(i); } } int main() { do { system("cls"); puts(" 输入选择:"); printf_s("************** "); printf_s("| 1.告白 | "); printf_s("| 2.自由 | "); printf_s("| 3.耍帅 | "); printf_s("************** "); scanf_s("%d", &choice); } while (choice != 1 && choice != 2 && choice != 3); if (choice == 1) { puts("输入名字个数"); scanf_s("%d", &n); puts("输入名字,格式如:张 二 蛋 每个字之间必须要空格"); for (int i = 0; i < n; ++i) scanf_s("%s", SS[i],10); strcpy_s(SS[n], "我"); strcpy_s(SS[n + 1], "爱"); strcpy_s(SS[n + 2], "你"); n += 3; } else if (choice == 2) { puts("先输入所想语句的字数,20字以内"); scanf_s("%d", &n); puts("输入语句,格式如:张 二 蛋 每个字之间必须要空格"); for (int i = 0; i < n; ++i) scanf_s("%s", SS[i], 10); } else n = M; int Choice; do { system("cls"); puts(" 请选择模式:"); printf_s("************** "); printf_s("| 1.慕雨 | "); printf_s("| 2.屏保 | "); printf_s("************** "); puts("若要关掉屏保模式,请按开始键,在任务栏关掉程序嗷"); scanf_s("%d", &Choice); } while (Choice != 1 && Choice != 2); X = GetSystemMetrics(SM_CXSCREEN); Y = GetSystemMetrics(SM_CYSCREEN); HWND hwnd = initgraph(X, Y);// 获取窗口句柄 for (int i = 0; i < N; ++i)Init(i); //SetWindowText(hwnd, "Hello!");// 设置窗口标题文字 SetWindowLong(hwnd, GWL_STYLE, GetWindowLong(hwnd, GWL_STYLE) - WS_CAPTION);//透明框架 SetWindowPos(hwnd, HWND_TOPMOST, 0, 0, X, Y, SWP_SHOWWINDOW);//定位 //屏保模式注意: //要返回界面就 按开始键 在 任务栏 关掉程序 //要返回界面就 按开始键 在 任务栏 关掉程序 //要返回界面就 按开始键 在 任务栏 关掉程序 //下面这部分注释掉就变成屏保了(实际占用偏高cpu,并不算是屏保) ///* if (Choice == 1) { LONG WindowLong = GetWindowLong(hwnd, GWL_EXSTYLE) | WS_EX_LAYERED; SetWindowLong(hwnd, GWL_EXSTYLE, WindowLong);//窗口风格 SetLayeredWindowAttributes(hwnd, RGB(0, 0, 0), 0, LWA_COLORKEY);//透明底色 } //*/ while (1) { BeginBatchDraw(); out_s(); EndBatchDraw(); Sleep(5); cleardevice(); } return 0; }
2020.8.10——(更新)1.添加20以内的自由模式,提高功能性 2.添加屏保选项,不用改代码直接选择。没有更新图片,都差不多,没必要。
此放所用函数说明网址:
1.GetSystemMetrics,我在前博客Easyx基础里发过说明
2.SetWindowLong,https://baike.baidu.com/item/SetWindowLong/6375538?fr=aladdin
3.GetWindowLong,https://blog.csdn.net/hnhyhongmingjiang/article/details/2154410 + https://baike.baidu.com/item/GetWindowLong/6375452?fr=aladdin
4.WS_CAPTION,https://blog.csdn.net/weixin_36929359/article/details/54342859
5.SetWindowPos,https://baike.baidu.com/item/SetWindowPos/6376849?fr=aladdin
6.WS_EX_LAYERED,https://blog.csdn.net/tyhjtw/article/details/38107577
7.SetLayeredWindowAttributes,https://baike.baidu.com/item/SetLayeredWindowAttributes/10134503