基于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語言實(shí)現(xiàn)求解素?cái)?shù)的N種方法總結(jié)
哈嘍各位友友們,今天又學(xué)到了很多有趣的知識(shí),現(xiàn)在迫不及待的想和大家分享一下!本文將手把手帶領(lǐng)大家探討利用試除法、篩選法求解素?cái)?shù)的n層境界!都是精華內(nèi)容,可不要錯(cuò)過喲2023-01-01
C語言strlen,strcpy,strcmp,strcat,strstr字符串操作函數(shù)實(shí)現(xiàn)
這篇文章主要介紹了C語言strlen,strcpy,strcmp,strcat,strstr字符串操作函數(shù)實(shí)現(xiàn),,文章圍繞主題展開詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以參考一下2022-09-09
標(biāo)準(zhǔn)CSV格式的介紹和分析以及解析算法實(shí)例詳解
這篇文章主要介紹了標(biāo)準(zhǔn)CSV格式的介紹和分析以及解析算法實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2016-12-12
C語言實(shí)現(xiàn)小學(xué)生隨機(jī)出題測(cè)試計(jì)分
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)小學(xué)生隨機(jī)出題測(cè)試計(jì)分,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2019-03-03
C語言實(shí)現(xiàn)宿舍管理課程設(shè)計(jì)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)宿舍管理課程設(shè)計(jì),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-03-03

