我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

基于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语言见缝插针游戏内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

见缝插针游戏就是使用鼠标左键点击发射针,当两个针的夹角小于一定限制时,游戏结束。本文将用C语言实现这一有趣游戏,感兴趣的可以了解一下
2022-11-13

基于C语言实现钻石棋游戏的示例代码

独立钻石是源于18世纪法国的宫廷贵族的自我挑战类单人棋游戏,可以锻炼逻辑思维能力。本文将用C语言实现这一简单的游戏,感兴趣的小伙伴可以了解一下
2023-02-26

基于C语言自制华容道游戏的示例代码

这篇文章主要为大家详细介绍了如何利用C语言自制华容道游戏,文中的示例代码讲解详细,对我们学习C语言有一定的帮助,感兴趣的小伙伴可以跟随小编一起了解一下
2023-03-20

C语言实现扫雷小游戏的示例代码

这篇文中主要为大家详细介绍了如何利用C语言实现经典的扫雷小游戏。扫雷小游戏主要是利用字符数组、循环语句和函数实现,感兴趣的小伙伴可以了解一下
2022-11-13

C语言实现2D赛车游戏的示例代码

此游戏是《2D赛车》的”魔改版“——2.5D双人赛车!原作实现了2D视角的赛车游戏,但是我觉得不够真实、操纵感不强,故挤出数个周末完成了这个”魔改版“,实现了第一人称的视角,希望大家喜欢
2022-12-28

C语言实现三子棋游戏的示例代码

今天我们将会用C语言实现三子棋。所谓三子棋,就是三行三列的棋盘,玩家可以和电脑下棋,率先连成三个的获胜。话不多说,我们开始吧
2022-11-13

基于Python实现成语填空游戏的示例代码

成语填空想必大家都是十分熟悉的了,特别是有在上小学的家长肯定都有十分深刻的印象。当然了你也别小看了成语调控小游戏,有的时候知识储备不够,你还真的不一定猜得出来是什么。本文就来用Python编写一个简单的成语填空游戏,感兴趣的可以了解下
2023-02-17

C语言实现三子棋小游戏的示例代码

这篇文章主要介绍了如何通过C语言实现三子棋小游戏,三子棋小游戏的实现主要依赖于循环语句、函数和数组,感兴趣的小伙伴可以尝试一下
2022-11-13

C语言实现猜数字小游戏的示例代码

猜数字小游戏是我们小时候喜欢我们一个经典小游戏。这篇文章将利用C语言中的循环语句、分支语句和函数实现这一游戏,需要的可以参考一下
2022-11-13

基于Python实现24点游戏的示例代码

这篇文章主要为大家详细介绍了如何利用Python实现24点游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
2022-12-08

基于C语言实现三子棋游戏的代码怎么写

这篇“基于C语言实现三子棋游戏的代码怎么写”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“基于C语言实现三子棋游戏的代码怎么写
2023-07-02

C语言实现经典windows游戏扫雷的示例代码

今天我们会用C语言实现一个经典的windows小游戏:扫雷。扫雷是一款单机小游戏,每次通关最高难度的关卡都会开心好一阵。现在学会了C语言,总算可以自己实现扫雷了。话不多说,咱们开始吧
2022-11-13

C语言实现简易贪吃蛇游戏的示例代码

这篇文章主要介绍了如何利用C语言实现一个经典的小游戏——贪吃蛇,文中的示例代码讲解详细,具有一定的借鉴价值,需要的可以参考一下
2022-11-13

C语言实现经典扫雷小游戏的示例代码

扫雷游戏是在一个指定的二维空间里,随机布置雷,把不是雷的位置都找出来,在你点一个位置的时候它会显示它周围全部雷的个数,根据这个线索去找,会更容易赢。本文将用C语言实现这一经典游戏,感兴趣的可以尝试一下
2022-11-13

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录