2023年夏季《移动软件开发》实验报告——实验4

2023年夏季《移动软件开发》实验报告

一、实验目标

1、综合应用所学知识创建完整的拼图游戏项目;2、熟练掌握组件。

二、实验步骤

1.创建项目

2.删除和修改文件

3.创建其他文件

4.根据个人喜好设置导航栏样式

"window": {
    "backgroundTextStyle": "light",
    "navigationBarBackgroundColor": "#E64340",
    "navigationBarTitleText": "拼图游戏",
    "navigationBarTextStyle": "white"
  },

5.公共样式设计

/**app.wxss**/
/** 公共样式设计 可修改 **/
.container {
  height: 100%;
  color:#E64340;
  font-weight: bold;/** 字体加粗**/
  display: flex;
  flex-direction: column;
  align-items: center;/** 设置组布局属性(纵向)**/
  justify-content: space-evenly;/** 设置组布局属性(横向)**/
} 

.title
{
  font-size:18pt;
}

6.首页设计

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

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

7.游戏页面设计

<!--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 */
image{
  width:250rpx;
  height:250rpx;
}

canvas{
  border:1rpx solid;
  width:300px;
  height:300px;
}

8.逻辑实现

(1)首页逻辑实现

/*index.js*/
Page({

  /**
   * 页面的初始数据
   */
  data: {
    levels:[
      'pic01.jpg',
      'pic02.jpg',
      'pic03.jpg',
      'pic04.jpg',
      'pic05.jpg',
      'pic06.jpg'
    ]
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad: function (options) {
    
  },

  /**
   * 生命周期函数--监听页面初次渲染完成
   */
  onReady: function () {
    
  },

  /**
   * 自定义函数--游戏选关
   */
  chooseLevel:function(e){
    let level = e.currentTarget.dataset.level
      wx.navigateTo({
        url:'../game/game?level='+level
      })
  },

  /**
   * 生命周期函数--监听页面隐藏
   */
  onHide: function () {
    
  },

  /**
   * 生命周期函数--监听页面卸载
   */
  onUnload: function () {
    
  },

  /**
   * 页面相关事件处理函数--监听用户下拉动作
   */
  onPullDownRefresh: function () {
    
  },

  /**
   * 页面上拉触底事件的处理函数
   */
  onReachBottom: function () {
    
  },

  /**
   * 用户点击右上角分享
   */
  onShareAppMessage: function () {
    
  }
})

(2)游戏页逻辑

// 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
  },

  /**
   * 生命周期函数--监听页面加载
   */
  onLoad(options) {
    //更新图片路径
    url='/images/'+ options.level
    //更新提示图的地址
    this.setData({url:url})
    this.ctx=wx.createCanvasContext('myCanvas')
    this.shuffle()
    this.drawCanvas()
  },

  /**
   * 自定义函数--随机打乱方块顺序
   */
  shuffle() {
    num=[
      ['00','01','02'],
      ['10','11','12'],
      ['20','21','22']
    ]
    var row=2
    var col=2
    for(var i=0;i<100;i++)
    {
      //随机产生一个方向:上(0)、下(1)、左(2)、右(3)
      var direction=Math.round(Math.random()*3)
      if(direction==0){
        if(row!=0){
          num[row][col]=num[row-1][col]
          num[row-1][col]='22'
          row-=1
        }
      }
      else if(direction==1){
        if(row!=2){
          num[row][col]=num[row+1][col]
          num[row+1][col]='22'
          row+=1
        }
      }
      else if(direction==2){
        if(col!=0){
          num[row][col]=num[row][col-1]
          num[row][col-1]='22'
          col-=1
        }
      }
      else if(direction==3){
        if(col!=2){
          num[row][col]=num[row][col+1]
          num[row][col+1]='22'
          col+=1
        }
      }
    }
  },

  /**
   * 自定义函数--绘制画布内容
   */
  drawCanvas() {
    let ctx=this.ctx

    ctx.clearRect(0,0,300,300)

    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(e) {
    if(this.data.isWin){
      return
    }

    var x=e.changedTouches[0].x
    var y=e.changedTouches[0].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(i,j) {
    if(i>0){
      if(num[i-1][j]=='22'){
        num[i-1][j]=num[i][j]
        num[i][j]='22'
        return
      }
    }
    if(i<2){
      if(num[i+1][j]=='22'){
        num[i+1][j]=num[i][j]
        num[i][j]='22'
        return
      }
    }
    if(j>0){
      if(num[i][j-1]=='22'){
        num[i][j-1]=num[i][j]
        num[i][j]='22'
        return
      }
    }
    if(j<2){
      if(num[i][j+1]=='22'){
        num[i][j+1]=num[i][j]
        num[i][j]='22'
        return
      }
    }
  },

  /**
   * 自定义函数--判断游戏是否成功
   */
  isWin() {
    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() {
    this.setData({isWin:false})
    this.shuffle()
    this.drawCanvas()
  }
})

9.测试小程序功能

三、程序运行结果

1.首页

2.选择关卡

3.移动图片

4.游戏成功界面

5.另一关卡

四、问题总结与体会

这次实验为我的个人项目提供了新的思路,也学会了更多编写小程序的知识,对于跳转界面也有了更深的体会。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值