基于C語言實(shí)現(xiàn)見縫插針游戲的示例代碼
游戲說明
使用鼠標(biāo)左鍵點(diǎn)擊發(fā)射針,當(dāng)兩個(gè)針的夾角小于一定限制時(shí),游戲結(jié)束。
亮點(diǎn)
這個(gè)游戲比較創(chuàng)新的地方就是可以用鼠標(biāo)控制一個(gè)動(dòng)態(tài)的過程,在循環(huán)中使用鼠標(biāo)點(diǎn)擊,并且鼠標(biāo)消息不受延時(shí)函數(shù)的影響。以前寫代碼的時(shí)候,由于鼠標(biāo)消息的原因,所以會(huì)選擇多線程,但是參考了正確處理鼠標(biāo)消息這篇文章,了解了鼠標(biāo)消息的正確用法后,覺得有必要試試,就寫了一個(gè)見縫插針游戲。我覺得學(xué)習(xí)不僅就是把別人的東西學(xué)會(huì),而且需要在學(xué)習(xí)之后實(shí)踐。
期待
見縫插針游戲我只是寫了一個(gè)大致的框架,重點(diǎn)是為了實(shí)踐鼠標(biāo)消息的處理,如果需要將這個(gè)游戲進(jìn)一步開發(fā),可以在針的轉(zhuǎn)速,長短,以及在插在球上面針的數(shù)量上進(jìn)行設(shè)置不同的關(guān)卡。
效果圖
代碼
#include<graphics.h> #include<conio.h> #include<math.h> #include<time.h> #define PI acos(-1.0) #define SPEED (PI/360) // 針的旋轉(zhuǎn)速度 #define NEEDLE_L 180 // 針的長度 void HpSleep(int ms); // 精確延時(shí) void drawframe(int number); void Move(int number, int x, int y); void Rotate(double *R,int num); bool Pin(double *R, int num); void eraser(int x, int y); int main() { initgraph(480, 640); while (true) { setbkcolor(RGB(189, 188, 187)); cleardevice(); drawframe(1); double radian[25] = { 0 }; // 儲(chǔ)存針的弧度 int Needle_N = 0; // 針的個(gè)數(shù) MOUSEMSG msg; bool IS = false; while (true) { Move(Needle_N, 240, 560); // 繪制針的位置 Move(Needle_N + 1, 240, 600); Move(Needle_N + 2, 240, 640); Rotate(radian, Needle_N); while (MouseHit()) // 當(dāng)有鼠標(biāo)消息的時(shí)候執(zhí)行 { msg = GetMouseMsg(); // 獲取鼠標(biāo)消息 switch (msg.uMsg) // 根據(jù)不同的鼠標(biāo)消息,執(zhí)行不同的代碼 { case WM_LBUTTONDOWN: if (Pin(radian, Needle_N)) { Needle_N++; } else { IS = true; }break; } } if (IS) { break; } HpSleep(10); // 延時(shí),降低 CPU 占用率 } HWND wnd = GetHWnd(); if (MessageBox(wnd, _T("游戲結(jié)束。\n重來一局嗎?"), _T("詢問"), MB_YESNO | MB_ICONQUESTION) == IDYES) continue; else break; } return 0; } void drawframe(int number) { TCHAR str[25]; _stprintf_s(str, _T("%d"), number); setfillcolor(RGB(70, 70, 69)); solidcircle(240, 240, 50); setbkmode(TRANSPARENT); settextstyle(50, 0, _T("黑體"), 0, 0, FW_BLACK, false, false, false); settextcolor(WHITE); RECT r = { 190, 190, 290, 290 }; drawtext(str, &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE); } void Move(int number, int x, int y) { setfillcolor(RGB(70, 70, 69)); solidcircle(x, y, 20); setbkmode(TRANSPARENT); settextstyle(15, 0, _T("黑體")); settextcolor(WHITE); RECT r = { x - 20, y - 20, x + 20, y + 20 }; TCHAR str[25]; _stprintf_s(str, _T("%d"), number); drawtext(str, &r, DT_CENTER | DT_VCENTER | DT_SINGLELINE); } void Rotate(double *R, int num) { int X_NEEDLE; int Y_NEEDLE; BeginBatchDraw(); for (int i = 0; i < num; i++) { FlushBatchDraw(); eraser(int(NEEDLE_L * cos(R[i]) + 240),int(NEEDLE_L * sin(R[i]) + 240)); R[i] = R[i] + SPEED; if (R[i] > 2 * PI) { R[i] = R[i] - 2 * PI; } X_NEEDLE = int (NEEDLE_L * cos(R[i]) + 240); Y_NEEDLE = int (NEEDLE_L * sin(R[i]) + 240); setlinestyle(PS_SOLID, 3); setlinecolor(RGB(70, 70, 69)); line(X_NEEDLE, Y_NEEDLE, 240, 240); Move(i,X_NEEDLE,Y_NEEDLE); drawframe(1); } EndBatchDraw(); } bool Pin(double *R, int num) { int X_NEEDLE; int Y_NEEDLE; setlinestyle(PS_SOLID, 3); setlinecolor(RGB(70, 70, 69)); bool T = true; R[num] = PI / 2; X_NEEDLE = int(NEEDLE_L * cos(R[num]) + 240); Y_NEEDLE = int(NEEDLE_L * sin(R[num]) + 240); line(X_NEEDLE, Y_NEEDLE, 240, 290); Move(num, X_NEEDLE, Y_NEEDLE); for (int i = 0; i < num; i++) { if (fabs(R[num] - R[i]) < (PI / 15)) { T = false; break; // 不需要再次進(jìn)行比較了,循環(huán)跳出 } } return T; // 如果失敗返回false; } void eraser(int x, int y) { setfillcolor(RGB(189, 188, 187)); solidcircle(x, y, 20); setlinestyle(PS_SOLID, 3); setlinecolor(RGB(189, 188, 187)); line(x, y, 240, 240); } // 精確延時(shí)函數(shù)(可以精確到 1ms,精度 ±1ms) // 記得加頭文件 time.h // by yangw80<yw80@qq.com>, 2011-5-4 void HpSleep(int ms) { static clock_t oldclock = clock(); // 靜態(tài)變量,記錄上一次 tick oldclock += ms * CLOCKS_PER_SEC / 1000; // 更新 tick if (clock() > oldclock) // 如果已經(jīng)超時(shí),無需延時(shí) oldclock = clock(); else while (clock() < oldclock) // 延時(shí) Sleep(1); // 釋放 CPU 控制權(quán),降低 CPU 占用率 }
到此這篇關(guān)于基于C語言實(shí)現(xiàn)見縫插針游戲的示例代碼的文章就介紹到這了,更多相關(guān)C語言見縫插針游戲內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++11新特性之智能指針(shared_ptr/unique_ptr/weak_ptr)
這篇文章主要介紹了C++11新特性之智能指針,包括shared_ptr, unique_ptr和weak_ptr的基本使用,感興趣的小伙伴們可以參考一下2016-08-08C++使用cuBLAS加速矩陣乘法運(yùn)算的實(shí)現(xiàn)代碼
這篇文章主要介紹了C++使用cuBLAS加速矩陣乘法運(yùn)算,將cuBLAS庫的乘法運(yùn)算進(jìn)行了封裝,方便了算法調(diào)用,具體實(shí)現(xiàn)代碼跟隨小編一起看看吧2021-09-09OpenCV實(shí)現(xiàn)彩色照片轉(zhuǎn)換成素描卡通片
這篇文章主要為大家詳細(xì)介紹了OpenCV實(shí)現(xiàn)彩色照片轉(zhuǎn)換成素描卡通片,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-01-01C語言完美實(shí)現(xiàn)動(dòng)態(tài)數(shù)組代碼分享
本文給大家分享的是一則使用C語言實(shí)現(xiàn)動(dòng)態(tài)數(shù)組的代碼,完美解決內(nèi)存溢出以及內(nèi)存回收問題,有需要的小伙伴可以參考下。2016-02-02一文帶你了解C語言中static關(guān)鍵字的3個(gè)作用
static這個(gè)關(guān)鍵字是“靜態(tài)”的意思,在C語言里主要有3個(gè)作用。這篇文章主要通過一些簡單示例為大家詳細(xì)講講這3個(gè)左右,感興趣的小伙伴可以了解一下2023-04-04