用canvas写一个拼图小游戏
时间: 2023-08-10 19:12:01 浏览: 203
canvas拼图小游戏
好的,我可以为您提供一个简单的拼图小游戏的示例代码。代码中使用了HTML5的canvas元素和JavaScript语言来实现。
HTML部分:
```html
<!DOCTYPE html>
<html>
<head>
<title>拼图小游戏</title>
<style>
canvas {
border: 1px solid black;
}
</style>
</head>
<body>
<canvas id="canvas" width="400" height="400"></canvas>
<button id="startBtn">开始</button>
<script src="game.js"></script>
</body>
</html>
```
JavaScript部分:
```javascript
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
var img = new Image();
img.src = "puzzle.jpg";
var tileSize = 100; // 每个拼图块的大小
var rows = 4; // 拼图块的行数
var cols = 4; // 拼图块的列数
var tiles = []; // 存储所有拼图块的数组
var emptyTile = {row: rows-1, col: cols-1}; // 空白拼图块位置
img.onload = function() {
init();
}
function init() {
drawImage();
createTiles();
shuffleTiles();
drawTiles();
}
function drawImage() {
ctx.drawImage(img, 0, 0, canvas.width, canvas.height);
}
function createTiles() {
for (var r = 0; r < rows; r++) {
for (var c = 0; c < cols; c++) {
var tile = {
row: r,
col: c,
x: c * tileSize,
y: r * tileSize,
imageX: c * tileSize,
imageY: r * tileSize
};
tiles.push(tile);
}
}
}
function shuffleTiles() {
for (var i = tiles.length-1; i >= 0; i--) {
var randomIndex = Math.floor(Math.random() * i);
var temp = tiles[i];
tiles[i] = tiles[randomIndex];
tiles[randomIndex] = temp;
}
}
function drawTiles() {
ctx.clearRect(0, 0, canvas.width, canvas.height);
for (var i = 0; i < tiles.length; i++) {
var tile = tiles[i];
ctx.drawImage(img, tile.imageX, tile.imageY, tileSize, tileSize, tile.x, tile.y, tileSize, tileSize);
}
}
function getClickedTile(mouseX, mouseY) {
for (var i = 0; i < tiles.length; i++) {
var tile = tiles[i];
if (mouseX >= tile.x && mouseX < tile.x + tileSize && mouseY >= tile.y && mouseY < tile.y + tileSize) {
return tile;
}
}
return null;
}
canvas.addEventListener("click", function(event) {
var mouseX = event.clientX - canvas.offsetLeft;
var mouseY = event.clientY - canvas.offsetTop;
var clickedTile = getClickedTile(mouseX, mouseY);
if (clickedTile) {
if (isValidMove(clickedTile)) {
moveTile(clickedTile);
drawTiles();
if (isGameComplete()) {
alert("拼图完成!");
}
}
}
});
function isValidMove(tile) {
if (tile.row == emptyTile.row && Math.abs(tile.col - emptyTile.col) == 1) {
return true;
}
if (tile.col == emptyTile.col && Math.abs(tile.row - emptyTile.row) == 1) {
return true;
}
return false;
}
function moveTile(tile) {
var temp = {
row: tile.row,
col: tile.col,
x: tile.x,
y: tile.y
};
tile.row = emptyTile.row;
tile.col = emptyTile.col;
tile.x = emptyTile.col * tileSize;
tile.y = emptyTile.row * tileSize;
emptyTile.row = temp.row;
emptyTile.col = temp.col;
emptyTile.x = temp.col * tileSize;
emptyTile.y = temp.row * tileSize;
}
function isGameComplete() {
for (var i = 0; i < tiles.length; i++) {
var tile = tiles[i];
if (tile.row != Math.floor(i / cols) || tile.col != i % cols) {
return false;
}
}
return true;
}
document.getElementById("startBtn").addEventListener("click", function() {
shuffleTiles();
drawTiles();
});
```
代码中首先加载一张拼图图片,然后创建一个指定大小和行列数的拼图块数组,并使用shuffleTiles()方法对拼图块进行随机打乱。在绘制拼图块时,可以根据拼图块的位置和大小,从图片中截取拼图块对应的部分并绘制到canvas中。
当用户点击canvas时,根据鼠标坐标获取点击的拼图块,如果该拼图块与空白拼图块相邻且可以移动,则进行移动并重新绘制拼图块。当拼图全部拼好后,弹出提示框告知用户游戏完成。
最后,为了让用户可以重新开始游戏,我们添加了一个开始按钮,点击该按钮可以重新打乱拼图块并进行游戏。
阅读全文