一、游戏窗口

PS:此游戏为c语言开发,因EasyX库需要.cpp文件才能编译,所以工程文件后缀为.cpp,并未使用cpp的语法。

VS2013工程百度云链接:

链接:https://pan.baidu.com/s/16k2AvvEC_4NM_sFQHXgW1w
提取码:2333

1.1游戏界面

1.2游戏结束界面

二、游戏源码

将main.cpp文件添加到工程里

2.1 main.cpp

#define  _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <conio.h>
#include <time.h>
#include <math.h>
#include <graphics.h>#define  PicLen  3 //拼图的边长
#define  MapLen (PicLen+2) //地图的边长
#define  Blank_Map -1   //不显示的空白地图
#define  Len_Image  147  //图片边长IMAGE img[PicLen*PicLen];
int Map[MapLen][MapLen];   //游戏地图
int  key;  //按键保存
int  dx[4] = { -1, 1, 0, 0 };  //左、右、上、下的方向
int  dy[4] = { 0, 0, -1, 1 };
int Zero_pos[2] = { PicLen, PicLen };//空白位置所在的坐标
int res = -1;//模式选择结果
int nowmove;//键盘移动后下标结果int Dir(int x, int y);//鼠标输入时 判断空白格移动方向
void CreateMap();//随机生成地图
void ShowMap();//显示地图
int LOCAL_XY(double pos);//根据鼠标点击位置返回下标
void Button();//键盘移动
void Mouse();//鼠标移动
void OnInit();//初始化所有参数
void judge();//判断游戏是否结束
void StartGame();//开始游戏LRESULT CALLBACK CBTHookProc(int nCode, WPARAM wParam, LPARAM lParam)
{HWND hwnd = (HWND)wParam;if (nCode == HCBT_ACTIVATE){if (nCode == HCBT_ACTIVATE){SetDlgItemText((HWND)wParam, IDYES, "&3×3");SetDlgItemText((HWND)wParam, IDNO, "&4×4");SetDlgItemText((HWND)wParam, IDOK, "&OK");SetDlgItemText((HWND)wParam, IDCANCEL, "&无屏障(困难)");SetDlgItemText((HWND)wParam, IDABORT, "&有屏障");SetDlgItemText((HWND)wParam, IDRETRY, "&无屏障");SetDlgItemText((HWND)wParam, IDIGNORE, "&BGM已关闭");}}return 0;
}
int Msg(HWND hwnd, TCHAR *szText, TCHAR *szCaption, UINT uType)
{int ret;HHOOK hHook = SetWindowsHookEx(WH_CBT, CBTHookProc, NULL, GetCurrentThreadId());ret = MessageBox(hwnd, szText, szCaption, uType);UnhookWindowsHookEx(hHook);return ret;
}
int Dir(int x,int y)
{if ((abs(Zero_pos[0] - x) + abs(Zero_pos[1] - y)) == 1)//在附近{if (Zero_pos[0] - x == -1)return 0;//所点击位置向 左 移动到达空白格 if (Zero_pos[0] - x == 1)return 1;//所点击位置向 右 移动到达空白格if (Zero_pos[1] - y == -1)return 2;//所点击位置向 上 移动到达空白格if (Zero_pos[1] - y == 1)return 3;//所点击位置向 下 移动到达空白格}return -1;
}
void CreateMap()//随机生成地图
{//初始化地图for (int i = 0; i < MapLen; i++)for (int j = 0; j < MapLen; j++)if (i == 0 || i == (MapLen - 1) || j == 0 || j == (MapLen - 1))Map[i][j] = Blank_Map;for (int i = 0; i < PicLen * PicLen; i++)Map[i %  PicLen + 1][i / PicLen + 1] = i + 1;Map[PicLen][PicLen] = 0;//右下角设为0  即为空白处srand((unsigned int)time(NULL));//随机移动打乱地图int tt;for (int i = 0; i < 200; i++){tt = rand() % 4 + 1;switch (tt){case 1: //按下左  空白格向右移动nowmove = 1;break;case 2: //右 nowmove = 0;break;case 3: //上nowmove = 3;break;case 4: //下  nowmove = 2;break;}//移动后的空白格位置需在地图内if ((Zero_pos[0] + dx[nowmove]) >= 1&& (Zero_pos[0] + dx[nowmove]) <= PicLen&& (Zero_pos[1] + dy[nowmove]) >= 1&& (Zero_pos[1] + dy[nowmove]) <= PicLen){Map[Zero_pos[0]][Zero_pos[1]] = Map[Zero_pos[0] + dx[nowmove]][Zero_pos[1] + dy[nowmove]];//交换值 并记录空白格位置Zero_pos[0] = Zero_pos[0] + dx[nowmove];Zero_pos[1] = Zero_pos[1] + dy[nowmove];Map[Zero_pos[0]][Zero_pos[1]] = 0;}}
}
void ShowMap()//显示地图
{cleardevice();for (int i = 1; i < PicLen + 1; i++)for (int j = 1; j < PicLen + 1; j++)putimage((i - 1) * Len_Image, (j - 1) * Len_Image, &img[Map[i][j]]);
}
int LOCAL_XY(double pos)
{return (int)(pos / 150 + 1);
}
void Button()  //键盘移动
{if (_kbhit() != 0) //检查当前是否有键盘输入,若有则返回一个非0值,否则返回0  {        while (_kbhit() != 0)  //可能存在多个按键,要全部取完,以最后一个为主  key = _getch(); //将按键从控制台中取出并保存到key中switch (key){case 75: //按下左  空白格向右移动nowmove = 1;break;case 77: //右 nowmove = 0;break;case 72: //上nowmove = 3;break;case 80: //下  nowmove = 2;break;}//移动后的空白格位置需在地图内if ((Zero_pos[0] + dx[nowmove]) >= 1 && (Zero_pos[0] + dx[nowmove])<= PicLen&& (Zero_pos[1] + dy[nowmove]) >= 1&& (Zero_pos[1] + dy[nowmove]) <= PicLen){Map[Zero_pos[0]][Zero_pos[1]] = Map[Zero_pos[0] + dx[nowmove]][Zero_pos[1] + dy[nowmove]];//交换值 并记录空白格位置Zero_pos[0] = Zero_pos[0] + dx[nowmove];Zero_pos[1] = Zero_pos[1] + dy[nowmove];Map[Zero_pos[0]][Zero_pos[1]] = 0;ShowMap();}   }
}
void Mouse()//鼠标移动
{if (MouseHit()){MOUSEMSG msg = GetMouseMsg();switch (msg.uMsg){case WM_LBUTTONDOWN://左键按下int nowmove = Dir(LOCAL_XY(msg.x), LOCAL_XY(msg.y));if (nowmove != -1)//所点击的位置可移动{         //移动并存储空白格位置Map[LOCAL_XY(msg.x) + dx[nowmove]][LOCAL_XY(msg.y) + dy[nowmove]] = Map[LOCAL_XY(msg.x)][LOCAL_XY(msg.y)];Map[LOCAL_XY(msg.x)][LOCAL_XY(msg.y)] = 0;Zero_pos[0] = LOCAL_XY(msg.x);Zero_pos[1] = LOCAL_XY(msg.y);ShowMap();}break;}    }
}
void OnInit()//初始化所有参数
{  closegraph();key=0;  //按键保存  res = -1;//模式选择结果Zero_pos[0] = PicLen;//空白位置所在的坐标Zero_pos[1] = PicLen;
}
void judge()
{int flag = 1;for (int i = 0; i < PicLen * PicLen-2; i++){if (Map[i%PicLen + 1][i / PicLen + 1] >= Map[(i + 1) % PicLen + 1][(i + 1) / PicLen + 1]){flag = 0;break;}      }if (flag)//已拼完{char s[20];sprintf(s, "恭喜您,已完成!是否重开?");int res=MessageBoxA(0, s, "拼图", MB_YESNO|MB_SYSTEMMODAL);if (res==IDYES){OnInit();StartGame();}else{closegraph();exit(0);}}
}
void StartGame()//开始游戏
{initgraph(Len_Image * PicLen, Len_Image * PicLen); //初始绘图窗口for (int i = 0; i < PicLen*PicLen; i++)//加载图像{char s[20];sprintf(s, "3\\%d.png", i);loadimage(&img[i], s);}CreateMap();ShowMap();while (1){Button();    Mouse();judge();}
}
void main()
{StartGame();
}

由 LiangJian 写于 2019 年 10 月 15 日

C语言拼图游戏——Windows下基于EasyX且支持鼠标与键盘操作相关推荐

  1. 拼图游戏c语言简单,(C语言拼图游戏.doc

    (C语言拼图游戏 (郑重声明:本文绝对本人原创,盗版必究) (免费提供给爱好C语言的朋友,希望志同道合的朋友们一起加油!) (运行环境Turbo C,下载的朋友把图形驱动路径改为自己驱动实际路径即可) ...

  2. windows下基于libtorch的yolov5 6.0的c++部署

    windows下基于libtorch的yolov5 6.0的c++部署 1.概述 libtorch是pytorch的C++版本,在需要多进程.提高推理速度等需求下会比python语言更具有优势.本文根 ...

  3. 在windows下基于visual studio2017和CMake的安装Google glog

    这里简单记录安装google glog在windows下基于visual studio2017的安装过程. 下载 https://github.com/google/glog 使用cmake编译,编译 ...

  4. 拼图游戏C语言课设实验报告,C语言拼图游戏实验报告.doc

    C语言拼图游戏实验报告 课程设计实验报告 班级:光电104-2 姓名:刘云龙 学号:201058501220 一.实验题目:使用C语言编写一个小游戏(拼图游戏) 二.实验目的:C语言是每一个通信学生的 ...

  5. Windows下基于python3使用word2vec训练中文维基百科语料资料汇总

    Windows下基于python3使用word2vec训练中文维基百科语料(一):https://www.cnblogs.com/gaofighting/p/9055674.html Windows下 ...

  6. ESP32 ESP-IDF开发环境搭建,Windows下基于ESP-IDF | Cmake | VScode插件的 ESP32 开发环境搭建

      之前的一篇博客 Windows上基于ESP-IDF搭建ESP32开发环境 发布后,深受好评.几个月过去了,乐鑫的esp-idf-tools安装工具发生了较大的变化,VsCode插件的功能也愈加完善 ...

  7. Windows下基于IIS服务的SSL服务器的配置

    Windows下基于IIS服务的SSL服务器的配置 实验环境 Windows Server 2008 R1(CA) Windows Server 2008 R2(web服务器) Windows 7 x ...

  8. windows下基于Aria2的下载工具

    windows下基于Aria2的下载工具 Motrix https://motrix.app/ https://www.iplaysoft.com/motrix.html Photon https:/ ...

  9. c++网络编程——用TCP实现文件传输(windows下基于VS2017)

    c++网络编程--用TCP实现文件传输 定义文件传输协议 服务端代码 客户端代码 测试 文件传输协议FTP是基于TCP协议实现的,为了体验这个过程,本文自定义一个简单的文件传输协议,并基于TCP协议编 ...

最新文章

  1. CopyOnWriteArrayList实现原理及源码分析
  2. php新手最容易犯的错误,学习PHP过程中容易犯的一些错误
  3. 牛客题霸 [求平方根] C++题解/答案
  4. qr码生成_从Java程序生成QR码图像
  5. 十三、MySQL存储过程相关知识总结 + 案例讲解(强化)
  6. Windows网络编程笔记5 -- 其他套接字
  7. react 项目使用qrcode.react生成二维码,并提供批量下载
  8. python查内置函数,怎么查看python内置函数
  9. ASP.NET大作业/ASP.NET期末项目/大作业
  10. python简说(二)list
  11. 3dmax软件怎样一键取消视图背景网格
  12. java实现树形菜单_Java构建树形菜单的实例代码(支持多级菜单)
  13. [小说连载]张小庆,在路上(19)- 真的要在北京吗
  14. 百万调音师—Audition 重新混合
  15. 《BackTrack 5 Cookbook中文版——渗透测试实用技巧荟萃》目录—导读
  16. java实现的五子棋
  17. Pixel 手机上基于多曝光序列的 HDR+ 拍摄功能
  18. xmd后缀名改mp3_xmd文件怎么打开 - 狸窝
  19. CAD计算器怎么调出来?CAD计算器应用技巧
  20. 图片翻译软件哪个好用?这些软件值得收藏

热门文章

  1. ECSHOP产品详情页修改商品购买数量并实时更新商品总价的实现与优化
  2. 开源项目之Android繁体中文输入法
  3. CT图像的三维表面重建
  4. 根据json字段把一维数组改变成二维数组
  5. python 0x80070659系统策略禁止这个安装
  6. 笔记本电脑C盘变红或变满,怎么处理?
  7. C++11新特性之long long类型
  8. 前端后端程序员必备的Linux基础知识
  9. 九月的诗11首-光剑
  10. centos查看oracle版本,查看linux系統版本信息(Oracle Linux、Centos Linux、Redhat Linux、Debian、Ubuntu)...