查看: 120|回复: 0

C语言表白神器代码

[复制链接]

2

主题

3

帖子

7

积分

新手上路

Rank: 1

积分
7
发表于 2023-4-3 10:35:26 | 显示全部楼层 |阅读模式
程序说明

这是一个表白神器,可以自己替换上图片识别。

  • 程序默认是识别 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程序效果



完整源码

/*        *************************
*        程序名称:        表白程序
*        编译环境:        VC2019,EasyX_20210224
*        ********* 说明 **********
*        需要自己提供一张大小为 640×480 的图片(img.jpg)在项目根目录下
*        大小可以在程序内更改,图片名字也可以。
*        *************************/
#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;
}

/************************************
* 功能:移动雪花,并在指定区域留下雪痕
* 输入参数:
* L - 雪花对象
* i - 雪花在全局数组中的下标
* 返回值:无
************************************/
void MoveStar(SqList& L, int i)
{
        // 留下雪痕
        if (L.elems.stat == DOWN)
        {
                if (imgList[L.elems.y][L.elems.x] == 1)
                {
                        L.elems.y += L.elems.step;
                        L.elems.x -= 2;
                }
        }
        if (L.elems.stat == UP)
        {
                if (imgList[L.elems.y][L.elems.x] == 1)
                {
                        L.elems.y -= L.elems.step;
                        L.elems.x -= 2;
                }
        }
        if (L.elems.stat == LEFT)
        {
                if (imgList[L.elems.y][L.elems.x] == 1) L.elems.x -= L.elems.step;
        }
        if (L.elems.stat == RIGHT)
        {
                if (imgList[L.elems.y][L.elems.x] == 1) L.elems.x += L.elems.step;
        }

        if (L.elems.stat == STOP) return;
        // 擦除原来的雪花
        setfillcolor(BLACK);
        solidcircle(L.elems.x, L.elems.y, L.elems.radius);
        if (L.elems.stat == DOWN)
        {
                L.elems.y += L.elems.step;
                L.elems.x -= 2;
                if (L.elems.x < 0) L.elems.x = SCREEN_WIDTH;
                if (L.elems.y > SCREEN_HEIGHT) L.elems.y = 0;
                //if(L.elems.y>SCREEN_HEIGHT) listDelete(L, i);        // 这段代码可以让飘出屏幕外的雪花消亡
        }
        else if (L.elems.stat == UP)
        {
                L.elems.y -= L.elems.step;
                L.elems.x -= 2;
                if (L.elems.x < 0) L.elems.x = SCREEN_WIDTH;
                if (L.elems.y < 0) L.elems.y = SCREEN_HEIGHT;
                //if(L.elems.y<0) listDelete(L, i);
        }
        else if (L.elems.stat == LEFT)
        {
                L.elems.x -= L.elems.step;
                if (L.elems.x > 0) L.elems.x = SCREEN_WIDTH;
                //if(L.elems.x<0) listDelete(L, i);
        }
        else if (L.elems.stat == RIGHT)
        {
                L.elems.x += L.elems.step;
                if (L.elems.x > SCREEN_HEIGHT) L.elems.x = 0;
                //if(L.elems.x>SCREEN_WIDTH) listDelete(L, i);
        }
        setfillcolor(L.elems.color);
        solidcircle(L.elems.x, L.elems.y, L.elems.radius);
}


/************************************
* 功能:初始化雪花
* 输入参数:
* i - 雪花在全局数组中的下标
* 返回值:无
************************************/
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.color);
                solidcircle(starList.elems.x, starList.elems.y,
                        starList.elems.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)



关注B站号:小鱼快来啊,+q粉丝群:725022484 免费领取300G精品编程资料
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表