基于C语言实现见缝插针游戏的示例代码
游戏说明
使用鼠标左键点击发射针,当两个针的夹角小于一定限制时,游戏结束。
亮点
这个游戏比较创新的地方就是可以用鼠标控制一个动态的过程,在循环中使用鼠标点击,并且鼠标消息不受延时函数的影响。以前写代码的时候,由于鼠标消息的原因,所以会选择多线程,但是参考了正确处理鼠标消息这篇文章,了解了鼠标消息的正确用法后,觉得有必要试试,就写了一个见缝插针游戏。我觉得学习不仅就是把别人的东西学会,而且需要在学习之后实践。
期待
见缝插针游戏我只是写了一个大致的框架,重点是为了实践鼠标消息的处理,如果需要将这个游戏进一步开发,可以在针的转速,长短,以及在插在球上面针的数量上进行设置不同的关卡。
效果图
代码
#include<graphics.h> #include<conio.h> #include<math.h> #include<time.h> #define PI acos(-1.0) #define SPEED (PI/360) // 针的旋转速度 #define NEEDLE_L 180 // 针的长度 void HpSleep(int ms); // 精确延时 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 }; // 储存针的弧度 int Needle_N = 0; // 针的个数 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()) // 当有鼠标消息的时候执行 { msg = GetMouseMsg(); // 获取鼠标消息 switch (msg.uMsg) // 根据不同的鼠标消息,执行不同的代码 { case WM_LBUTTONDOWN: if (Pin(radian, Needle_N)) { Needle_N++; } else { IS = true; }break; } } if (IS) { break; } HpSleep(10); // 延时,降低 CPU 占用率 } HWND wnd = GetHWnd(); if (MessageBox(wnd, _T("游戏结束。\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; // 不需要再次进行比较了,循环跳出 } } 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); } // 精确延时函数(可以精确到 1ms,精度 ±1ms) // 记得加头文件 time.h // by yangw80<yw80@qq.com>, 2011-5-4 void HpSleep(int ms) { static clock_t oldclock = clock(); // 静态变量,记录上一次 tick oldclock += ms * CLOCKS_PER_SEC / 1000; // 更新 tick if (clock() > oldclock) // 如果已经超时,无需延时 oldclock = clock(); else while (clock() < oldclock) // 延时 Sleep(1); // 释放 CPU 控制权,降低 CPU 占用率 }
到此这篇关于基于C语言实现见缝插针游戏的示例代码的文章就介绍到这了,更多相关C语言见缝插针游戏内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
C++11新特性之智能指针(shared_ptr/unique_ptr/weak_ptr)
这篇文章主要介绍了C++11新特性之智能指针,包括shared_ptr, unique_ptr和weak_ptr的基本使用,感兴趣的小伙伴们可以参考一下2016-08-08
最新评论