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

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

页面展示




项目链接


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


项目设计


首页面


wxml


<!--index.wxml-->
<view class="container">
  <!-- 标题 -->
  <view class="title">游戏选关</view>
  <!-- 关卡列表 -->
  <view class="levelBox">
    <view class="box" wx:for="{{levels}}" wx:key="levels{{index}}" bindtap="chooseLevel" data-level="{{item}}">
      <image src="/images/{{item}}"></image>
      <text>第{{index+1}}关</text>
    </view>
  </view>
</view>


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;
}


//index.js
Page({
  /**
   * 页面的初始数据
   */
  data: {
    levels: [
      'pic01.jpg',
      'pic02.jpg',
      'pic03.jpg',
      'pic04.jpg',
      'pic05.jpg',
      'pic06.jpg'
    ]
  },
  /**
   * 自定义函数--游戏选关
   */
  chooseLevel: function(e) {
    // console.log(e.currentTarget.dataset.level)
    // 获取选关图片
    let level = e.currentTarget.dataset.level
    // 跳转游戏页面
    wx.navigateTo({
      url: '../game/game?level='+level,
    })
  },
})


游戏页面


wxml


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


wxss


/* pages/game/game.wxss */
/* 提示图 */
image{
  width: 250rpx;
  height: 250rpx;
}
/* 游戏画布区域 */
canvas{
  border: 1rpx solid;
  width: 300px;
  height: 300px;
}


js


// 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() {
  }
})
相关文章
|
2月前
|
API 开发者
微信native支付对接案例详解
本文详细介绍了微信Native支付的对接流程,包括效果展示、产品介绍、接入前准备、开发指引、API列表、支付通知等,并强调了只有通过微信认证的服务号才能对接微信支付。每年需支付300元认证费用。
78 3
|
3月前
|
监控 小程序 前端开发
排队免单小程序开发源码案例
“排队免单小程序”旨在通过用户排队行为结合特定规则为用户提供免单或优惠机会,提升用户体验及商家流量。核心功能包括用户注册登录、排队管理、免单规则设置、支付与结算、商家管理和通知提醒等。技术上采用微信小程序开发框架,前后端分离架构,集成微信支付等服务,确保高效安全的数据处理与传输。项目开发过程涵盖需求分析、设计开发、集成测试和上线发布,后期注重数据监控、用户反馈和运营推广,以持续优化用户体验。
|
3月前
|
开发框架 小程序 测试技术
排队免单小程序开发模式案例
排队免单小程序通过线上排队系统,为用户提供便捷的免单机会。主要功能包括用户注册与登录、商家入驻与管理、排队系统、通知与提醒、活动记录与查询。技术实现涉及微信小程序原生开发框架、后端技术、API接口和第三方服务。开发过程还包括全面的测试与优化,确保稳定运行和良好体验。最后,通过提交审核、上线运营和推广策略,吸引更多用户和商家入驻。
|
4月前
|
人工智能 小程序 搜索推荐
成功案例分享|使用AI运动识别插件+微搭,快速搭建AI美体运动小程序
今天给大家分享一个最近使用我们的“AI运动识别小程序插件”+“微搭”搭建小程序的经典案例。
成功案例分享|使用AI运动识别插件+微搭,快速搭建AI美体运动小程序
|
4月前
|
缓存 数据可视化 Serverless
微信小游戏 案例一 像素飞机
微信小游戏 案例一 像素飞机
35 2
|
4月前
|
开发框架 前端开发 JavaScript
微信小游戏案例三 抓星星
微信小游戏案例三 抓星星
115 0
微信小游戏案例三 抓星星
|
4月前
|
JavaScript 小程序 前端开发
微信小程序 案例二 飞机大战
微信小程序 案例二 飞机大战
87 0
微信小程序 案例二 飞机大战
|
4月前
|
小程序 搜索推荐 前端开发
短剧小程序开发案例
首先,明确你的短剧平台的目标用户群体和他们的需求。比如,年轻用户可能更倾向于轻松、幽默的短剧内容,而家庭用户则可能更偏爱教育、亲子类的短剧。了解用户需求有助于你设计更符合他们口味的功能和界面
|
4月前
|
人工智能 小程序 Python
Python编程小案例——编一个事件提醒弹窗小程序
Python编程小案例——编一个事件提醒弹窗小程序
50 0
|
7月前
|
JavaScript Java 测试技术
基于SpringBoot+Vue+uniapp的游戏账号交易微信小程序的详细设计和实现(源码+lw+部署文档+讲解等)
基于SpringBoot+Vue+uniapp的游戏账号交易微信小程序的详细设计和实现(源码+lw+部署文档+讲解等)

热门文章

最新文章