基于C语言实现见缝插针游戏的示例代码

 更新时间:2022年11月10日 08:36:55   作者:编程小鱼六六六  
见缝插针游戏就是使用鼠标左键点击发射针,当两个针的夹角小于一定限制时,游戏结束。本文将用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)

    这篇文章主要介绍了C++11新特性之智能指针,包括shared_ptr, unique_ptr和weak_ptr的基本使用,感兴趣的小伙伴们可以参考一下
    2016-08-08
  • C++使用cuBLAS加速矩阵乘法运算的实现代码

    C++使用cuBLAS加速矩阵乘法运算的实现代码

    这篇文章主要介绍了C++使用cuBLAS加速矩阵乘法运算,将cuBLAS库的乘法运算进行了封装,方便了算法调用,具体实现代码跟随小编一起看看吧
    2021-09-09
  • OpenCV实现彩色照片转换成素描卡通片

    OpenCV实现彩色照片转换成素描卡通片

    这篇文章主要为大家详细介绍了OpenCV实现彩色照片转换成素描卡通片,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-01-01
  • C语言近万字为你讲透树与二叉树

    C语言近万字为你讲透树与二叉树

    树是计算机算法最重要的非线性结构。因为树能很好地描述结构的分支关系和层次特性,所以在计算机科学和计算机应用领域有着广泛的应用。这篇文章我就带大家一起了解一下树、二叉树这种结构,下篇文章会重点向大家介绍二叉树的遍历算法
    2022-05-05
  • 算法详解之分治法具体实现

    算法详解之分治法具体实现

    这篇文章主要介绍了算法详解之分治法具体实现,需要的朋友可以参考下
    2014-02-02
  • C语言实现简单电子通讯录

    C语言实现简单电子通讯录

    这篇文章主要为大家详细介绍了C语言实现简单电子通讯录,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-06-06
  • 详解C++11 变参模板

    详解C++11 变参模板

    这篇文章主要介绍了C++11 变参模板的相关资料,帮助大家更好的理解和学习c++11,感兴趣的朋友可以了解下
    2020-08-08
  • C++实现酒店管理系统

    C++实现酒店管理系统

    这篇文章主要为大家详细介绍了C++实现酒店管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-08-08
  • C语言完美实现动态数组代码分享

    C语言完美实现动态数组代码分享

    本文给大家分享的是一则使用C语言实现动态数组的代码,完美解决内存溢出以及内存回收问题,有需要的小伙伴可以参考下。
    2016-02-02
  • 一文带你了解C语言中static关键字的3个作用

    一文带你了解C语言中static关键字的3个作用

    static这个关键字是“静态”的意思,在C语言里主要有3个作用。这篇文章主要通过一些简单示例为大家详细讲讲这3个左右,感兴趣的小伙伴可以了解一下
    2023-04-04

最新评论