【小三传奇】这是一个关于游戏的故事

咳咳,如果你是被标题吸引过来的,只能说明你思想不太纯洁。

其实,这里要讲的,是关于一个游戏的故事,这个游戏的名字叫做小三传奇,曾经在ios平台上面很火的一款游戏。网上2048方面的教程很多,于是动了自己弄一个小三传奇的教程,附上源码,这样大家就可以一起high了。其实写之前会觉得还挺复杂的,但是基本的逻辑想通之后,会发现思路还是比较清晰简单的。

演示地址看这里 完整代码可以看这里

介绍

这是一款益智类的小游戏,最开始出现在ios平台上,还是收费的(6元),操作简单,需要动脑经才能得高分。一局快则几分钟,慢则二十分钟甚至更久。在它出来之后的几个月后,android平台上才出了一款类似的益智游戏,2048.虽然类似,但习惯了原来游戏的风格和规则之后,对2048的兴趣不大。 以下介绍一些基本的规则:

  1. 游戏初始界面是一个4*4的表格,游戏开始时,在最外层(0行,3行,0列,3列)随机位置生成两个数字,分别是1和2。
  2. 用户可以操作的按键是方向键(上下左右),按下方向键一次,则界面上的数字会朝指定方向移动,并且在界面上指定的一行或一列随机生成一个数字。如果指定方向上的数字不能移动,则此时会触发数字的合并。合并的条件是是1和2可以合并,合并结果为3,或者大于或等于3的两个数,如果相等也可以合并,合并的结果为两个数之和。
  3. 如果最后界面上填满了数字,且没有数字可以合并了,则游戏结束。可以在界面上看到用户的得分。合并的次数越多,得分越高。 原游戏图

效果图

代码

这里代码只取了部分代码,完整的可以看这里

html方面

这里准备了一个容器,中间放置16个块,用来放置数字的

     <div class="box-container clear">
         <div class="cell" id ="pos_0_0"></div>
         <div class="cell" id ="pos_0_1"></div>
         <div class="cell" id ="pos_0_2"></div>
         <div class="cell" id ="pos_0_3"></div>
         <div class="cell" id ="pos_1_0"></div>
         <div class="cell" id ="pos_1_1"></div>
         <div class="cell" id ="pos_1_2"></div>
         <div class="cell" id ="pos_1_3"></div>
         <div class="cell" id ="pos_2_0"></div>
         <div class="cell" id ="pos_2_1"></div>
         <div class="cell" id ="pos_2_2"></div>
         <div class="cell" id ="pos_2_3"></div>
         <div class="cell" id ="pos_3_0"></div>
         <div class="cell" id ="pos_3_1"></div>
         <div class="cell" id ="pos_3_2"></div>
         <div class="cell" id ="pos_3_3"></div>
     </div>

css方面

这里直接是在搜索引擎中找了一张游戏截图,基于这张图来配的颜色。

.box-container {
    width: 256px;
    margin: 0 auto;
    background-color: #eaeaea;
    position: relative;
}
.cell {
    border-radius: 6px;
    background-color: #dbdbdb;
    width: 60px;
    height: 90px;
    margin: 2px;
    float: left;
    overflow: hidden;
}
.num {
    display: inline-block;
    vertical-align: middle;
    width: 100%;
    line-height: 90px;
    text-align: center;
    font-weight: bold;
    font-size: 38px;

}
.num-2 {
    background-color: #ff6680;
    color: white;
}
.num-1 {
    background-color: #66ccff;
    color: white;
}
.num-x {
    background-color: #fcfcfc;
    color: black;
}

js逻辑

首先初始化数据点阵

for(var i = 0; i < r; i ++) {
        this.points[i] = [];
        for(var j = 0; j < c; j++) {
            this.points[i][j] = 0;
        }
    }

生成随机的数字

return Math.random() < 0.5? 1:2;

生成随机的位置

Points.prototype.getRandomPos = function (direct, v) {
    var row, col,count = 0;
    do{
        switch(direct) {
            case UP:
                row = 3;
                col = getPos();
                break;
                ...
            default:
                break;
        }
    } while(!this.isValidPosAndValue(row, col));

    ...
    this.setValue(row, col, v);
    // this.toString();
    return {row: row, col: col};    
}

位置有了,数字有了,将数字显示到指定位置就好

domId = points.getDomId(pos.row, pos.col);
$(domId).html(wrapNum(n));

然后我们就绑定事件,让它能够移动

