前言

大家好,我就是智慧与美貌并重,英雄与狭义的化身的小编大人,几天授课,发现同学们对拼图游戏的切图理解不是很清楚,在这里就切图核心算法思想做一个讲解,希望对大家做拼图游戏有帮助。

切图主要思路

二维数组描述地图

二维数组可以描述一个平面,因此我们采用特殊数字表示特殊形状或者图片,这样就可以把整个游戏的地图给绘制出来,主要问题是窗口坐标与数组的下标同步问题。根据数组填坑过程如下图:

二维数组随机初始化

拼图游戏当中首先是用0-15表示图片的16个模块,首要做的是随机打乱二维数组的顺序,主要算法是采用一维数组给二维数组初始化,随机差生一维数组的下标,拿出当前下标的值给二维数组进行初始化,然后调整一维数组防止产生重复的值。

1.首先产生如下数组

int array1D[16]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
int array2D[4][4]={0}; 

2.随机产生一维数组下标

int length=15; srand((unsigned int)time(NULL));
int pos=rand()%length; 

3.一维数组给二维数组进行初始化

array2D[i][j]=array1D[pos] 此处省略for循环嵌套 

4.调整一维数组

for(int k=pos;k<length;k++)
{ array1D[k]=array1D[k+1]; //覆盖掉用掉的
}
length--; //数组长度-1 防止产生重复的内容 

算法示意图:

根据数组的值拿相应序号的图片

准备操作已结束,接着只需要按照数组中的值去一张完整的图片拿相应序号的那块照片贴到窗口上即可。

拼图游戏代码

