这是一个用C语言和easyX实现的刮刮乐小游戏,用鼠标左键可以刮开刮卡层。
刮卡操作通过掩码图实现,一张隐藏的待刮开背景图,一张掩码图。
快试试你能中大奖吗?
编译环境:visual c++ 6.0
第三方库:Easyx2022 注意需要提前安装easyX,如没有基础可以先了解easyX图形编程
1.引入easyx中头文件
#include <graphics.h>
2.宏定义
const int offsetx = 170;// 刮奖区的偏移 x 坐标 const int offsety = 260;// 刮奖区的偏移 y 坐标 IMAGE imgContent(300, 100);// 刮开后的内容 IMAGE imgMask(300, 100);// 已刮部分的掩码层
3.绘制刮刮卡
void DrawCard() { // 白色背景 setbkcolor(0xf0f0f0); cleardevice(); // 设置刮刮卡填充单元 IMAGE unit(32, 32); SetWorkingImage(&unit);// 设置绘图设备为 unit 对象 setbkcolor(0x1a3bf0);// 设置背景色 cleardevice(); settextstyle(20, 0, _T("Webdings"), 0, 0, 400, false, false, false, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, DEFAULT_PITCH);// 设置图标字体 settextcolor(0x152fe5); outtextxy(0, 16, 0x59);// 输出两个心 outtextxy(16, 0, 0x59); settextcolor(0x284ff5); outtextxy(0, 0, 0x73);// 输出两个问号 outtextxy(16, 16, 0x73); SetWorkingImage(); // 用 IMAGE 对象填充矩形区域 setfillstyle(BS_DIBPATTERN, NULL, &unit);// 设置填充模式 solidrectangle(150, 30, 490, 450);// 画填充矩形 TCHAR s[] = _T("刮刮乐"); settextstyle(80, 0, _T("黑体"), 0, 0, 400, false, false, false, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, DEFAULT_PITCH); setbkmode(TRANSPARENT); settextcolor(0x034089); outtextxy(offsetx + (300 - textwidth(s)) / 2 + 5, 105, s); settextcolor(0x10c2fe); outtextxy(offsetx + (300 - textwidth(s)) / 2, 100, s); // 设置覆盖层填充单元 IMAGE unit2(80, 50); SetWorkingImage(&unit2);// 设置绘图设备为 unit 对象 setbkcolor(LIGHTGRAY); cleardevice(); settextstyle(15, 0, _T("黑体"), 150, 150, 400, false, false, false, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, DEFAULT_PITCH); settextcolor(0x606060); outtextxy(10, 20, _T("刮奖区")); SetWorkingImage(); // 用 IMAGE 对象填充矩形区域 setfillstyle(BS_DIBPATTERN, NULL, &unit2);// 设置填充模式 solidrectangle(offsetx, offsety, offsetx + 300, offsety + 100);// 画填充矩形 } // 初始化刮奖区内容 void InitContent() { // 绘制刮奖区内容 SetWorkingImage(&imgContent); setbkcolor(0x05d5ff); cleardevice(); settextcolor(0x0024b8); TCHAR s1[] = _T("刷蓝桥杯真题"); TCHAR s2[] = _T("用Dotcpp!"); settextstyle(30, 0, _T("楷体"), 0, 0, 900, false, false, false, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, DEFAULT_PITCH); outtextxy((300 - textwidth(s1)) / 2, 10, s1); outtextxy((300 - textwidth(s2)) / 2, 50, s2); // 绘制刮卡的掩码图 SetWorkingImage(&imgMask); setbkcolor(BLACK); cleardevice(); setlinestyle(PS_SOLID, 10);// 设置刮卡操作的粗细 SetWorkingImage(); } // 实现刮卡操作 void Scrape(int x1, int y1, int x2, int y2) { SetWorkingImage(&imgMask); line(x1, y1, x2, y2); } // 显示刮卡效果 void Show() { IMAGE tmp = imgContent; SetWorkingImage(&tmp); putimage(0, 0, &imgMask, SRCAND);// 将背景图中未刮开的区域置为黑色 SetWorkingImage(); putimage(offsetx, offsety, &imgMask, 0x00220326);// 将覆盖层中已刮开的区域置为黑色 putimage(offsetx, offsety, &tmp, SRCPAINT);// 将背景图合并到覆盖层中 }
4.主函数
int main() { initgraph(640, 480);// 初始化图形窗口 DrawCard();// 绘制刮刮乐卡片 InitContent();// 初始化刮奖区内容 // 获取鼠标消息,实现刮卡操作 ExMessage msg; int x, y, oldx, oldy; bool scrape = false; while(true) { msg = getmessage(EM_MOUSE); switch(msg.message) { case WM_LBUTTONDOWN: scrape = true; x = oldx = msg.x - offsetx; y = oldy = msg.y - offsety; Scrape(oldx, oldy, x, y); break; case WM_LBUTTONUP: scrape = false; break; case WM_MOUSEMOVE: if (scrape) { oldx = x; oldy = y; x = msg.x - offsetx; y = msg.y - offsety; Scrape(oldx, oldy, x, y); } break; } // 显示当前结果 Show(); } return 0; }
完成
#include <graphics.h> const int offsetx = 170;// 刮奖区的偏移 x 坐标 const int offsety = 260;// 刮奖区的偏移 y 坐标 IMAGE imgContent(300, 100);// 刮开后的内容 IMAGE imgMask(300, 100);// 已刮部分的掩码层 // 绘制刮刮卡 void DrawCard() { // 白色背景 setbkcolor(0xf0f0f0); cleardevice(); // 设置刮刮卡填充单元 IMAGE unit(32, 32); SetWorkingImage(&unit);// 设置绘图设备为 unit 对象 setbkcolor(0x1a3bf0);// 设置背景色 cleardevice(); settextstyle(20, 0, _T("Webdings"), 0, 0, 400, false, false, false, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, DEFAULT_PITCH);// 设置图标字体 settextcolor(0x152fe5); outtextxy(0, 16, 0x59);// 输出两个心 outtextxy(16, 0, 0x59); settextcolor(0x284ff5); outtextxy(0, 0, 0x73);// 输出两个问号 outtextxy(16, 16, 0x73); SetWorkingImage(); // 用 IMAGE 对象填充矩形区域 setfillstyle(BS_DIBPATTERN, NULL, &unit);// 设置填充模式 solidrectangle(150, 30, 490, 450);// 画填充矩形 TCHAR s[] = _T("刮刮乐"); settextstyle(80, 0, _T("黑体"), 0, 0, 400, false, false, false, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, DEFAULT_PITCH); setbkmode(TRANSPARENT); settextcolor(0x034089); outtextxy(offsetx + (300 - textwidth(s)) / 2 + 5, 105, s); settextcolor(0x10c2fe); outtextxy(offsetx + (300 - textwidth(s)) / 2, 100, s); // 设置覆盖层填充单元 IMAGE unit2(80, 50); SetWorkingImage(&unit2);// 设置绘图设备为 unit 对象 setbkcolor(LIGHTGRAY); cleardevice(); settextstyle(15, 0, _T("黑体"), 150, 150, 400, false, false, false, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, DEFAULT_PITCH); settextcolor(0x606060); outtextxy(10, 20, _T("刮奖区")); SetWorkingImage(); // 用 IMAGE 对象填充矩形区域 setfillstyle(BS_DIBPATTERN, NULL, &unit2);// 设置填充模式 solidrectangle(offsetx, offsety, offsetx + 300, offsety + 100);// 画填充矩形 } // 初始化刮奖区内容 void InitContent() { // 绘制刮奖区内容 SetWorkingImage(&imgContent); setbkcolor(0x05d5ff); cleardevice(); settextcolor(0x0024b8); TCHAR s1[] = _T("刷蓝桥杯真题"); TCHAR s2[] = _T("用Dotcpp!"); settextstyle(30, 0, _T("楷体"), 0, 0, 900, false, false, false, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, DEFAULT_PITCH); outtextxy((300 - textwidth(s1)) / 2, 10, s1); outtextxy((300 - textwidth(s2)) / 2, 50, s2); // 绘制刮卡的掩码图 SetWorkingImage(&imgMask); setbkcolor(BLACK); cleardevice(); setlinestyle(PS_SOLID, 10);// 设置刮卡操作的粗细 SetWorkingImage(); } // 实现刮卡操作 void Scrape(int x1, int y1, int x2, int y2) { SetWorkingImage(&imgMask); line(x1, y1, x2, y2); } // 显示刮卡效果 void Show() { IMAGE tmp = imgContent; SetWorkingImage(&tmp); putimage(0, 0, &imgMask, SRCAND);// 将背景图中未刮开的区域置为黑色 SetWorkingImage(); putimage(offsetx, offsety, &imgMask, 0x00220326);// 将覆盖层中已刮开的区域置为黑色 putimage(offsetx, offsety, &tmp, SRCPAINT);// 将背景图合并到覆盖层中 } // 主函数 int main() { initgraph(640, 480);// 初始化图形窗口 DrawCard();// 绘制刮刮乐卡片 InitContent();// 初始化刮奖区内容 // 获取鼠标消息,实现刮卡操作 ExMessage msg; int x, y, oldx, oldy; bool scrape = false; while(true) { msg = getmessage(EM_MOUSE); switch(msg.message) { case WM_LBUTTONDOWN: scrape = true; x = oldx = msg.x - offsetx; y = oldy = msg.y - offsety; Scrape(oldx, oldy, x, y); break; case WM_LBUTTONUP: scrape = false; break; case WM_MOUSEMOVE: if (scrape) { oldx = x; oldy = y; x = msg.x - offsetx; y = msg.y - offsety; Scrape(oldx, oldy, x, y); } break; } // 显示当前结果 Show(); } return 0; }
本文固定URL:https://www.dotcpp.com/course/1334
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程