$(document).on('keyup',  function(evt) {
        switch(evt.keyCode) {
            case KEYUP:
                moveUp();
                updateScore();
                generateNum([1,2], UP);
                break;
            ...
            default:
            break;
        }
    });

能够移动了,那还要看它能不能合并,能不能够得分,对吧。

function canMerge(fx, fy, tx, ty) {
    if(points.getValue(fx, fy) > 0) {
        if(points.getValue(tx, ty) === 0 
            || (points.getValue(fx, fy) + points.getValue(tx, ty) === 3) 
            || (points.getValue(fx, fy) === points.getValue(tx, ty) && points.getValue(tx, ty) >= 3)) {
            return true;
        }
    }
    return false;
}

最后,看看游戏结束没,算了得了多少分

var cur,right, down;
    console.log("--------------------------------");
    points.toString();
    if(IS_OVER) {
        return true;
    }
    for (var i = 0; i <= 3; i++) {
        for (var j = 0; j <= 3; j++) {
            if(this.points.getValue(i, j) === 0) {
                return false;
            }
            //判断右边能否merge
            if(j <=2 && canMerge(i, j, i, j+ 1)) {
                return false;
            }
            //判断下边能否merge
            if(i <=2 && canMerge(i, j, i+ 1, j)) {
                return false;
            }
        };
    };

    //游戏结束
    IS_OVER = true;
    alert('Game Over');
    return true;

小结

抽空写写小游戏还是挺好的,这里的dom和css比较简单,复杂的地方在逻辑那里。完成一个小游戏,里面可以填充的东西太多了,也可以实现自己的一些想法。 比如上面的游戏,如果在手机端,如何展示,可以考虑接入rem方案。比如合并时的动画,这个代码里面留了位置,还未实现。也还可以多加一点趣味性的东西,比如下个会出现哪个数字,可以给出提示。比如出现数字的算法,其实可以设计得复杂些,这样玩起来会更有意思。 最后一句,写写还是挺有意思的。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏数据小魔方

漏斗图的制作技巧

今天跟大家分享漏斗图的制作技巧! ▽ 大家可能不经常听到漏斗图这个名字。其实这种图表常见于数据分析报告以及商务演示场合。漏斗图可以用来反映一组数据的大小趋势,通...

3055
来自专栏互联网杂技

区区省略号竟有大作为...

每当我告诉身边的人省略号(…)是我见过的最为牛逼的字符时,绝大部分人都以为我疯了。 在你也这样认为我之前,请容我认真解释一番: ? 在过去的数十年间,用户界...

33113
来自专栏牛客网

网易前端二面

962
来自专栏转载gongluck的CSDN博客

MFC中的CListCtrl的最左边一列必须左对齐吗?

好久不写MFC的程序了,很多细节问题都记不清了,今晚无意中要用到CListCtrl控件,希望能够表头采用自己绘制的方式显示,于是自己编写了OnPaint方法进行...

2606
来自专栏偏前端工程师的驿站

CSS魔法堂:"那不是bug,是你不懂我!" by inline-block

前言  每当来个需要既要水平排版又要设置固定高宽时,我就会想起display:inline-block,还有为了支持IE5.5/6/7的hack*display...

1978
来自专栏微信小程序开发

小程序支付,再来说说JS浮点数的坑

前言:客服收到报名工具小程序用户反馈:创建报名时,输入19.9元,但是,保存的是19.89元。很明显,这是前端的一个坑,JS浮点数的坑。

1492
来自专栏Crossin的编程教室

【每周一坑】校验文件哈希

先说个通知,给参与了码上行动的同学:又一期展示学习成果的编程擂台活动开始了,即是练手的好机会,又能得到助教的全程支持,还可以得积分赢奖金。赶紧来报名吧!从课程首...

32311
来自专栏数据结构与算法

2017.5.20欢(bei)乐(ju)赛解题报告

预计分数:100+20+50=first 实际分数:20+0+10=gg 水灾(sliker.cpp/c/pas) 1000MS  64MB 大雨应经下了几天雨...

2797
来自专栏WindCoder

java基于SSM的Quartz计划任务配置

想找下Quartz的资料看下,某度,随之眼瞎,你们copy就算了,就不能用心点么,连个代码高亮都不忍心加,实在没心情看下去,但还是要忍一下,待我整理完整,再也不...

711
来自专栏Hongten

Lucene学习总结之一:全文检索的基本原理

根据http://lucene.apache.org/java/docs/index.html定义:

2403

扫码关注云+社区