C語(yǔ)言自制測(cè)色弱找方塊游戲的示例代碼
程序介紹
該程序是仿照最近網(wǎng)上流行的找方塊游戲編寫的,雖然沒有仿照的一模一樣,但是也實(shí)現(xiàn)了他的一些功能。個(gè)人覺得可玩性還是挺高的,是一個(gè)不錯(cuò)的娛樂放松的游戲。
編寫簡(jiǎn)介
該游戲的編寫還是挺容易的,可以大致分為三步。第一步,生成一個(gè)界面。第二步,使用鼠標(biāo)獲取不同顏色的方塊。第三步,刷新屏幕。需要注意的地方就是其中的細(xì)節(jié)與動(dòng)態(tài)效果,都是些高中物理知識(shí)。
效果圖
找方塊運(yùn)行效果:
源碼分享
/// // 程序名稱:找方塊 // 編譯環(huán)境:Mictosoft Visual Studio 2013, EasyX_20200315(beta) //更多好玩源碼加Q群:724050348 // #include<graphics.h> #include<conio.h> #include<stdio.h> #include<time.h> struct POS // 一個(gè)點(diǎn)的結(jié)構(gòu)體 { int x; int y; COLORREF color; }; void Interface(int Level, int Mark); // 繪制界面 Level 為關(guān)卡數(shù),Mark 為分?jǐn)?shù) POS InitColor(int Grade); // 初始化顏色和方塊的位置 Grade 難度等級(jí) 返回坐標(biāo) int GetNum(int Mark); // 判斷一個(gè)數(shù)字是幾位數(shù) void GameOver(); // 游戲結(jié)束 void AddMark(POS pos, int addMark); // 加分顯示以及方塊與分?jǐn)?shù)的平移 void ShowIips(); // 顯示提示 int main() { initgraph(800, 600); int Level = 1; int Mark = 0; while (true) { int BeginTime = clock(); int GameState = 0; // 游戲狀態(tài) Interface(Level, Mark); POS pos = InitColor(Level / 10); MOUSEMSG m; while (true) { m = GetMouseMsg(); switch (m.uMsg) { case WM_LBUTTONDOWN: if (pos.x - 35 < m.x && pos.x + 35 > m.x && pos.y - 35 < m.y && pos.y + 35 > m.y) { GameState = 1; } else { setlinecolor(WHITE); setlinestyle(PS_SOLID | PS_ENDCAP_SQUARE, 4); line(m.x - 10, m.y - 10, m.x + 10, m.y + 10); line(m.x + 10, m.y - 10, m.x - 10, m.y + 10); if (GameState == 2) { GameState = 3; } else { GameState = 2; } } break; } if (GameState == 1) { int EndTime = clock(); int Times = EndTime - BeginTime; int addMark = (int)(80000.0 / Times); AddMark(pos, addMark); Mark += addMark; Level++; break; } if (GameState == 2) { continue; } if (GameState == 3) { GameOver(); Level = 1; Mark = 0; break; } } } _getch(); return 0; } void Interface(int Level, int Mark) { setfillcolor(BLACK); bar(0, 0, 800, 50); bar(0, 550, 800, 750); settextcolor(WHITE); settextstyle(30, 0, L"微軟雅黑"); TCHAR str[25]; _stprintf_s(str, _T("第 %d 關(guān)"), Level); outtextxy(50, 10, str); _stprintf_s(str, _T("%d"), Mark); outtextxy(750 - GetNum(Mark) * 15, 10, str); } POS InitColor(int Grade) { srand((unsigned int)time(NULL)); float H = (float)(rand() % 360); // 色相 float S = (rand() % 100) / 100.f; // 飽和度 float L = (rand() % 70 + 30) / 100.f; // 亮度 double h = 0; // 高度 double v = 0; // 速度(方向向下) double dv = 9.8 / 50; // 加速度(每 1/50 秒) BeginBatchDraw(); int x1, y1, x2, y2; x1 = 800; y1 = 50; x2 = 1600; y2 = 550; while (true) { v += dv; // 根據(jù)加速度計(jì)算速度 h -= (v - dv / 2); // 計(jì)算高度 x1 = x1 + (int)h; x2 = x2 + (int)h; setfillcolor(HSVtoRGB(H, S, L)); bar(x1, y1, x2, y2); ShowIips(); FlushBatchDraw(); Sleep(20); if (x1 <= 0) { break; } } EndBatchDraw(); POS pos; pos.x = rand() % 730 + 35; pos.y = rand() % 430 + 85; pos.color = HSVtoRGB(H, S, L); if (Grade == 0) { setfillcolor(HSVtoRGB(H, S, (L - 0.1f) < 0 ? L = L + 0.1f : L = L - 0.1f)); } if (Grade == 1) { setfillcolor(HSVtoRGB(H, (S - 0.1f) < 0 ? S = S + 0.1f : S = S - 0.1f, L)); } if (Grade >= 2) { setfillcolor(HSVtoRGB((H - 20) < 0 ? H = H + 20 : H = H - 20, S, L)); } bar(pos.x - 35, pos.y - 35, pos.x + 35, pos.y + 35); ShowIips(); return pos; } int GetNum(int Mark) { int sum = 0; while (Mark) { sum++; Mark /= 10; } return sum == 0 ? sum = 1 : sum; } void GameOver() { settextstyle(60, 0, L"微軟雅黑"); RECT r = { 0, 0, 800, 600 }; settextcolor(WHITE); drawtext(_T("游戲結(jié)束"), &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE); Sleep(1000); } void AddMark(POS pos, int addMark) { setfillcolor(WHITE); bar(pos.x - 35, pos.y - 35, pos.x + 35, pos.y + 35); setbkmode(TRANSPARENT); settextstyle(30, 0, L"微軟雅黑"); settextcolor(WHITE); TCHAR str[25]; _stprintf_s(str, _T("+%d"), addMark); POS textpos; textpos.x = pos.x - 20; textpos.y = pos.y - 35 - 30; textpos.color = WHITE; outtextxy(textpos.x, textpos.y, str); double k = textpos.y / (textpos.x - 700.0); double b = (700 * textpos.y) / (textpos.x - 700.0); double h = 0; // 高度 double v = 0; // 速度(方向向下) double dv = 9.8 / 50; // 加速度(每 1/50 秒) BeginBatchDraw(); while (true) { v += dv; // 根據(jù)加速度計(jì)算速度 h -= (v - dv / 2); // 計(jì)算高度 pos.y = pos.y - (int)h; setfillcolor(WHITE); settextcolor(WHITE); bar(pos.x - 35, pos.y - 35, pos.x + 35, pos.y + 35); textpos.x = textpos.x - (int)h; textpos.y = (int)(k*textpos.x - b); outtextxy(textpos.x, textpos.y, str); FlushBatchDraw(); Sleep(20); setfillcolor(pos.color); settextcolor(pos.color); outtextxy(textpos.x, textpos.y, str); bar(pos.x - 35, pos.y - 35, pos.x + 35, pos.y + 35); if (pos.y > 600 && textpos.x > 700) { break; } } EndBatchDraw(); } void ShowIips() { setbkmode(TRANSPARENT); settextstyle(30, 0, L"微軟雅黑"); RECT r = { 0, 50, 800, 100 }; settextcolor(RGB(252, 203, 147)); drawtext(_T("找出顏色不一樣的小方塊"), &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE); }
以上就是C語(yǔ)言自制測(cè)色弱找方塊游戲的示例代碼的詳細(xì)內(nèi)容,更多關(guān)于C語(yǔ)言測(cè)色弱找方塊游戲的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C語(yǔ)言實(shí)現(xiàn)線索二叉樹的定義與遍歷示例
這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)線索二叉樹的定義與遍歷,結(jié)合具體實(shí)例形式分析了基于C語(yǔ)言的線索二叉樹定義及遍歷操作相關(guān)實(shí)現(xiàn)技巧與注意事項(xiàng),需要的朋友可以參考下2017-06-06VScode配置C語(yǔ)言環(huán)境完整版(親測(cè)可用)
這篇文章主要介紹了VScode配置C語(yǔ)言環(huán)境完整版,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-08-08C++ 將文件數(shù)據(jù)一次性加載進(jìn)內(nèi)存實(shí)例代碼
這篇文章主要介紹了C++ 將文件數(shù)據(jù)一次性加載進(jìn)內(nèi)存實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2017-05-05