微信小程序——拼图游戏案例

今天药忘吃喽~ 2023-01-15 15:24 407阅读 0赞

文章目录

    • 页面展示
    • 项目链接
    • 项目设计
      • 首页面
      • 游戏页面

页面展示

在这里插入图片描述
在这里插入图片描述

项目链接

https://download.csdn.net/download/weixin_45525272/17048569

项目设计

首页面

wxml

  1. <!--index.wxml-->
  2. <view class="container">
  3. <!-- 标题 -->
  4. <view class="title">游戏选关</view>
  5. <!-- 关卡列表 -->
  6. <view class="levelBox">
  7. <view class="box" wx:for="{ {levels}}" wx:key="levels{ {index}}" bindtap="chooseLevel" data-level="{ {item}}">
  8. <image src="/images/{ {item}}"></image>
  9. <text>第{
  10. {index+1}}关</text>
  11. </view>
  12. </view>
  13. </view>

wxss

  1. /**index.wxss**/
  2. /* 关卡区域列表 */
  3. .levelBox{
  4. width: 100%;
  5. }
  6. /* 单个关卡区域 */
  7. .box{
  8. width: 50%;
  9. float: left;
  10. margin: 25rpx 0;
  11. display: flex;
  12. flex-direction: column;
  13. align-items: center;
  14. }
  15. /* 选关图片 */
  16. image{
  17. width: 260rpx;
  18. height: 260rpx;
  19. }
  20. //index.js
  21. Page({
  22. /** * 页面的初始数据 */
  23. data: {
  24. levels: [
  25. 'pic01.jpg',
  26. 'pic02.jpg',
  27. 'pic03.jpg',
  28. 'pic04.jpg',
  29. 'pic05.jpg',
  30. 'pic06.jpg'
  31. ]
  32. },
  33. /** * 自定义函数--游戏选关 */
  34. chooseLevel: function(e) {
  35. // console.log(e.currentTarget.dataset.level)
  36. // 获取选关图片
  37. let level = e.currentTarget.dataset.level
  38. // 跳转游戏页面
  39. wx.navigateTo({
  40. url: '../game/game?level='+level,
  41. })
  42. },
  43. })

游戏页面

wxml

  1. <!--pages/game/game.wxml-->
  2. <view class="container">
  3. <!-- 顶端提示图 -->
  4. <view class="title">提示图</view>
  5. <image src="{ {url}}"></image>
  6. <!-- 游戏区域 -->
  7. <canvas canvas-id="myCanvas" bindtouchstart="touchBox"></canvas>
  8. <!-- 重新开始按钮 -->
  9. <button type="warn" bindtap="restartGame">重新开始</button>
  10. </view>

wxss

  1. /* pages/game/game.wxss */
  2. /* 提示图 */
  3. image{
  4. width: 250rpx;
  5. height: 250rpx;
  6. }
  7. /* 游戏画布区域 */
  8. canvas{
  9. border: 1rpx solid;
  10. width: 300px;
  11. height: 300px;
  12. }