/*1.熟悉二维数组2.可视化编程3.切割技术4.鼠标操作
*/
#include <graphics.h>
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <conio.h>
IMAGE img, blank;   //存储背景图 存储白块
int array2D[4][4];
int array1D[16] = { 0 };
struct blankPos
{int i, j;
}myPos = {0,0,};
struct blankPos searchPos(int array2D[][4],int low,int cols)
{for (int i = 0; i <low; i++){for (int j = 0; j < cols; j++){if (array2D[i][j] == 15){myPos.i = i;myPos.j = j;return myPos;}}}return myPos;
}
//菜单
void drawMenu()
{initgraph(640, 450);setbkcolor(WHITE);     //设置窗口背景颜色为白色cleardevice();//1.两个矩形setfillcolor(LIGHTBLUE); //设置填充颜色浅蓝色//2.1行文字setbkmode(TRANSPARENT);      //去掉文字背景settextstyle(30, 0, "字魂24号-镇魂手书");fillrectangle(240, 100, 380, 150);fillrectangle(240, 100 + 60, 380, 150 + 60);outtextxy(240 + 20, 100 + 13, "开始游戏");outtextxy(240 + 20, 100 +60+ 13, "退出游戏");settextcolor(RGB(255, 104,255));outtextxy(130,280, "顿开教育 拼图游戏 v1.0 版本");//第一步:鼠标反馈给计算机也是一个值 MOUSEMSG  m;while (1){m = GetMouseMsg();      //获取鼠标消息//  fillrectangle(240, 100, 380, 150);if (m.x >= 240 && m.x <= 380 && m.y >= 100 && m.y <= 150){setlinecolor(RGB(255, 104, 255));rectangle(240 - 5, 100 - 5, 380 + 5, 150 + 5);if (m.uMsg == WM_LBUTTONDOWN)break;}//fillrectangle(240, 100 + 60, 380, 150 + 60);else if (m.x >= 240 && m.x <= 380 && m.y >= 160 && m.y <= 210){setlinecolor(RGB(255, 104, 255));rectangle(240 - 5, 160 - 5, 380 + 5, 210 + 5);if (m.uMsg == WM_LBUTTONDOWN)exit(0);}else   //鼠标不在按钮上,擦掉原来{setlinecolor(WHITE);rectangle(240 - 5, 100 - 5, 380 + 5, 150 + 5);rectangle(240 - 5, 160 - 5, 380 + 5, 210 + 5);}}closegraph();
}
void  loadResource()
{srand((unsigned int)time(NULL));int length = 15;int pos = 0;int i, j;for (i =0 ; i < 15; i++){array1D[i] = i;}for (i = 0; i < 4; i++){for (j = 0; j < 4; j++){if (i == 3 && j == 3){array2D[i][j] = 15;      //最后位置永远都是白块break;}pos = rand() % length;array2D[i][j] = array1D[pos];for (int k = pos; k < length; k++){array1D[k] = array1D[k + 1];}length--;}if (i == 3 && j == 3){array2D[i][j] = 15;        //最后位置永远都是白块break;}}loadimage(&img, "Love.jpg", 800, 800);loadimage(&blank, "blank.jpg", 200, 200);
}
void drawMap()
{for (int i = 0; i < 4; i++){for (int j = 0; j < 4; j++){int x = j * 200;  //j=x/200int y = i * 200;  //i=y/200switch (array2D[i][j]){case 0:case 1:case 2:case 3:putimage(x, y, 200,200,&img, array2D[i][j] * 200, 0); break;case 4:case 5:case 6:case 7:putimage(x, y, 200, 200, &img, (array2D[i][j]-4) * 200, 200);break;case 8:case 9:case 10:case 11:putimage(x, y, 200, 200, &img, (array2D[i][j] - 8) * 200, 400);break;case 12:case 13:case 14:putimage(x, y, 200, 200, &img, (array2D[i][j] - 12) * 200, 600);break;case 15:putimage(x, y, &blank);break;}}}
}void playGame()
{MOUSEMSG m;int j_Mouse, i_Mouse;while (1){drawMap();int i, j = 0;//找白块的i和jsearchPos(array2D, 4, 4);i = myPos.i;j = myPos.j;m = GetMouseMsg();switch (m.uMsg){case WM_LBUTTONDOWN:j_Mouse = m.x / 200;i_Mouse = m.y / 200;if (i_Mouse == i + 1 && j_Mouse == j){array2D[i][j] = array2D[i_Mouse][j_Mouse];array2D[i_Mouse][j_Mouse] = 15;}if (i_Mouse == i - 1 && j_Mouse == j){array2D[i][j] = array2D[i_Mouse][j_Mouse];array2D[i_Mouse][j_Mouse] = 15;}if (i_Mouse == i  && j_Mouse == j + 1){array2D[i][j] = array2D[i_Mouse][j_Mouse];array2D[i_Mouse][j_Mouse] = 15;}if (i_Mouse == i && j_Mouse == j - 1){array2D[i][j] = array2D[i_Mouse][j_Mouse];array2D[i_Mouse][j_Mouse] = 15;}break;}}
}
int main()
{//drawMenu();loadResource();for (int i = 0; i < 4; i++){for (int j = 0; j < 4; j++){printf("%d\t", array2D[i][j]);}printf("\n");}system("pause");//initgraph(800, 800);//playGame();return 0;
}

效果图:

好了今天的内容到这里就结束了,完整拼图游戏视频教,私信 “视频”可获取。

C/C++美女拼图游戏必备技能,切割图片思想解析,自动切图片由此开始相关推荐

  1. Android 美女拼图游戏

    概述 游戏下载试玩 Github 喜欢的同学可以Star一下,非常感谢 我的博客 把图片切分很多份,点击交换拼成一张完整的:这样关卡也很容易设计,33:44:55:66:一直下去 效果: 加了个切换动 ...

  2. 【180927】美女拼图游戏源码

    一.源码特点     采用winform进行开发,制作的美女拼图游戏,可更换规格.记录步数 二.功能介绍     本源码是一个拼图游戏源码,用键盘操作,欢迎下载 三.菜单功能     1.运行后,选择 ...

  3. Spring+SpringMVC+Mybatis(开发必备技能)04、mybatis自动生成mapper_dao_model(包含工具与视频讲解) 纯绿色版本、配套使用视频,100%运行成功

    Spring+SpringMVC+Mybatis(开发必备技能) 04.mybatis自动生成mapper_dao_model(包含工具与视频讲解) 纯绿色版本.配套使用视频,100%运行成功 百度网 ...

  4. Android 实战美女拼图游戏 你能坚持到第几关

    转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/40595385,本文出自: [张鸿洋的博客] 1.概述 继2048之后,今天给大 ...

  5. 笔记四:Java基础阶段结束,用GUI实现的美女拼图游戏

    此小项目中用到的图片还有源码有需要的朋友私信 项目演示 此小游戏可通过按钮来实现上下左右的拼图,还可以通过求助和重置按钮来复原和从新开始游戏. 思路分析: 绘制游戏界面 实现图片打乱 给按钮添加事件 ...

  6. 一个简单的美女拼图游戏

    拼图游戏 概要 闲来无事,做了个拼图游戏娱乐一下自己.拼图关键就是怎么分割一张完整的图片,这个点知道了,那就很容易实现了. 我们知道可以利用 background-position 属性改变图像在背景 ...

  7. Android 实战美女拼图游戏 你能坚持到第几关

    1.概述 继2048之后,今天给大家带来一个拼图游戏,当然了不是很传统那个缺一块的拼图,那游戏我不会玩~~所有我们换个方式玩拼图,怎么玩呢,把图片且成很多份,点击交换拼成一张完整的:这样关卡也很容易设 ...

  8. HTML+CSS+JS实现 ❤️美女拼图游戏❤️

  9. 拼图游戏java(三)实现鼠标点击图片上下左右移动

    思路: 1.使类实现MouseLisner接口,创建未重写的方法,主要重写MousePressed方法 2.在按钮上添加鼠标监听 3.在方法中实现业务逻辑 1 public class GamePan ...

最新文章

  1. 设计模式:单例模式之饿汉式
  2. Spring Boot Transaction 源码解析(二)
  3. C# Winform 出现异常:无法将顶级控件添加到控件,解决方案如下:
  4. 深入C#中的String类
  5. 易语言 网页用什么编码_Plessey条码用的什么编码方式?
  6. 深度学习、机器学习、自然语言处理NLP优秀文章整理
  7. 小乌龟与git配置使用
  8. 优思学院|一文读懂SFMEA、DFMEA、PFMEA的关系
  9. Python自动化结算工资和统计报表
  10. SONY SVP1322 笔记本电脑升级
  11. 30A的MOS现在价格都下探到1块了,为什么你还在用继电器?
  12. 正交db小波 图像处理 matlab,基于matlab小波工具箱的数字图像处理及小波分析
  13. 固体物理题库之名词解释
  14. 4-20ma和0-5v模拟量无线传输点对点无线采集控制解决方案io开关量信号无线远程控制解决方案
  15. BSGSexBSGS(让你轻松理解和掌握)
  16. 手把手教你安装python环境 Mac Windows
  17. 【转】linux shell 正则表达式(BREs,EREs,PREs)差异比较
  18. 支付宝小程序物联网开发
  19. 佳星计费系统服务器时间异常,佳星计费管系统.doc
  20. Shader学习笔记(七)Unity Shader Rim示例

热门文章

  1. Debian11搭建魔兽世界WLK3.3.5私人服务器(愿圣光忽悠着你)
  2. 如何申请国际版一年期的Office 365开发者账号
  3. 干货:构建完美虚拟实验室的五大技巧
  4. ps人像精修教程——下巴线条勾勒 腰线调整
  5. python-pandas 来计算多组样本的方差(无偏样本方差)、协方差和相关系数(模式识别与智能计算课后作业)
  6. 电影《蚁人与黄蜂女:量子狂潮》观后感
  7. 工业清洗企业资质证书
  8. 记录使用bioconductor安装ChIPpeakAnno及ChIPseeker包遇到的bug
  9. 演示:为思科25/26系列的路由器升级IOS镜像
  10. 德卡斯特里奥算法(De Casteljau’s Algorithm)绘制贝塞尔曲线