怎么用C语言制作表白神器
短信预约 -IT技能 免费直播动态提醒
今天小编给大家分享一下怎么用C语言制作表白神器的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。
程序说明
这是一个表白神器,可以自己替换上图片识别。
程序默认是识别 640×480 尺寸,可以自己调整。
也有现成的程序可以联系我获取,给程序加了图标和更方便的替换 img 方式。
操作说明
需要提供一张图片在项目根目录下进行识别!
或者可以不用掩码图片的方案:
// 初始化图片 IMAGE img; loadimage(&img, IMGNAME); SetWorkingImage(&img); // 设置 img为绘制设备 COLORREF color; // 记录像素颜色 BYTE r, b, g; // 记录像素RGB
将上方的代码改为:
// 初始化图片 IMAGE img(SCREEN_WIDTH, SCREEN_HEIGHT); //loadimage(&img, IMGNAME); SetWorkingImage(&img); // 设置 img为绘制设备 setbkcolor(WHITE); cleardevice(); settextcolor(BLACK); settextstyle(120, 55, _T("黑体")); outtextxy(100, 50, _T("我想和你")); outtextxy(100, 250, _T("有一个家")); COLORREF color; // 记录像素颜色 BYTE r, b, g; // 记录像素RGB
程序效果
完整源码
#include <graphics.h> #define MAX_STAR 500// 雪花数量上限#define SCREEN_WIDTH 640// 屏幕宽度#define SCREEN_HEIGHT 480// 屏幕高度#define MAX_STEP 3// 雪花每次移动最高步长#define MAX_RADIUS 3// 雪花最大半径#define IMGNAME _T("img.jpg")// 图片名字 using namespace std; // 图片转数组(这个有很大优化空间的,需要识别彩色照片可以看这)int imgList[SCREEN_HEIGHT][SCREEN_WIDTH] = { 0 }; // 雪花状态enum STATUS{STOP = 0,// 不动UP,// 向上DOWN,// 向下LEFT,// 向左RIGHT,// 向右RANDOM,// 随机ALL_STATUS// 记录状态总数};struct STAR{int x;// 雪花的 x 坐标int y;// 雪花的 y 坐标enum STATUS stat;// 雪花状态unsigned radius;// 雪花的半径int step;// 雪花每次移动的步长int color;// 雪花的颜色};struct SqList{struct STAR* elems; // 顺序表的基地址int length;// 顺序表的长度int size;// 顺序表的空间}; // 顺序表的接口bool initList(SqList& L);bool listAppend(SqList& L, struct STAR e);bool listDelete(SqList& L, int i);void destroyList(SqList& L); bool initList(SqList& L){L.elems = new struct STAR[MAX_STAR];if (!L.elems) return false;L.length = 0;L.size = MAX_STAR;return true;}bool listAppend(SqList& L, struct STAR e){if (L.length == L.size) return false;// 存储空间已满L.elems[L.length] = e;L.length++;// 表长加 1return true;}bool listDelete(SqList& L, int i){if (i < 0 || i >= L.length) return false;if (i == L.length - 1){// 删除最后一个元素L.length--;return true;}for (int j = i; j < L.length - 1; j++){L.elems[j] = L.elems[j + 1];// 删除位置的后续元素一次往前移}L.length--;return true;}void destroyList(SqList& L){if (L.elems) delete[]L.elems;// 释放存储空间L.length = 0;L.size = 0;} void MoveStar(SqList& L, int i){// 留下雪痕if (L.elems[i].stat == DOWN){if (imgList[L.elems[i].y][L.elems[i].x] == 1){L.elems[i].y += L.elems[i].step;L.elems[i].x -= 2;}}if (L.elems[i].stat == UP){if (imgList[L.elems[i].y][L.elems[i].x] == 1){L.elems[i].y -= L.elems[i].step;L.elems[i].x -= 2;}}if (L.elems[i].stat == LEFT){if (imgList[L.elems[i].y][L.elems[i].x] == 1) L.elems[i].x -= L.elems[i].step;}if (L.elems[i].stat == RIGHT){if (imgList[L.elems[i].y][L.elems[i].x] == 1) L.elems[i].x += L.elems[i].step;} if (L.elems[i].stat == STOP) return;// 擦除原来的雪花setfillcolor(BLACK);solidcircle(L.elems[i].x, L.elems[i].y, L.elems[i].radius);if (L.elems[i].stat == DOWN){L.elems[i].y += L.elems[i].step;L.elems[i].x -= 2;if (L.elems[i].x < 0) L.elems[i].x = SCREEN_WIDTH;if (L.elems[i].y > SCREEN_HEIGHT) L.elems[i].y = 0;//if(L.elems[i].y>SCREEN_HEIGHT) listDelete(L, i);// 这段代码可以让飘出屏幕外的雪花消亡}else if (L.elems[i].stat == UP){L.elems[i].y -= L.elems[i].step;L.elems[i].x -= 2;if (L.elems[i].x < 0) L.elems[i].x = SCREEN_WIDTH;if (L.elems[i].y < 0) L.elems[i].y = SCREEN_HEIGHT;//if(L.elems[i].y<0) listDelete(L, i);}else if (L.elems[i].stat == LEFT){L.elems[i].x -= L.elems[i].step;if (L.elems[i].x > 0) L.elems[i].x = SCREEN_WIDTH;//if(L.elems[i].x<0) listDelete(L, i);}else if (L.elems[i].stat == RIGHT){L.elems[i].x += L.elems[i].step;if (L.elems[i].x > SCREEN_HEIGHT) L.elems[i].x = 0;//if(L.elems[i].x>SCREEN_WIDTH) listDelete(L, i);}setfillcolor(L.elems[i].color);solidcircle(L.elems[i].x, L.elems[i].y, L.elems[i].radius);} void initStar(struct STAR& _star){int rgb = 0;//rand() 得到随机数范围 0 - 32767 RAND_MAX_star.x = rand() % SCREEN_WIDTH;// x 范围 0 - SCREEN_WIDTH_star.y = rand() % SCREEN_HEIGHT;// y 范围 0 - SCREEN_HEIGHT//_star.stat = STATUS(rand() % 6);// 雪花状态:随机_star.stat = DOWN;// 雪花状态:向下_star.radius = 1 + rand() % MAX_RADIUS; // 半径控制 1 - MAX_RADIUS_star.step = rand() % MAX_STEP + 1;// 步长 1 - MAX_STEPrgb = 255 * _star.step / MAX_STEP;// RGB:0 - 255_star.color = RGB(rgb, rgb, rgb);} int main(){bool quit = false;struct STAR star;SqList starList; // 初始化屏幕initgraph(SCREEN_WIDTH, SCREEN_HEIGHT); // 初始化图片IMAGE img;loadimage(&img, IMGNAME);SetWorkingImage(&img);// 设置 img为绘制设备COLORREF color;// 记录像素颜色BYTE r, b, g;// 记录像素RGB for (int y = 0; y < SCREEN_HEIGHT; y++){for (int x = 0; x < SCREEN_WIDTH; x++){color = getpixel(x, y);// 获取像素颜色r = GetRValue(color);b = GetBValue(color);g = GetGValue(color);if (r < 200 && b < 200 && g < 200){// 判断需留下“雪痕”的数组位置imgList[y][x] = 1;}}} SetWorkingImage();// 设置回默认绘制设备cleardevice(); // 初始化保存雪花状态的顺序表initList(starList); for (int i = 0; i < MAX_STAR; i++){initStar(star);listAppend(starList, star);} for (int i = 0; i < starList.length; i++){setfillcolor(starList.elems[i].color);solidcircle(starList.elems[i].x, starList.elems[i].y,starList.elems[i].radius);} while (quit == false){for (int i = 0; i < starList.length; i++){MoveStar(starList, i);} if (starList.length == 0){// 若设置雪花离开屏幕后消亡,则会触发此退出quit = true;}Sleep(50);}system("pause");closegraph();return 0;}
以上就是“怎么用C语言制作表白神器”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网行业资讯频道。
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341