拼图模板
今天找了一上午总算找到自己想要的九宫格拼图模板,感觉比我想象中设计好多了,只是界面挺简单的;
js部分(pin.js)
// JavaScript Document//获取画图区域
var context = document.getElementById('pintu').getContext('2d');
//创建图片
var img = new Image();
img.src = '0140215A5-2.jpg';
img.addEventListener('load', drawTiles, false);//事件监听函数 addEventListener(事件,处理方法。监听强度(防止回收))
//取得图像大小和分成的块数
var boardSize = document.getElementById('pintu').width;
var tileCount = document.getElementById('level').value;
var tileSize = boardSize / tileCount;
//追踪空白图片位置,记录点击图片位置
var clickLoc = new Object;
clickLoc.x = 0;
clickLoc.y = 0;
var emptyLoc = new Object;
emptyLoc.x = 0;
emptyLoc.y = 0;
//默认拼图未完成
var solved = false;
//默认步数为0
var step = 0;
//获取并初始化画板
var boardParts = new Object;
setBoard();
//更改难度相关方法,更改后重新计算大小
document.getElementById('level').onchange = function() {
tileCount = this.value;
tileSize = boardSize / tileCount;
setBoard();
drawTiles();
};
//追踪鼠标划过的区域
document.getElementById('pintu').onmousemove = function(e) {
clickLoc.x = Math.floor((e.pageX - this.offsetLeft) / tileSize);
clickLoc.y = Math.floor((e.pageY - this.offsetTop) / tileSize);
};
//追踪鼠标点击的区域
document.getElementById('pintu').onclick = function() {
if (distance(clickLoc.x, clickLoc.y, emptyLoc.x, emptyLoc.y) == 1) {
step++;
document.getElementById('step').value = step;//步数记录
slideTile(emptyLoc, clickLoc);
drawTiles();
}
if (solved) {
setTimeout(function() {alert("你完成了!用了"+step+"步");}, 500); //防止浏览器在重绘图片区域之前弹窗而进行500ms的延迟
}
};
//初始化画板函数,模拟n*n的n宫格,使用二维数组创建图片区域
function setBoard() {
boardParts = new Array(tileCount);
for (var i = 0; i < tileCount; ++i) {
boardParts[i] = new Array(tileCount);
for (var j = 0; j < tileCount; ++j) {
boardParts[i][j] = new Object;
boardParts[i][j].x = (tileCount - 1) - i;
boardParts[i][j].y = (tileCount - 1) - j;
}
}
emptyLoc.x = boardParts[tileCount - 1][tileCount - 1].x;
emptyLoc.y = boardParts[tileCount - 1][tileCount - 1].y;
solved = false;
}
//将点击的拼图移动到新的位置
function drawTiles() {
context.clearRect ( 0 , 0 , boardSize , boardSize );
for (var i = 0; i < tileCount; ++i) {
for (var j = 0; j < tileCount; ++j) {
var x = boardParts[i][j].x;
var y = boardParts[i][j].y;
if(i != emptyLoc.x || j != emptyLoc.y || solved == true) {
context.drawImage(img, x * tileSize, y * tileSize, tileSize, tileSize,
i * tileSize, j * tileSize, tileSize, tileSize);
}
}
}
}
//判断图片是否可移动的方法
function distance(x1, y1, x2, y2) {
return Math.abs(x1 - x2) + Math.abs(y1 - y2); //判断到空白位置的距离是否为1,1
}
//移动拼图相关方法
function slideTile(toLoc, fromLoc) {
if (!solved) {
boardParts[toLoc.x][toLoc.y].x = boardParts[fromLoc.x][fromLoc.y].x;
boardParts[toLoc.x][toLoc.y].y = boardParts[fromLoc.x][fromLoc.y].y;
boardParts[fromLoc.x][fromLoc.y].x = tileCount - 1;
boardParts[fromLoc.x][fromLoc.y].y = tileCount - 1;
toLoc.x = fromLoc.x;
toLoc.y = fromLoc.y;
checkSolved();
}
}
//检查拼图位置是否完成的方法
function checkSolved() {
var flag = true;
for (var i = 0; i < tileCount; ++i) {
for (var j = 0; j < tileCount; ++j) {
if (boardParts[i][j].x != i || boardParts[i][j].y != j) {
flag = false;
}
}
}
solved = flag;
}
html部分(pin.html)
<!DOCTYPE HTML>
<html>
<head>
<title>拼图</title>
<style>
.picture {
border: 1px solid black;
}
#main{
float:left;
}
#yuantu{
float:left;
margin-left: 20px;
}
#step{
margin-left: 100px;
}
</style>
</head>
<body>
<meta charset="UTF-8" />
<div id="title">
<h2>拼图游戏</h2>
</div>
<div id="slider">
<form>
<label>简单</label>
<input type="range" id="level" value="4" min="3" max="5" step="1">
<label>困难</label>
<input type="text" id='step' readonly="readonly" value="0"><label>步数</label>
</form>
<br>
</div>
<div id="main" class="main">
<canvas id="pintu" width="480px" height="480px"></canvas>
</div>
<div id="yuantu" width="480px" height="480px"><img src="0140215A5-2.jpg"/></div>
<script src="pin.js"></script>
</body>
</html>
源代码,下午开始动工,制作自己喜欢的拼图,哈哈,在此吧图片附上


浙公网安备 33010602011771号