美文网首页
微信小程序之游戏2048

微信小程序之游戏2048

作者: 喵呜Yuri | 来源:发表于2019-02-11 10:32 被阅读4次

    主要用来锻炼逻辑思维能力


    image.png

    可以选模式


    image.png
    这里面主要解决的问题是:
    1.判断滑动方向
    //在滑动块级绑定滑动开始和滑动结束的方法
      <view class='cell'  bindtouchstart='startFn' bindtouchend='endFn'>
      </view>
    

    很原始的方法,startFn时保存开始的(x,y),endFn时保存结束的(x1,y2),根据这四个参数 判断方向,算法在方法directionFn里

    2.根据滑动方向进行叠加
    叠加方法在afterslider里
    全部代码如下
    html代码:

    <!--index.wxml-->
    <view class="container address">
    <view class='score'>{{score}}分</view>
     <icon class='iconmenu' type="info" size="24" color="#177cb0" bindtap='openmenu'></icon>
    <view wx:if="{{toolindex==1}}">{{step}}步</view>
    <view wx:if="{{toolindex==0}}">{{time}}s</view>
    <view class='gamecon'>
      <view class='row' wx:for="{{cellArr}}" wx:for-item="item" wx:key="">
        <view class='cell'  wx:for="{{item}}" wx:for-item="v"  wx:key="" bindtouchstart='startFn' bindtouchend='endFn'>
          <view class="num bg{{v.number}}">
          <!-- {{v.coordinate}} -->
            <view  wx:if="{{v.number!=0}}">{{v.number}}</view>
          </view>
        </view>
      </view>
    </view>
    <view class='toolCon'>
      <view class='toolcon-item item{{item.status==toolindex}} {{item.class}}' wx:for="{{tool}}" wx:key="">{{item.name}}</view>  
    </view>
    <view class='modal none {{zhezhangc}}'>
    
      <form bindsubmit="formSubmit" bindreset="formReset">
      <view class='header' style='height:30px;'>
       <icon class='iconmenu' type="clear" size="24" color="#ddd" bindtap='openmenu'></icon>
    </view>
       <view class="section section_gap">
        <view class="section__title">规模</view>
        <radio-group name="radiogroup">
          <label>
            <radio value="4" />
            4*4
          </label>
          <label>
            <radio value="3" />
             3*3
          </label>
        </radio-group>  
      </view>
    
       <view class="section section_gap">
        <view class="section__title">规模</view>  
        <view class='group'>
          <view wx:for="{{tool}}" wx:key="" class='item' bindtap='choosemodal' data-data="{{item}}">{{item.name}}
          <icon wx:if="{{item.status==toolindex}}" class='icon' type="success" size="16"></icon> </view> 
        </view>
      </view>
    
        <view class="btn-area">
          <button form-type="submit">Submit</button>
        </view>
      </form>
    </view>
    </view>
    
    

    js代码:

    Page({
    
      /**
       * 页面的初始数据
       */
      data: {
       cellArr:[],
       zhezhangc:true,
       modal:3,
      score:0,
      toushstart:[],
      toolindex:2,
      step:30,
      time:60,
        tool: [{ 'name': '无限模式', 'status': 2, 'class': 'speed' },{ 'name': '计时模式', 'status': 0, 'class': 'time' }, { 'name': '计步模式', 'status': 1, 'class': 'speed' }]
      },
      formSubmit(e) {
        console.log(e.detail.value.radiogroup);
        this.setData({ modal: e.detail.value.radiogroup, zhezhangc:false});
        this.initFn();
      },
      choosemodal: function (event){
        this.setData({ toolindex: event.currentTarget.dataset.data.status});
      },
      openmenu:function(){
        var this_ = this;
        this.setData({ zhezhangc: !this_.data.zhezhangc });
      },
      // 初始化
      initFn:function(){
        var modal = this.data.modal;
        var cellArr = [];
        for (var i = 0; i < modal; i++) {
          var iarr = [];
          for (var j = 0; j < modal; j++) {
            iarr.push({ coordinate: [i, j], number: 0 });
          }
          cellArr.push(iarr);
        }
    
        
        // 二维数组转一维数组
     
        var initget = 1;//第一次先放一个
        var this_ = this;
    
        var random_row = Math.round(Math.random() * (modal - 1));
        var random_cell = Math.round(Math.random() * (modal - 1));
        var getnumber = [2,4,8];
        if (cellArr[random_row][random_cell].number==0){
          // 如果在空白处就放一个方块
          cellArr[random_row][random_cell].number = getnumber[Math.round(Math.random() * 2)];
        }
      
        this.setData({ cellArr: cellArr });
      
      },
      scoreFn:function(num_){
        var score_ = this.data.score;
        this.setData({
          score:score_+num_*2
        })
      },
      refreshcoordinate:function(){
        var cellArr = this.data.cellArr;
        var modal = this.data.modal;
        var random_row;
        var random_cell;
        var this_ = this;
        for(var i = 0;i<1000;i++){
          random_row = Math.round(Math.random() * (modal - 1));
          random_cell = Math.round(Math.random() * (modal - 1));
          
          if (cellArr[random_row][random_cell].number == 0) {
            cellArr[random_row][random_cell].number = 2;
            break;
          }
        }
        
        var isgame = this.gameover();
        var tooltype = this.data.toolindex;
        var step_ = this.data.step;
        
        if (isgame && step_ > 0){
          this_.setData({
            cellArr: cellArr,
            cellArrBefore: cellArr
          });
    
          if (tooltype == 1){
            this_.setData({
              step: this.data.step - 1
            });
          }
         
        }else{
          wx.showModal({
            title: '提示',
            content: '游戏结束',
          });
          this_.setData({
            cellArr: [],
            step:30,
            score: 0
          });
          this_.initFn();
      
        }
      
      },
      gameover:function(){
        var cellArr = this.data.cellArr;
        var modal = this.data.modal;
        var gamecontine_ = false;
        for(var i = 0;i<modal;i++){
          for (var j = 0; j < modal; j++) {
            if (cellArr[i][j].number==0){
              gamecontine_ = true;
            }
          }
        }
       
        return gamecontine_;
      },
      redo:function(){
        var this_ = this;
        this.setData({
          cellArr:this_.data.cellArrBefore
        });
       
      },
      // 滑动开始
      startFn: function (event){
        var X_ = event.touches[0].clientX;
        var Y_ = event.touches[0].clientY;
        this.setData({ toushstart: [X_,Y_]});
      },
      // 滑动结束
      endFn: function (event) {
        var eX = event.changedTouches[0].clientX;
        var eY = event.changedTouches[0].clientY;
      
        var dir = this.directionFn(eX, eY);
        this.afterslider(dir);
      },
      // 判断方向
      directionFn:function(endX,endY){
        var sX = this.data.toushstart[0];
        var sY = this.data.toushstart[1];
        var eX = endX;
        var eY = endY;
    
        // console.log('start' + this.data.toushstart+','+sY+'end:'+eX+','+eY);
        // 求角度
        var a = eX-sX+1;
        var b = sY-eY+1;
        var angle = Math.abs(b / a);
        var direction_;
        // console.log('a:' + a + ',b:' + b + ',angle:' + angle);
          if (a > 0 && angle<1){
            direction_ = 1;
            // console.log('右边');
          }
          if (a < 0 && angle < 1) {
             direction_ = 3;
              // console.log('左边');
            }
          if (b > 0 && angle > 1) {
              // console.log('上边');
             direction_ = 0;
            }
          if (b < 0 && angle > 1) {
              // console.log('下边');
             direction_ = 2;
            }
    
        return direction_;//上右下左对应0,1,2,3
      },
      // 根据方向做后续操作
      afterslider:function(dir){
        var this_ = this;
        var modal = this.data.modal;
        var cellArr = this.data.cellArr;
        var test_ = this.data.test;
        switch(dir){
          case 0:
          
          // 从上往下循环
          for(var i = 1;i<modal;i++){
           
            for (var j = 0; j < modal; j++) {
              var thisCell = cellArr[i][j];
            
              for(var k=i;k>0;k--){
             
                if (cellArr[k - 1][j].number == 0) {
                  cellArr[k - 1][j].number = cellArr[k][j].number;
                  cellArr[k][j].number = 0
                }else{
                  if (cellArr[k - 1][j].number == cellArr[k][j].number) {
                    var num_ = cellArr[k][j].number;
                    cellArr[k][j].number = 0;
                    cellArr[k - 1][j].number = num_ * 2;
                    this_.scoreFn(num_);
                  }
                }
              }
            }
          }
          break;
          case 2:
          // 从下往上循环
            // modal - 2是因为,最底下的方块不用管了
            for (var i = modal - 2; i >= 0; i--) {
              for (var j = 0; j < modal; j++) {
                var thisCell = cellArr[i][j];
                for(var k = i;k<modal-1;k++){
                  if (cellArr[k + 1][j].number == 0) {
                    cellArr[k + 1][j].number = cellArr[k][j].number;
                    cellArr[k][j].number = 0
                  } else {
                    if (cellArr[k + 1][j].number == cellArr[k][j].number) {
                      var num_ = cellArr[k][j].number;
                      cellArr[k][j].number = 0;
                      cellArr[k + 1][j].number = num_ * 2;
                      this_.scoreFn(num_);
                    }
                  }
                }
              }
            }
          break;
    
          case 1:
            for (var j = modal - 2; j >= 0;j--){
              for(var i=0;i<modal;i++){
                var thisCell = cellArr[i][j];
                for (var k = j; k < modal - 1; k++) {
                    if (cellArr[i][k + 1].number == 0) {
                      cellArr[i][k + 1].number = cellArr[i][k].number;
                      cellArr[i][k].number = 0
                    } else {
                      if (cellArr[i][k + 1].number == cellArr[i][k].number) {
                        var num_ = cellArr[i][k].number;
                        cellArr[i][k].number = 0;
                        cellArr[i][k + 1].number = num_ * 2;
                        this_.scoreFn(num_);
                      }
                    }
                  }
              }
          }
          break;
          case 3:
            // 从左往右
            for(var j = 1;j<modal;j++){
              for (var i = 0; i < modal; i++) {
                var thisCell = cellArr[i][j];
                for (var k = j; k >0; k--) {
                  if (cellArr[i][k - 1].number == 0) {
                    cellArr[i][k - 1].number = cellArr[i][k].number;
                    cellArr[i][k].number = 0
                  } else {
                    if (cellArr[i][k - 1].number == cellArr[i][k].number) {
                      var num_ = cellArr[i][k].number;
                      cellArr[i][k].number = 0;
                      cellArr[i][k - 1].number = num_ * 2;
                      this_.scoreFn(num_);
                    }
                  }
                }
              }
            }
          break;
        }
    
        this.refreshcoordinate();
      },
     watchAgain: function (cellArr, k, j, num_){
       
        if(cellArr[k - 1][j].number == cellArr[k][j].number) {
        cellArr[k][j].number = 0;
        cellArr[k - 1][j].number = num_ * 2;
          var k_ = k - 1;
        
        this.watchAgain(cellArr, k_, j);
      }
     }
     ,
      /**
       * 生命周期函数--监听页面加载
       */
      onLoad: function (options) {
      this.initFn();
      },
    
      /**
       * 生命周期函数--监听页面初次渲染完成
       */
      onReady: function () {
       
      },
    
      /**
       * 生命周期函数--监听页面显示
       */
      onShow: function () {
       
      },
    
      /**
       * 生命周期函数--监听页面隐藏
       */
      onHide: function () {
        
      },
    
      /**
       * 生命周期函数--监听页面卸载
       */
      onUnload: function () {
       
      },
    
      /**
       * 页面相关事件处理函数--监听用户下拉动作
       */
      onPullDownRefresh: function () {
    
      },
    
      /**
       * 页面上拉触底事件的处理函数
       */
      onReachBottom: function () {
    
      },
    
      /**
       * 用户点击右上角分享
       */
      onShareAppMessage: function () {
    
      }
    })
    

    相关文章

      网友评论

          本文标题:微信小程序之游戏2048

          本文链接:https://www.haomeiwen.com/subject/augfeqtx.html