js

  1. // pages/game/game.js
  2. // 方块的初始位置
  3. var num = [
  4. ['00', '01', '02'],
  5. ['10', '11', '12'],
  6. ['20', '21', '22']
  7. ]
  8. // 方块的宽度
  9. var w = 100
  10. // 图片的初始地址
  11. var url = '/images/pic01.jpg'
  12. Page({
  13. /** * 页面的初始数据 */
  14. data: {
  15. isWin: false
  16. },
  17. /** * 自定义函数--随机打乱方块顺序 */
  18. shuffle: function() {
  19. // 先令所有方块回归初始位置
  20. num = [
  21. ['00', '01', '02'],
  22. ['10', '11', '12'],
  23. ['20', '21', '22']
  24. ]
  25. // 记录当前空白方块的行和列
  26. var row = 2
  27. var col = 2
  28. // 随机打乱方块顺序100次
  29. for (var i = 0; i < 100; i++) {
  30. // 随机生成一个方向:上0,下1,左2,右3
  31. var direction = Math.round(Math.random() * 3)
  32. // 上:0
  33. if (direction == 0) {
  34. // 空白方块不能在最上面一行
  35. if (row != 0) {
  36. // 交换位置
  37. num[row][col] = num[row - 1][col]
  38. num[row - 1][col] = '22'
  39. // 更新空白方块的行
  40. row -= 1
  41. }
  42. }
  43. // 下:1
  44. if (direction == 1) {
  45. // 空白方块不能在最下面一行
  46. if (row != 2) {
  47. // 交换位置
  48. num[row][col] = num[row + 1][col]
  49. num[row + 1][col] = '22'
  50. // 更新空白方块的行
  51. row += 1
  52. }
  53. }
  54. // 左:2
  55. if (direction == 2) {
  56. // 空白方块不能在最左边一列
  57. if (col != 0) {
  58. // 交换位置
  59. num[row][col] = num[row][col - 1]
  60. num[row][col - 1] = '22'
  61. // 更新空白方块的列
  62. col -= 1
  63. }
  64. }
  65. // 右:3
  66. if (direction == 3) {
  67. // 空白方块不能在最右边一列
  68. if (col != 2) {
  69. // 交换位置
  70. num[row][col] = num[row][col + 1]
  71. num[row][col + 1] = '22'
  72. // 更新空白方块的列
  73. col += 1
  74. }
  75. }
  76. }
  77. },
  78. /** * 自定义函数--绘制画布内容 */
  79. drawCanvas: function() {
  80. let ctx = this.ctx
  81. // 清空画布
  82. ctx.clearRect(0, 0, 300, 300)
  83. // 使用双重for循环语句绘制3x3拼图
  84. for (var i = 0; i < 3; i++) {
  85. for (var j = 0; j < 3; j++) {
  86. if (num[i][j] != '22') {
  87. // 获取行和列
  88. var row = parseInt(num[i][j] / 10)
  89. var col = num[i][j] % 10
  90. // 绘制方块
  91. ctx.drawImage(url, col * w, row * w, w, w, j * w, i * w, w, w)
  92. }
  93. }
  94. }
  95. ctx.draw()
  96. },
  97. /** * 自定义函数--监听点击方块事件 */
  98. touchBox: function(e) {
  99. // 如果游戏已经成功,不做任何操作
  100. if (this.data.isWin) {
  101. // 终止本函数
  102. return
  103. }
  104. // 获取被点击方块的坐标x和y
  105. var x = e.changedTouches[0].x
  106. var y = e.changedTouches[0].y
  107. // console.log('x:'+x+',y:'+y)
  108. // 换算成行和列
  109. var row = parseInt(y / w)
  110. var col = parseInt(x / w)
  111. // 如果点击的不是空白位置
  112. if (num[row][col] != '22') {
  113. // 尝试移动方块
  114. this.moveBox(row, col)
  115. // 重新绘制画布内容
  116. this.drawCanvas()
  117. // 判断游戏是否成功
  118. if (this.isWin()) {
  119. // 在画面上绘制提示语句
  120. let ctx = this.ctx
  121. // 绘制完整图片
  122. ctx.drawImage(url, 0, 0)
  123. // 绘制文字
  124. ctx.setFillStyle('#e64340')
  125. ctx.setTextAlign('center')
  126. ctx.setFontSize(60)
  127. ctx.fillText('游戏成功', 150, 150)
  128. ctx.draw()
  129. }
  130. }
  131. },
  132. /** * 自定义函数--移动被点击的方块 */
  133. moveBox: function(i, j) {
  134. // 情况1:如果被点击的方块不在最上方,检查可否上移
  135. if (i > 0) {
  136. // 如果方块的上方是空白
  137. if (num[i - 1][j] == '22') {
  138. // 交换当前被点击的方块和空白的位置
  139. num[i - 1][j] = num[i][j]
  140. num[i][j] = '22'
  141. return
  142. }
  143. }
  144. // 情况2:如果被点击的方块不在最下方,检查可否下移
  145. if (i < 2) {
  146. // 如果方块的下方是空白
  147. if (num[i + 1][j] == '22') {
  148. // 交换当前被点击的方块和空白的位置
  149. num[i + 1][j] = num[i][j]
  150. num[i][j] = '22'
  151. return
  152. }
  153. }
  154. // 情况3:如果被点击的方块不在最左侧,检查可否左移
  155. if (j > 0) {
  156. // 如果方块的左侧是空白
  157. if (num[i][j - 1] == '22') {
  158. // 交换当前被点击的方块和空白的位置
  159. num[i][j - 1] = num[i][j]
  160. num[i][j] = '22'
  161. return
  162. }
  163. }
  164. // 情况4:如果被点击的方块不在最右侧,检查可否右移
  165. if (j < 2) {
  166. // 如果方块的右侧是空白
  167. if (num[i][j + 1] == '22') {
  168. // 交换当前被点击的方块和空白的位置
  169. num[i][j + 1] = num[i][j]
  170. num[i][j] = '22'
  171. return
  172. }
  173. }
  174. },
  175. /** * 自定义函数--判断游戏是否成功 */
  176. isWin: function() {
  177. // 使用双重for循环检查整个数组
  178. for (var i = 0; i < 3; i++) {
  179. for (var j = 0; j < 3; j++) {
  180. // 如果有方块位置不对
  181. if (num[i][j] != i * 10 + j) {
  182. // 返回假,游戏尚未成功
  183. return false
  184. }
  185. }
  186. }
  187. // 游戏成功,更新状态
  188. this.setData({
  189. isWin: true
  190. })
  191. // 返回真,游戏成功
  192. return true
  193. },
  194. /** * 自定义函数--重新开始游戏 */
  195. restartGame: function() {
  196. // 更新游戏状态
  197. this.setData({
  198. isWin: false
  199. })
  200. // 打乱方块顺序
  201. this.shuffle()
  202. // 绘制画布内容
  203. this.drawCanvas()
  204. },
  205. /** * 生命周期函数--监听页面加载 */
  206. onLoad: function(options) {
  207. // console.log(options.level)
  208. // 更新图片路径地址
  209. url = '/images/' + options.level
  210. // 更新提示图的地址
  211. this.setData({
  212. url: url
  213. })
  214. // 创建画布上下文
  215. this.ctx = wx.createCanvasContext("myCanvas")
  216. // 打乱方块顺序
  217. this.shuffle()
  218. // 绘制画布内容
  219. this.drawCanvas()
  220. },
  221. /** * 生命周期函数--监听页面初次渲染完成 */
  222. onReady: function() {
  223. },
  224. /** * 生命周期函数--监听页面显示 */
  225. onShow: function() {
  226. },
  227. /** * 生命周期函数--监听页面隐藏 */
  228. onHide: function() {
  229. },
  230. /** * 生命周期函数--监听页面卸载 */
  231. onUnload: function() {
  232. },
  233. /** * 页面相关事件处理函数--监听用户下拉动作 */
  234. onPullDownRefresh: function() {
  235. },
  236. /** * 页面上拉触底事件的处理函数 */
  237. onReachBottom: function() {
  238. },
  239. /** * 用户点击右上角分享 */
  240. onShareAppMessage: function() {
  241. }
  242. })

发表评论

表情:
评论列表 (有 0 条评论,407人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java(拼图游戏

    目录 一、主界面分析: 二、逻辑处理 三、文件目录 四、代码 (一)游戏界面 (二)登录界面 (三)注册界面 (四)测试类代码 五、实现效果 ----