Dotcpp  >  编程教程  >  C/C++工具及其他类项目  >  C语言实现刮刮乐小游戏教程及源码

C语言实现刮刮乐小游戏教程及源码

点击打开在线编译器,边学边练

一、项目介绍

这是一个用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、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

趣味项目教程
第一章 C/C++游戏类项目
第二章 C/C++工具及其他类项目
第三章 Python趣味项目
Dotcpp在线编译      (登录可减少运行等待时间)