微信小程序之游戏2048

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


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

  }
})
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354

推荐阅读更多精彩内容

  • 来源: http://www.douban.com/group/topic/14820131/ 调整变量格式: f...
    MC1229阅读 6,919评论 0 5
  • (转自http://www.douban.com/group/topic/14820131/,转自人大论坛) 调整...
    f382b3d9bdb3阅读 10,462评论 0 8
  • Swift1> Swift和OC的区别1.1> Swift没有地址/指针的概念1.2> 泛型1.3> 类型严谨 对...
    cosWriter阅读 11,101评论 1 32
  • 拥有会计技能的内部审计人员比例高,部分原因在于我们的招聘实务。上述脉冲调查报告显示,首席审计执行官(CAEs)...
    雅蜜蜜阅读 175评论 0 0
  • 今天不知道为什么做了那样一个让我内心难过的像根刺一样的梦:尤其最后被问到了一个触动心底的话:“* *,你是被逼无奈...
    琴子_0066阅读 173评论 0 1