diff --git a/林 b/林 new file mode 100644 index 0000000..c9a80f9 --- /dev/null +++ b/林 @@ -0,0 +1,540 @@ +// pages/game/game.js +// 方块的初始位置 +var num = [ + ['00', '01', '02'], + ['10', '11', '12'], + ['20', '21', '22'] +] + +// 方块的宽度 +var w = 100 + +// 图片的初始地址 +var url = '/images/pic01.jpg' + +Page({ + + /** + * 页面的初始数据 + */ + data: { + isWin: false + + }, + + /** + * 自定义函数--随机打乱方块顺序 + */ + shuffle: function() { + // 先令所有方块回归初始位置 + num = [ + ['00', '01', '02'], + ['10', '11', '12'], + ['20', '21', '22'] + ] + + // 记录当前空白方块的行和列 + var row = 2 + var col = 2 + + // 随机打乱方块顺序100次 + for (var i = 0; i < 100; i++) { + // 随机生成一个方向:上0,下1,左2,右3 + var direction = Math.round(Math.random() * 3) + + // 上:0 + if (direction == 0) { + // 空白方块不能在最上面一行 + if (row != 0) { + // 交换位置 + num[row][col] = num[row - 1][col] + num[row - 1][col] = '22' + + // 更新空白方块的行 + row -= 1 + } + } + + // 下:1 + if (direction == 1) { + // 空白方块不能在最下面一行 + if (row != 2) { + // 交换位置 + num[row][col] = num[row + 1][col] + num[row + 1][col] = '22' + + // 更新空白方块的行 + row += 1 + } + } + + // 左:2 + if (direction == 2) { + // 空白方块不能在最左边一列 + if (col != 0) { + // 交换位置 + num[row][col] = num[row][col - 1] + num[row][col - 1] = '22' + + // 更新空白方块的列 + col -= 1 + } + } + + // 右:3 + if (direction == 3) { + // 空白方块不能在最右边一列 + if (col != 2) { + // 交换位置 + num[row][col] = num[row][col + 1] + num[row][col + 1] = '22' + + // 更新空白方块的列 + col += 1 + } + } + + } + + }, + + /** + * 自定义函数--绘制画布内容 + */ + drawCanvas: function() { + let ctx = this.ctx + + // 清空画布 + ctx.clearRect(0, 0, 300, 300) + + // 使用双重for循环语句绘制3x3拼图 + for (var i = 0; i < 3; i++) { + for (var j = 0; j < 3; j++) { + if (num[i][j] != '22') { + // 获取行和列 + var row = parseInt(num[i][j] / 10) + var col = num[i][j] % 10 + + // 绘制方块 + ctx.drawImage(url, col * w, row * w, w, w, j * w, i * w, w, w) + } + } + } + + ctx.draw() + }, + + /** + * 自定义函数--监听点击方块事件 + */ + touchBox: function(e) { + // 如果游戏已经成功,不做任何操作 + if (this.data.isWin) { + // 终止本函数 + return + } + + // 获取被点击方块的坐标x和y + var x = e.changedTouches[0].x + var y = e.changedTouches[0].y + // console.log('x:'+x+',y:'+y) + + // 换算成行和列 + var row = parseInt(y / w) + var col = parseInt(x / w) + + // 如果点击的不是空白位置 + if (num[row][col] != '22') { + // 尝试移动方块 + this.moveBox(row, col) + + // 重新绘制画布内容 + this.drawCanvas() + + // 判断游戏是否成功 + if (this.isWin()) { + // 在画面上绘制提示语句 + let ctx = this.ctx + + // 绘制完整图片 + ctx.drawImage(url, 0, 0) + + // 绘制文字 + ctx.setFillStyle('#e64340') + ctx.setTextAlign('center') + ctx.setFontSize(60) + ctx.fillText('游戏成功', 150, 150) + ctx.draw() + } + } + }, + + /** + * 自定义函数--移动被点击的方块 + */ + moveBox: function(i, j) { + // 情况1:如果被点击的方块不在最上方,检查可否上移 + if (i > 0) { + // 如果方块的上方是空白 + if (num[i - 1][j] == '22') { + // 交换当前被点击的方块和空白的位置 + num[i - 1][j] = num[i][j] + num[i][j] = '22' + return + } + } + + // 情况2:如果被点击的方块不在最下方,检查可否下移 + if (i < 2) { + // 如果方块的下方是空白 + if (num[i + 1][j] == '22') { + // 交换当前被点击的方块和空白的位置 + num[i + 1][j] = num[i][j] + num[i][j] = '22' + return + } + } + + // 情况3:如果被点击的方块不在最左侧,检查可否左移 + if (j > 0) { + // 如果方块的左侧是空白 + if (num[i][j - 1] == '22') { + // 交换当前被点击的方块和空白的位置 + num[i][j - 1] = num[i][j] + num[i][j] = '22' + return + } + } + + // 情况4:如果被点击的方块不在最右侧,检查可否右移 + if (j < 2) { + // 如果方块的右侧是空白 + if (num[i][j + 1] == '22') { + // 交换当前被点击的方块和空白的位置 + num[i][j + 1] = num[i][j] + num[i][j] = '22' + return + } + } + }, + + /** + * 自定义函数--判断游戏是否成功 + */ + isWin: function() { + // 使用双重for循环检查整个数组 + for (var i = 0; i < 3; i++) { + for (var j = 0; j < 3; j++) { + // 如果有方块位置不对 + if (num[i][j] != i * 10 + j) { + // 返回假,游戏尚未成功 + return false + } + } + } + + // 游戏成功,更新状态 + this.setData({ + isWin: true + }) + // 返回真,游戏成功 + return true + }, + + /** + * 自定义函数--重新开始游戏 + */ + restartGame: function() { + // 更新游戏状态 + this.setData({ + isWin: false + }) + + // 打乱方块顺序 + this.shuffle() + + // 绘制画布内容 + this.drawCanvas() + }, + + /** + * 生命周期函数--监听页面加载 + */ + onLoad: function(options) { + // console.log(options.level) + + // 更新图片路径地址 + url = '/images/' + options.level + // 更新提示图的地址 + this.setData({ + url: url + }) + + // 创建画布上下文 + this.ctx = wx.createCanvasContext("myCanvas") + + // 打乱方块顺序 + this.shuffle() + + // 绘制画布内容 + this.drawCanvas() + }, + + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady: function() { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow: function() { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide: function() { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload: function() { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh: function() { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom: function() { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage: function() { + + } +}) +pages\game\game.wxml + + + + 提示图 + + + + + +pages\game\game.wxss +/* pages/game/game.wxss */ +/* 提示图 */ +image{ + width: 250rpx; + height: 250rpx; +} + +/* 游戏画布区域 */ +canvas{ + border: 1rpx solid; + width: 300px; + height: 300px; +} +pages\index\index.js + +Page({ + + /** + * 页面的初始数据 + */ + data: { + levels:[ + 'pic01.jpg', + 'pic02.jpg', + 'pic03.jpg', + 'pic04.jpg', + 'pic05.jpg', + 'pic06.jpg', + + ] + }, + chooseLevel:function(e){ + let level = e.currentTarget.dataset.level + wx.navigateTo({ + url: '../game/game?level='+level, + }) + }, + + /** + * 生命周期函数--监听页面加载 + */ + onLoad: function (options) { + + }, + + /** + * 生命周期函数--监听页面初次渲染完成 + */ + onReady: function () { + + }, + + /** + * 生命周期函数--监听页面显示 + */ + onShow: function () { + + }, + + /** + * 生命周期函数--监听页面隐藏 + */ + onHide: function () { + + }, + + /** + * 生命周期函数--监听页面卸载 + */ + onUnload: function () { + + }, + + /** + * 页面相关事件处理函数--监听用户下拉动作 + */ + onPullDownRefresh: function () { + + }, + + /** + * 页面上拉触底事件的处理函数 + */ + onReachBottom: function () { + + }, + + /** + * 用户点击右上角分享 + */ + onShareAppMessage: function () { + + } +}) +pages\index\index.wxml + + + + 游戏选关 + + + + + + 第{{index+1}}关 + + + +pages\index\index.wxss + +/**index.wxss**/ +/* 关卡区域列表 */ +.levelBox{ + width: 100%; +} + +/* 单个关卡区域 */ +.box{ + width: 50%; + float: left; + margin: 25rpx 0; + display: flex; + flex-direction: column; + align-items: center; +} + +/* 选关图片 */ +image{ + width: 260rpx; + height: 260rpx; +} +app.json +app.json + +{ + "pages":[ + "pages/index/index", + "pages/game/game" + ], + "window":{ + "backgroundTextStyle":"light", + "navigationBarBackgroundColor": "#E64340", + "navigationBarTitleText": "拼图游戏", + "navigationBarTextStyle":"black" + }, + "style": "v2", + "sitemapLocation": "sitemap.json" +} +app.wxss + +/**app.wxss**/ +/* 页面容器样式 */ +.container{ + height: 100vh; + color: #e64340; + font-weight: bold; + display: flex; + flex-direction: column; + align-items: center; + justify-content: space-evenly; +} + +/* 顶端标题样式 */ +.title{ + font-size: 18pt; +} +app.js + +App({ + + /** + * 当小程序初始化完成时,会触发 onLaunch(全局只触发一次) + */ + onLaunch: function () { + + }, + + /** + * 当小程序启动,或从后台进入前台显示,会触发 onShow + */ + onShow: function (options) { + + }, + + /** + * 当小程序从前台进入后台,会触发 onHide + */ + onHide: function () { + + }, + + /** + * 当小程序发生脚本错误,或者 api 调用失败时,会触发 onError 并带上错误信息 + */ + onError: function (msg) { + + } +})