C语言制作表白神器的示例代码
短信预约 -IT技能 免费直播动态提醒
程序说明
这是一个表白神器,可以自己替换上图片识别。
1.程序默认是识别 640×480 尺寸,可以自己调整。
2.也有现成的程序可以联系我获取,给程序加了图标和更方便的替换 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++; // 表长加 1
return 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_STEP
rgb = 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;
}
示例资源(img.jpg)
到此这篇关于C语言制作表白神器的示例代码的文章就介绍到这了,更多相关C语言表白神器内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341