一个简单的拼图游戏,一直很喜欢玩,在网上的很多源码打乱都有些问题,很多情况下不能拼成,研究了一段时间,找到一个不错的打乱方式,分享出来给大家看看。
代码使用html+css+jquery实现。
效果图如下:
1、准备工作
首页准备一张喜欢的图片,使用ps切片功能,将图片进行9等分(保留原图)。
创建puzzle.html用于页面展示。
创建文件夹images保存图片。
创建js文件夹,并将jquery(jquery-1.8.3.min)文件放在其中。
在js文件夹中创建js文件index.js.
2、编写HTML代码(puzzle.html)
页面代码使用div进行布局,可通过main和puzzle的类样式控制拼图区域大小。
css代码如下:
<style> .main { width: 604px; height: 450px;background-color:#0ff;position:relative;float:left; } .puzzle { width: 200px; height: 150px; border: 1px solid #fff; position:absolute; background-size:100% 100%; } </style>
js引入文件如下:
<script type="text/javascript" src="js/jquery-1.8.3.min.js"></script> <script type="text/javascript" src="js/index.js"></script>
使用类样式puzzle的div为图片切片,id使用x坐标与y坐标合并命名,方便遍历,data-x表示x坐标,data-y表示y坐标。
body内容如下:
<div class="main"> <div class="puzzle" id="0_0" data-x="0" data-y="0" onclick="moveImg('0_0')" style="background-image: url(images/fmt_01.jpg);"></div> <div class="puzzle" id="1_0" data-x="1" data-y="0" onclick="moveImg('1_0')" style="background-image: url(images/fmt_02.jpg);"></div> <div class="puzzle" id="2_0" data-x="2" data-y="0" onclick="moveImg('2_0')" style="background-image: url(images/fmt_03.jpg);"></div> <div class="puzzle" id="0_1" data-x="0" data-y="1" onclick="moveImg('0_1')" style="background-image: url(images/fmt_04.jpg);"></div> <div class="puzzle" id="1_1" data-x="1" data-y="1" onclick="moveImg('1_1')" style="background-image: url(images/fmt_05.jpg);"></div> <div class="puzzle" id="2_1" data-x="2" data-y="1" onclick="moveImg('2_1')" style="background-image: url(images/fmt_06.jpg);"></div> <div class="puzzle" id="0_2" data-x="0" data-y="2" onclick="moveImg('0_2')" style="background-image: url(images/fmt_07.jpg);"></div> <div class="puzzle" id="1_2" data-x="1" data-y="2" onclick="moveImg('1_2')" style="background-image: url(images/fmt_08.jpg);"></div> <div class="puzzle" id="2_2" data-x="2" data-y="2"></div> </div> <div style="float:left;left:20px;position:relative;"> <img src="images/fmt.jpg" style="width:300px;height:225px;"/> <br /> <br /> 使用步数:<label id="lblNum">0</label>步 <br /> <br /> <button onclick="Upset()">重置</button> </div> <script> $(function () { Upset(); }); </script>
3、编写js
首先初始化div位置,代码如下:
// 初始化拼图位置 function InitPostion() { // 第一排三张 $("#0_0").css("top", 0); $("#0_0").css("left", 0); $("#1_0").css("top", 0); $("#1_0").css("left", $("#1_0").width()); $("#2_0").css("top", 0); $("#2_0").css("left", $("#2_0").width()*2); // 第二排三张 $("#0_1").css("top", $("#0_1").height()); $("#0_1").css("left", 0); $("#1_1").css("top", $("#0_1").height()); $("#1_1").css("left", $("#1_0").width()); $("#2_1").css("top", $("#0_1").height()); $("#2_1").css("left", $("#1_0").width()*2); // 第三排三张 $("#0_2").css("top", $("#0_1").height()*2); $("#0_2").css("left", 0); $("#1_2").css("top", $("#0_1").height() * 2); $("#1_2").css("left", $("#1_0").width()); $("#2_2").css("top", $("#0_1").height() * 2); $("#2_2").css("left", $("#1_0").width()*2); }
然后编写图片位置交换代码,代码如下:
// 记录移动位置 var puzzleList = [ [1, 1, 1], [1, 1, 1], [1, 1, 0]]; // 记录移动后ID var successList = [ ["0_0", "1_0", "2_0"], ["0_1", "1_1", "2_1"], ["0_2", "1_2", "2_2"]]; // 记录成功结果 var successList_s = [ ["0_0", "1_0", "2_0"], ["0_1", "1_1", "2_1"], ["0_2", "1_2", "2_2"]]; // 记录当前步数 var num = 0; // 移动拼图 function ChangePosition(id) { var x =parseInt($("#"+id).attr("data-x")); var y = parseInt($("#" + id).attr("data-y")); var x_t = 0; var y_t = 0; // 验证是否可以移动 var isMove = false; var MoveID = ""; var MoveID2 = successList[y][x]; var MoveID_T = ""; // 移动的中间变量 var top_t = ""; var left_t = ""; // 右移 if ((x + 1) <= 2 && puzzleList[y][x + 1] == 0) { MoveID = successList[y][(x + 1)]; puzzleList[y][x] = 0; puzzleList[y][x + 1] = 1; MoveID_T = successList[y][(x + 1)]; successList[y][(x + 1)] = successList[y][x]; successList[y][x] = MoveID_T; } // 左移 else if ((x - 1) >= 0 && puzzleList[y][x - 1] == 0) { MoveID = successList[y][(x - 1)]; puzzleList[y][x] = 0; puzzleList[y][x - 1] = 1; MoveID_T = successList[y][(x - 1)]; successList[y][(x - 1)] = successList[y][x]; successList[y][x] = MoveID_T; } // 下移 else if ((y + 1) <= 2 && puzzleList[y + 1][x] == 0) { MoveID = successList[(y + 1)][x]; puzzleList[y][x] = 0; puzzleList[y + 1][x] = 1; MoveID_T = successList[(y + 1)][x]; successList[(y + 1)][x] = successList[y][x]; successList[y][x] = MoveID_T; } // 上移 else if ((y - 1) >= 0 && puzzleList[y - 1][x] == 0) { MoveID = successList[(y - 1)][x]; puzzleList[y][x] = 0; puzzleList[y - 1][x] = 1; MoveID_T = successList[(y - 1)][x]; successList[(y - 1)][x] = successList[y][x]; successList[y][x] = MoveID_T; } if (MoveID.length > 0) { isMove = true; } if (isMove) { top_t = $("#" + MoveID).css("top"); left_t = $("#" + MoveID).css("left"); x_t = $("#" + MoveID).attr("data-x"); y_t = $("#" + MoveID).attr("data-y"); $("#" + MoveID).css("top", $("#" + MoveID2).css("top")); $("#" + MoveID).css("left", $("#" + MoveID2).css("left")); $("#" + MoveID).attr("data-x", $("#" + MoveID2).attr("data-x")); $("#" + MoveID).attr("data-y", $("#" + MoveID2).attr("data-y")); $("#" + MoveID2).css("top", top_t); $("#" + MoveID2).css("left", left_t); $("#" + MoveID2).attr("data-x", x_t); $("#" + MoveID2).attr("data-y", y_t); } }
然后,创建拼图点击事件,代码如下:
// 拼图点击:移动拼图,并验证成功 function moveImg(id) { ChangePosition(id); var isSuccess = true; num++; $("#lblNum").text(num); for (var i = 0; i < 3; i++) { for (var j = 0; j < 3; j++) { if (successList[i][j] != successList_s[i][j]) { isSuccess = false; return; } } } if (isSuccess) { setTimeout(function(){ alert("厉害了,我的哥!")},500); } }
最后,创建初始化拼图并进行拼图打乱,代码如下:
function Upset() { num = 0; $("#lblNum").text(num); // 初始化正确位置 InitPostion(); // 初始化第一张要打乱的图片 var x = 0, y = 0; var id = ""; for (var i = 0; i < 10000; i++) { x = Math.round(Math.random() * 10); y = Math.round(Math.random() * 10); if (x > 2) { x = 0; } if (y > 2) { y = 2; } id = x+"_"+y; ChangePosition(id); } }
打乱规则:初始化拼图正确位置》产生10000次随机数》通过随机数进行移动。
4、总结
这是一个简单的拼图实现,有很多可以进行完善的地方,我也是第一次写博客,文字上有描述不对的地方,欢迎进行指正。
关于打乱算法上,这是我自己的一个思路,实用效果也还可以,如果有更棒的算法,也希望能分享出来,大家一起学习一下。