虽然说2048是好久前比较火的小游戏,但直到最近才有机会去研究下2048实现的源码,这里就简单写一下我(bie)的(ren)思路:

首先2048需要有十六个卡片,这个卡片可以用FrameLayout的子类来实现(继承),里面可以用TextView来实现设置背景颜色,显示的数字等。这样我们就可以简单实现这个卡片啦:

 public class Card extends FrameLayout {

     private int num = 0;
private TextView label; public Card(Context context) {
super(context); label = new TextView(getContext());
label.setTextSize(32);
label.setGravity(Gravity.CENTER);
label.setBackgroundColor(0x33ffffff);
LayoutParams lp = new LayoutParams(-1, -1);
lp.setMargins(10, 10, 0, 0);
addView(label, lp);
setNum(0);
}

**********************************************

其次,我们需要添加十六个卡片到屏幕上,应该怎样实现这个屏幕呢?我们可以用GridLayout的子类(继承)实现,并用一个二维数组来存储下每个卡片的状态:

 public class GameView extends GridLayout {

     private Card cardsMap[][] = new Card[4][4];
private List<Point> emptyPoint = new ArrayList();//记录空的位置 *********************************************** private void addCards(int cardWidth, int cardHeight) {//添加卡片
Card cd;
for (int x = 0; x < 4; x++) {
for (int y = 0; y < 4; y++) {
cd = new Card(getContext());
cd.setNum(0);
addView(cd, cardWidth, cardHeight);
cardsMap[x][y] = cd;
}
} }

******************************************

然后我们就需要去判断用户的手势。通过设置一个setOnTouchListener(new OnTouchListener())去监听用户的操作,当用户按下屏幕时,记录下此时的坐标,当用户手指离开屏幕时,计算坐标的偏移量,根据坐标偏移量的相对差来判断用户的意图是向上,向下,还是向左,向右:

  public boolean onTouch(View arg0, MotionEvent arg1) {

switch (arg1.getAction()) {
case MotionEvent.ACTION_DOWN:
startX = arg1.getX();
startY = arg1.getY();
break;
case MotionEvent.ACTION_UP:
offsetX = arg1.getX() - startX;
offsetY = arg1.getY() - startY; if (Math.abs(offsetX) > Math.abs(offsetY)) {
if (offsetX < -3) {
slideLeft();
} else if (offsetX > 2) {
slideRight();
}
} else {
if (offsetY < -3) {
slideUp();
} else if (offsetY > 3) {
slideDown();
}
}
break; }
return true; }

**************************************

判断出用户的意图后,我们就应该去处理相应的事件啦,这里只贴上向左滑动的处理代码,其他三个方向的处理相类似:

 boolean flag = false;

         for (int y = 0; y < 4; y++) {
for (int x = 0; x < 4; x++) {
for (int x1 = x + 1; x1 < 4; x1++) {
if (cardsMap[x1][y].getNum() > 0) {
if (cardsMap[x][y].getNum() <= 0) {
cardsMap[x][y].setNum(cardsMap[x1][y].getNum());
cardsMap[x1][y].setNum(0);
x--;
flag = true; } else if (cardsMap[x][y].equals(cardsMap[x1][y])) {
cardsMap[x][y].setNum(cardsMap[x][y].getNum() * 2);
cardsMap[x1][y].setNum(0);
MainActivity.getMainActivity().addMyScore(
cardsMap[x][y].getNum());
flag = true;
}
break;
}
}
}
}
if (flag) {
addRandom();//随机地添加一个卡片(实际上设置相应位置上卡片的数字)
checkComplete();//判断游戏是否结束

**************************************************

以上就是android版的2048实现的基本逻辑,可能有些不详细。如果需要详细的源码,可以联系我哈。

Android版2048的更多相关文章

  1. 从零開始开发Android版2048 (一)初始化界面

    自学Android一个月多了,一直在工作之余零零散散地看一些东西.感觉经常使用的东西都有些了解了,可是一開始写代码总会出各种奇葩的问题.感觉还是代码写得太少.这样继续杂乱地学习下去进度也太慢了,并且学 ...

  2. 从零開始开发Android版2048 (三)逻辑推断

    近期工作比較忙,所以更新的慢了一点,今天的主要内容是关于Android版2048的逻辑推断,经过本篇的解说,基本上完毕了这个游戏的主体部分. 首先还是看一下,我在实现2048时用到的一些存储的数据结构 ...

  3. 从零開始开发Android版2048 (二)获取手势信息

    今天是尝试開始Android版2048小游戏的第二天.在今天,我主要学习了怎样获取用户在屏幕滑动的手势,以及对布局进行了一些小小的完好. 获取用户操作的手势(比方向左滑.向右滑等)主要用到了Gestu ...

  4. 从零開始开发Android版2048 (四) 分数、重置、结束

    这一篇的内容主要是在上一篇的基础上,增加分数计算(包含当前分数和最高分数).游戏结束的推断以及游戏界面的重置这三个部分的功能. 一.分数的计算和保存          首先,2048这个游戏的分数包含 ...

  5. 从零開始开发Android版2048 (五) 撤销的实现

    本篇的内容是,在前一篇的基础上添�了撤销的功能.撤销事实上就是将当前的用户界面恢复到这次滑动值前的样子.我实现撤销的主要原理是,将每次滑动后界面上的格子和相应的数字记录下来,当然还有分数,把这些数据写 ...

  6. React Native App设置&Android版发布

    React Native系列 <逻辑性最强的React Native环境搭建与调试> <ReactNative开发工具有这一篇足矣> <解决React Native un ...

  7. 【转】手把手教你读取Android版微信和手Q的聊天记录(仅作技术研究学习)

    1.引言 特别说明:本文内容仅用于即时通讯技术研究和学习之用,请勿用于非法用途.如本文内容有不妥之处,请联系JackJiang进行处理!   我司有关部门为了获取黑产群的动态,有同事潜伏在大量的黑产群 ...

  8. 手把手教你读取Android版微信和手Q的聊天记录(仅作技术研究学习)

    1.引言 特别说明:本文内容仅用于即时通讯技术研究和学习之用,请勿用于非法用途.如本文内容有不妥之处,请联系JackJiang进行处理!   我司有关部门为了获取黑产群的动态,有同事潜伏在大量的黑产群 ...

  9. jQuery实践-网页版2048小游戏

    ▓▓▓▓▓▓ 大致介绍 看了一个实现网页版2048小游戏的视频,觉得能做出自己以前喜欢玩的小游戏很有意思便自己动手试了试,真正的验证了这句话-不要以为你以为的就是你以为的,看视频时觉得看懂了,会写了, ...

随机推荐

  1. spring--aop总结

    AOP(Aspect Oriented Programming的缩写)所用的思想其实和设计模式是一样的,即在不修改原代码的情况下统一增加或者修改功能.还有,AOP大多用在spring里面. AOP是面 ...

  2. 手写控件,frame,center和bounds属性

    一.手写控件 1.手写控件的步骤 (1)使用相应的控件类创建控件对象 (2)设置该控件的各种属性 (3)添加控件到视图中 (4)如果是button等控件,还需考虑控件的单击事件等 (5)注意:View ...

  3. vs------密钥

    HM6NR-QXX7C-DFW2Y-8B82K-WTYJV

  4. 自然语言0_nltk中文使用和学习资料汇总

    http://blog.csdn.net/huyoo/article/details/12188573 官方数据 http://www.nltk.org/book/ Natural Language ...

  5. 按照网上方法js删除指定cookie,却怎么也删除不了,解决如下

    网上方法: 查找原因说是没有指定Path,记得系统里以前也没指定还是可以的,就查了一下现在的系统Path,猜测是系统Path由以前的/改为/E7-Planning 就改了前端删除方法 测试一下OK了, ...

  6. Java反射机制<1>

    如果要通过一个对象找到一个类的名称,此时就需要用到反射机制(反射技术是用来做框架的,一般情况下Java私有对象不能被访问,但是暴力反射可以访问私有对象). 任何一个类如果没有明确地声明继承自哪个父类的 ...

  7. Ubuntu 设置程序开机启动(以指定用户身份)

    一.方法 在/etc/rc.local写程序的启动命令(系统执行内核过程中会启动init进程,该进程把当前runlevel所对应的的所有service 都启动后,才会执行rc.local里的命令),程 ...

  8. jQuery checkbox 所有 全选、全不选、是否选中等

    下面是网络收集: jquery判断checked的三种方法:.attr('checked):   //看版本1.6+返回:”checked”或”undefined” ;1.5-返回:true或fals ...

  9. Java多线程编程核心技术---单例模式与多线程

    立即加载/饿汉模式 立即加载就是使用类的时候已经将对象创建完毕. public class MyObject { //立即加载方式==饿汉模式 private static MyObject myOb ...

  10. [c#]params可变参数

    摘要 在项目中多多少少会用到params这个关键字,来修饰参数,它的作用,让该参数的个数是可变的,并且可变参数必须是方法的最后一个参数.但如何判断到底有没有为该参数传递值,怎么判断? 一个例子 sta ...