基于C语言实现见缝插针游戏的示例代码
短信预约 -IT技能 免费直播动态提醒
游戏说明
使用鼠标左键点击发射针,当两个针的夹角小于一定限制时,游戏结束。
亮点
这个游戏比较创新的地方就是可以用鼠标控制一个动态的过程,在循环中使用鼠标点击,并且鼠标消息不受延时函数的影响。以前写代码的时候,由于鼠标消息的原因,所以会选择多线程,但是参考了正确处理鼠标消息这篇文章,了解了鼠标消息的正确用法后,觉得有必要试试,就写了一个见缝插针游戏。我觉得学习不仅就是把别人的东西学会,而且需要在学习之后实践。
期待
见缝插针游戏我只是写了一个大致的框架,重点是为了实践鼠标消息的处理,如果需要将这个游戏进一步开发,可以在针的转速,长短,以及在插在球上面针的数量上进行设置不同的关卡。
效果图
代码
#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语言见缝插针游戏内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341