个人程序设计报告及其原型-11组林承毅

程序原型:

https://github.com/Null118/FpGme_V1.1

目前已经做到了全部基本功能的实现(翻牌游戏的正常操作、计算得分、调整难度)

程序设计:

设计思路:

    作为独立的小游戏,主要就是把游戏的整体功能实现。对于翻牌游戏(神经衰弱)的实现思路如下:

    所谓的翻牌动作就是两种图片(牌面和牌背)的分别展示,调整其可显示的参数就可以实现。

    首先定义一个变量记录翻起来牌的个数,如果翻起来的牌数等于2,那么就不能额外的翻开牌,并且翻开的牌需要在短暂的停顿之后(显示时间)盖回去。

    然后进行分情况讨论:翻起来一张牌的情况下,下一张不一样(通过两张牌的来源是否相同判断)则都盖回去,若相同则在剩余时间都展示其正面,

并若是所有牌的状态都为正面朝上,则游戏结束。

    然后是一些细节的设定,如在准备时间或点到了已翻开的牌上,则点击无效;还有一开始随机打乱牌堆再抽取预定数量的牌并存入数组;还有分数的计算,难易程度的设定等。

程序实现:

    下面主要展示游戏主体的函数(.JS),页面布局等具体实现可以在我的原型网址上看到。

    这是游戏部分(即整体游戏过程,翻牌的反馈和显示的判定)的具体实现:

onTap: function (event) {
    var that = this;
    var data = this.data;
    var ix = event.currentTarget.dataset.ix; // 获取点击对象的坐标
    var iy = event.currentTarget.dataset.iy;
    console.log('onTap ' + ix + ' ' + iy);
    if (data.cards[ix][iy].state != 0 || !data.clickable)  // 点击的不是未翻过来的牌或者现在不让点直接pass
      return;
    that.setData({ clickNum: ++data.clickNum }); //点击数加1   
    // 1. 检测是翻过来的第几张牌
    if (data.firstX == -1) {
      // 1.1 第一张修改状态为 1
      data.cards[ix][iy].state = 1;
      data.firstX = ix; data.firstY = iy;  // 记下坐标
      that.setData({ cards: data.cards });     // 通过setData让界面变化
    } else {
      // 1.2 前面已经有张牌翻过来了,先翻到正面然后看是不是一样
      data.cards[ix][iy].state = 1;
      that.setData({ cards: data.cards });
      if (data.cards[data.firstX][data.firstY].src === data.cards[ix][iy].src) {
        // 1.2.1.1 两张牌相同, 修改两张牌的state为2完成配对
        data.cards[data.firstX][data.firstY].state = 2;
        data.cards[ix][iy].state = 2;
        data.checked += 1; // 完成配对数++
        data.firstX = -1; // 准备下一轮匹配 
        // 1.2.1.2 检查是否所有牌都已经翻过来,都已翻过来提示游戏结束
        if (data.checked == data.size) { // 所有牌都配对成功了!
          this.setData({ modalHidden: false });
          clearInterval(this.data.timer); // 暂停计时
          this.data.timer = '';
          this.saveScore({ 'time': data.useTime, 'click': data.clickNum }) // 保存成绩
          this.sf4x4({'time': data.useTime, 'click': data.clickNum }) // 计算分数
        }
      } else {  // 1.2.2 两张牌不同, 修改两张牌的state为 0
        data.cards[data.firstX][data.firstY].state = 0;
        data.cards[ix][iy].state = 0;
        data.firstX = -1;
        data.clickable = false;
        setTimeout(function () {
          that.setData({ cards: data.cards, clickable: true });
        }, 500); //过半秒再翻回去
      }
    }
    console.log(this.data.cards);
  }, turnAllBack: function () {
    for (var ix in this.data.cards)
      for (var iy in this.data.cards[ix])
        this.data.cards[ix][iy].state = 0;
    this.setData({ cards: this.data.cards });
  },

    以下是游戏的准备阶段(即洗牌并储存,计时器的设定和等待):

startGame: function () {  // 开始游戏
    var data = this.data;
    var that = this;
    console.log('startGame');
    var tmp = this.data.allCard.sort(
      function (a, b) { return Math.random() > .5 ? -1 : 1; }).splice(0, Math.floor(data.size)); // 打乱牌堆,挑出size/2张牌
    tmp = tmp.concat(tmp).sort(function (a, b) { return Math.random() > .5 ? -1 : 1; }); // 牌*2,再打乱
    // 添加src,state,转成二维数组方面展示
    var cards = [];
    var ix = -1; var iy = 0;
    for (var i in tmp) {
      if (i % 4 == 0) {
        cards.push([]);
        ix++; iy = 0;
      }
      cards[ix].push({
        src: '../images/' + tmp[i] + '.jpg',
        state: 1   // 为1时显示图片,为0时显示牌背面
      });
    }
    this.data.cards = cards;
    this.setData({
      cards: cards,
      clickNum: 0,
      useTime: 0,
      checked: 0,
      modalHidden: true,
      firstX: -1,
      clickable: false
    });

    var that = this;
    setTimeout(function () {
      that.turnAllBack();  // 所有的牌翻到背面
      console.log('turn all back');
      data.clickable = true; // 开始计时了才让点
      if (data.timer === '') {
        data.timer = setInterval(function () {
          data.useTime++;
          that.setData({ useTime: data.useTime });
        }, 1000); // 游戏开始计时
      } else {
        that.setData({ useTime: 0 });
      }
    }, 3000); // 游戏开始前先让玩家记忆几秒钟
  },

成果展示:

 

 

 

 

 

posted @ 2020-12-17 18:48  Ailw  阅读(202)  评论(0编辑  收藏  举报