HTML5のCanvasとJavaScriptを使ったパズルです。
ソースコードは次のとおり。
<script> function draw() { var dxd=screen.deviceXDPI; var nowMagniFication=dxd/96; var chgZoom=1/nowMagniFication; var size = 100; // 升目の大きさ var margin = 10; // 升目のマージン var canvas = document.getElementById("sample"); if(canvas.getContext) { var context = canvas.getContext('2d'); context.font = "70px serif"; context.textAlign = "center"; var rect = canvas.getBoundingClientRect(); var puzzle = new Puzzle(); puzzle.draw(); document.attachEvent("onclick", function (event) { puzzle.clicked(event); }); function Puzzle() { this.state = [ [1, 2, 3, 4], [5, 6, 7, 8], [9, 10, 11, 12], [13, 14, 15, -1] ]; this.clicked = function(event) { var marginx; var marginy; var x = event.clientX - rect.left; var y = event.clientY - rect.top; bsize = size * chgZoom; var i = Math.floor(y / bsize); marginy = i * bsize + margin * chgZoom; if(y < marginy) { i = -1; } var j = Math.floor(x / bsize); marginx = j * bsize + margin * chgZoom; if(x < marginx) { j = -1; } if (i >= 0 && i <= 3 && j >= 0 && j <= 3) { this.move(i, j); } }; this.move = function(i, j) { if (j >= 1 && this.empty(i, j-1)) { // 左 this.exchange(i, j, i, j-1); } else if (j <= 2 && this.empty(i, j+1)) { // 右 this.exchange(i, j, i, j+1); } else if (i >= 1 && this.empty(i-1, j)) { // 上 this.exchange(i, j, i-1, j); } else if (i <= 2 && this.empty(i+1, j)) { // 下 this.exchange(i, j, i+1, j); } }; this.exchange = function(i1, j1, i2, j2) { this.state[i2][j2] = this.state[i1][j1]; this.state[i1][j1] = -1; this.drawPiece(i1, j1); this.drawPiece(i2, j2); }; this.draw = function() { for (var i = 0; i <= 3; i++) { for (var j = 0; j <= 3; j++) { this.drawPiece(i, j); } } }; this.drawPiece = function(i, j) { var n = this.state[i][j]; if (n == -1) { context.clearRect(j*size, i*size, size, size); } else { context.fillStyle = "green"; context.fillRect(j * size + margin, i * size + margin, size - margin, size - margin); context.fillStyle = "white"; context.fillText(n, j*size + size * 0.55, i*size + size * 0.78); } }; this.empty = function(i, j) { return this.state[i][j] == -1; }; } } else { document.write('canvas Null<br>'); } } <form action="" name="form1"> <input type="button" value="開始ボタン" onClick="draw()"> </form> <canvas id="sample" width="400" height="400"></canvas>