微信小程序实现拼图小游戏

微信小游戏入门案例——拼图游戏,供大家参考,具体内容如下

涉及内容:canvas组件、小程序界面绘图API

目录结构:

pages\game\game.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() {

 }
})

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>

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

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

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

{
 "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) {

 }
})

运行截图:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • vue+canvas实现拼图小游戏

    利用 vue+canvas 实现拼图小游戏,供大家参考,具体内容如下 思路步骤 一个拼图拼盘和一个原图参照 对原图的切割以及随机排序 通过W/A/D/S或上下左右进行移动 难度的自主选择 对拼图是否完成的判定 JS实现部分 数据分析 row:拼图的总行数:column:拼图的总列数. (用来设置拼图难度,也是每个拼图块宽高的设置规则) pic[{x,y,row,column,index}]:小拼图的集合,其内元素为小拼图的数据结构. (x.y:拼图块在canvas的绘制规则,初始化后不会进行改变

  • JS实现拼图游戏

    使用JS制作了一款拼图游戏供大家参考. 原理分析: 1.鼠标的点击和松开事件 2.显示原图作为参考 3.方块的移动替换 4.是否完成拼图的判断 5.完成之后会弹窗提示 效果演示 代码展示 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>拼图游戏</title> </head> <style> body, html { p

  • js实现html滑动图片拼图验证

    本文实例为大家分享了js实现html滑动图片拼图验证的具体代码,供大家参考,具体内容如下 html: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0">

  • JS实现滑动拼图验证功能完整示例

    本文实例讲述了JS实现滑动拼图验证功能.分享给大家供大家参考,具体如下: 先看一下效果图: 设置画布滑块属性 const l = 42, // 滑块边长 r = 10, // 滑块半径 w = 310, // canvas宽度 h = 155, // canvas高度 PI = Math.PI const L = l + r * 2 // 滑块实际边长 设置背景图片: 图片链接地址可以自行更换 function getRandomImg() { return 'https://picsum.ph

  • 微信小程序实现拼图小游戏

    微信小游戏入门案例--拼图游戏,供大家参考,具体内容如下 涉及内容:canvas组件.小程序界面绘图API 目录结构: pages\game\game.js // pages/game/game.js // 方块的初始位置 var num = [ ['00', '01', '02'], ['10', '11', '12'], ['20', '21', '22'] ] // 方块的宽度 var w = 100 // 图片的初始地址 var url = '/images/pic01.jpg' Pag

  • 微信小程序实现拼图游戏

    本文实例为大家分享了微信小程序实现拼图游戏的具体代码,供大家参考,具体内容如下 页面展示 项目链接 微信小程序实现拼图游戏 项目设计 首页面 wxml <!--index.wxml--> <view class="container"> <!-- 标题 --> <view class="title">游戏选关</view> <!-- 关卡列表 --> <view class="l

  • 微信小程序实现2048小游戏的详细过程

    效果图 实例代码 今天我们要用微信小程序实现2048小游戏,效果图如上面所示.游戏的规则很简单,你需要控制所有方块向同一个方向运动,两个相同数字方块撞在一起之后合并成为他们的和,每次操作之后会随机生成一个2或者4,最终得到一个"2048"的方块就算胜利了. // 构造一个空的矩阵[[null,..,size.length],[]] empty: function() { var cells = []; for (var x = 0; x < this.size; x++) { v

  • 微信小程序实现贪吃蛇游戏

    本文实例为大家分享了微信小程序实现贪吃蛇游戏的具体代码,供大家参考,具体内容如下 一.项目截图 二.源代码 1.WXML 代码如下(示例): <view class='container'> <view class='content-bottom' bindtouchmove='touchMove' bindtouchstart='touchStart' bindtouchend='touchEnd'> <view wx:for="{{ground}}"

  • 微信小程序使用蓝牙小插件

    本文实例为大家分享了微信小程序使用蓝牙小插件,供大家参考,具体内容如下 bluetooth.js function BLE(options) { this.options = options || { locator: {} }; } function ab2hex(buffer) { const hexArr = Array.prototype.map.call( new Uint8Array(buffer), function (bit) { return ('00' + bit.toStr

  • 微信小程序实现获取小程序码和二维码java接口开发

    前言:目前小程序推出了自己的识别码,小程序码,这个圆形的码看起来比二维码好看.本文总结微信小程序的获取小程序码和二维码并生成二维码图片的接口开发.主要内容摘抄自微信小程序的API文档,java接口开发是自己总结开发. 微信小程序API文档:获取二维码 一.简介 通过后台接口可以获取小程序任意页面的二维码,扫描该二维码可以直接进入小程序对应的页面.目前微信支持两种二维码,小程序码(左),小程序二维码(右),如下所示: 二.获取小程序码 目前有两个接口可以生成小程序码,开发者可以根据自己的需要选择合

  • 如何在微信小程序里面退出小程序的方法

    公司要求用小程序重构已有的微信公众号,于是没接触过小程序的我...好的,直接进入主题. 如何在小程序里面退出小程序. 这个功能基本上都会用到,而文档里面没有找到如微信一样直接的api: WeixinJSBridge.call('closeWindow'); 于是我就各种上网搜,好的,结果告诉我小程序已经出了这个api,但未公开= =||| 那就是说 现在 是没有这个api的(掀桌!),查了又查,是有一个方法,就是利用现有的api自己做一个. 是的,就是用这几个美丽的东西. 首先我们有两个页面,i

  • 微信小程序常用简易小函数总结

    本文实例讲述了微信小程序常用简易小函数.分享给大家供大家参考,具体如下: 最近一直在写微信小程序,而且由于是第二次写了,所以针对很多通用的情况封装了一些函数,建议你们放在app.js中,方便全局去调用. 提示类函数 微信有一种原生的API用于显示提示类结果的wx.showToast,而且其中的图片是可以自定义的,所以为了保证全部一致性,而且方便调用,所以我将其全部封装在了app.js中: // 成功 showSuccess: function (message) { wx.showToast({

  • 微信小程序版翻牌小游戏

    本文实例为大家分享了微信小程序翻牌游戏的具体代码,供大家参考,具体内容如下 一.新建一个quick start项目看看结构 在微信开发工具点击添加项目,选择 无appid,勾上"在当前目录中创建quick start 项目". 可以看到一共有两个目录 pages和utils,和根目录下的3个app文件.pages存放的是小程序的页面,每个也面都有自己独立的文件夹. 一个页面由4文件构成,js文件是程序逻辑:wxss是微信定义的样式文件,语法跟css一样,支持的样式要少一些:wxml文件

  • 微信小程序 教程之小程序配置

    微信小程序--配置 以下就是小编对小程序配置的资料进行的系统的整理,希望能对开发者有帮助. 我们使用app.json文件来对微信小程序进行全局配置,决定页面文件的路径.窗口表现.设置网络超时时间.设置多 tab 等. 以下是一个包含了所有配置选项的简单配置app.json : { "pages": [ "pages/index/index", "pages/logs/index" ], "window": { "na

随机推荐