一、項目介紹
這是一個用C語言和easyX實現(xiàn)的刮刮樂小游戲,用鼠標左鍵可以刮開刮卡層。
刮卡操作通過掩碼圖實現(xiàn),一張隱藏的待刮開背景圖,一張掩碼圖。
快試試你能中大獎嗎?
編譯環(huán)境:visual c++ 6.0
第三方庫:Easyx2022 注意需要提前安裝easyX,如沒有基礎(chǔ)可以先了解easyX圖形編程
二、運行截圖
三、代碼思路
1.引入easyx中頭文件
#include <graphics.h>
2.宏定義
const int offsetx = 170;// 刮獎區(qū)的偏移 x 坐標 const int offsety = 260;// 刮獎區(qū)的偏移 y 坐標 IMAGE imgContent(300, 100);// 刮開后的內(nèi)容 IMAGE imgMask(300, 100);// 已刮部分的掩碼層
3.繪制刮刮卡
void DrawCard() { // 白色背景 setbkcolor(0xf0f0f0); cleardevice(); // 設(shè)置刮刮卡填充單元 IMAGE unit(32, 32); SetWorkingImage(&unit);// 設(shè)置繪圖設(shè)備為 unit 對象 setbkcolor(0x1a3bf0);// 設(shè)置背景色 cleardevice(); settextstyle(20, 0, _T("Webdings"), 0, 0, 400, false, false, false, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, DEFAULT_PITCH);// 設(shè)置圖標字體 settextcolor(0x152fe5); outtextxy(0, 16, 0x59);// 輸出兩個心 outtextxy(16, 0, 0x59); settextcolor(0x284ff5); outtextxy(0, 0, 0x73);// 輸出兩個問號 outtextxy(16, 16, 0x73); SetWorkingImage(); // 用 IMAGE 對象填充矩形區(qū)域 setfillstyle(BS_DIBPATTERN, NULL, &unit);// 設(shè)置填充模式 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); // 設(shè)置覆蓋層填充單元 IMAGE unit2(80, 50); SetWorkingImage(&unit2);// 設(shè)置繪圖設(shè)備為 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("刮獎區(qū)")); SetWorkingImage(); // 用 IMAGE 對象填充矩形區(qū)域 setfillstyle(BS_DIBPATTERN, NULL, &unit2);// 設(shè)置填充模式 solidrectangle(offsetx, offsety, offsetx + 300, offsety + 100);// 畫填充矩形 } // 初始化刮獎區(qū)內(nèi)容 void InitContent() { // 繪制刮獎區(qū)內(nèi)容 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);// 設(shè)置刮卡操作的粗細 SetWorkingImage(); } // 實現(xiàn)刮卡操作 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);// 將背景圖中未刮開的區(qū)域置為黑色 SetWorkingImage(); putimage(offsetx, offsety, &imgMask, 0x00220326);// 將覆蓋層中已刮開的區(qū)域置為黑色 putimage(offsetx, offsety, &tmp, SRCPAINT);// 將背景圖合并到覆蓋層中 }
4.主函數(shù)
int main() { initgraph(640, 480);// 初始化圖形窗口 DrawCard();// 繪制刮刮樂卡片 InitContent();// 初始化刮獎區(qū)內(nèi)容 // 獲取鼠標消息,實現(xiàn)刮卡操作 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; } // 顯示當前結(jié)果 Show(); } return 0; }
完成
四、完整源碼
#include <graphics.h> const int offsetx = 170;// 刮獎區(qū)的偏移 x 坐標 const int offsety = 260;// 刮獎區(qū)的偏移 y 坐標 IMAGE imgContent(300, 100);// 刮開后的內(nèi)容 IMAGE imgMask(300, 100);// 已刮部分的掩碼層 // 繪制刮刮卡 void DrawCard() { // 白色背景 setbkcolor(0xf0f0f0); cleardevice(); // 設(shè)置刮刮卡填充單元 IMAGE unit(32, 32); SetWorkingImage(&unit);// 設(shè)置繪圖設(shè)備為 unit 對象 setbkcolor(0x1a3bf0);// 設(shè)置背景色 cleardevice(); settextstyle(20, 0, _T("Webdings"), 0, 0, 400, false, false, false, DEFAULT_CHARSET, OUT_DEFAULT_PRECIS, CLIP_DEFAULT_PRECIS, PROOF_QUALITY, DEFAULT_PITCH);// 設(shè)置圖標字體 settextcolor(0x152fe5); outtextxy(0, 16, 0x59);// 輸出兩個心 outtextxy(16, 0, 0x59); settextcolor(0x284ff5); outtextxy(0, 0, 0x73);// 輸出兩個問號 outtextxy(16, 16, 0x73); SetWorkingImage(); // 用 IMAGE 對象填充矩形區(qū)域 setfillstyle(BS_DIBPATTERN, NULL, &unit);// 設(shè)置填充模式 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); // 設(shè)置覆蓋層填充單元 IMAGE unit2(80, 50); SetWorkingImage(&unit2);// 設(shè)置繪圖設(shè)備為 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("刮獎區(qū)")); SetWorkingImage(); // 用 IMAGE 對象填充矩形區(qū)域 setfillstyle(BS_DIBPATTERN, NULL, &unit2);// 設(shè)置填充模式 solidrectangle(offsetx, offsety, offsetx + 300, offsety + 100);// 畫填充矩形 } // 初始化刮獎區(qū)內(nèi)容 void InitContent() { // 繪制刮獎區(qū)內(nèi)容 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);// 設(shè)置刮卡操作的粗細 SetWorkingImage(); } // 實現(xiàn)刮卡操作 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);// 將背景圖中未刮開的區(qū)域置為黑色 SetWorkingImage(); putimage(offsetx, offsety, &imgMask, 0x00220326);// 將覆蓋層中已刮開的區(qū)域置為黑色 putimage(offsetx, offsety, &tmp, SRCPAINT);// 將背景圖合并到覆蓋層中 } // 主函數(shù) int main() { initgraph(640, 480);// 初始化圖形窗口 DrawCard();// 繪制刮刮樂卡片 InitContent();// 初始化刮獎區(qū)內(nèi)容 // 獲取鼠標消息,實現(xiàn)刮卡操作 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; } // 顯示當前結(jié)果 Show(); } return 0; }
C語言網(wǎng)提供由在職研發(fā)工程師或ACM藍橋杯競賽優(yōu)秀選手錄制的視頻教程,并配有習題和答疑,點擊了解:
一點編程也不會寫的:零基礎(chǔ)C語言學練課程
解決困擾你多年的C語言疑難雜癥特性的C語言進階課程
從零到寫出一個爬蟲的Python編程課程
只會語法寫不出代碼?手把手帶你寫100個編程真題的編程百練課程
信息學奧賽或C++選手的 必學C++課程
藍橋杯ACM、信息學奧賽的必學課程:算法競賽課入門課程
手把手講解近五年真題的藍橋杯輔導課程