Android版2048

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

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

 1 public class Card extends FrameLayout {
 2 
 3     private int num = 0;
 4     private TextView label;
 5 
 6     public Card(Context context) {
 7         super(context);
 8 
 9         label = new TextView(getContext());
10         label.setTextSize(32);
11         label.setGravity(Gravity.CENTER);
12         label.setBackgroundColor(0x33ffffff);
13         LayoutParams lp = new LayoutParams(-1, -1);
14         lp.setMargins(10, 10, 0, 0);
15         addView(label, lp);
16         setNum(0);
17     }

 

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

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

 1 public class GameView extends GridLayout {
 2 
 3 
 4     private Card cardsMap[][] = new Card[4][4];
 5     private List<Point> emptyPoint = new ArrayList();//记录空的位置
 6 
 7 ***********************************************
 8 
 9 private void addCards(int cardWidth, int cardHeight) {//添加卡片
10         Card cd;
11         for (int x = 0; x < 4; x++) {
12             for (int y = 0; y < 4; y++) {
13                 cd = new Card(getContext());
14                 cd.setNum(0);
15                 addView(cd, cardWidth, cardHeight);
16                 cardsMap[x][y] = cd;
17             }
18         }
19 
20     }

 

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

然后我们就需要去判断用户的手势。通过设置一个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;

}

 

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

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

 1 boolean flag = false;
 2 
 3         for (int y = 0; y < 4; y++) {
 4             for (int x = 0; x < 4; x++) {
 5                 for (int x1 = x + 1; x1 < 4; x1++) {
 6                     if (cardsMap[x1][y].getNum() > 0) {
 7                         if (cardsMap[x][y].getNum() <= 0) {
 8                             cardsMap[x][y].setNum(cardsMap[x1][y].getNum());
 9                             cardsMap[x1][y].setNum(0);
10                             x--;
11                             flag = true;
12 
13                         } else if (cardsMap[x][y].equals(cardsMap[x1][y])) {
14                             cardsMap[x][y].setNum(cardsMap[x][y].getNum() * 2);
15                             cardsMap[x1][y].setNum(0);
16                             MainActivity.getMainActivity().addMyScore(
17                                     cardsMap[x][y].getNum());
18                             flag = true;
19                         }
20                         break;
21                     }
22                 }
23             }
24         }
25         if (flag) {
26             addRandom();//随机地添加一个卡片(实际上设置相应位置上卡片的数字)
27             checkComplete();//判断游戏是否结束

 

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

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

转载于:https://www.cnblogs.com/WoodJim/p/3909193.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在MATLAB中,NURBS(非均匀有理B样条)是一种强大的数学工具,用于表示和处理复杂的曲线和曲面。NURBS在计算机图形学、CAD(计算机辅助设计)、CAM(计算机辅助制造)等领域有着广泛的应用。下面将详细探讨MATLAB中NURBS的绘制方法以及相关知识点。 我们需要理解NURBS的基本概念。NURBS是B样条(B-Spline)的一种扩展,其特殊之处在于引入了权重因子,使得曲线和曲面可以在不均匀的参数空间中进行平滑插值。这种灵活性使得NURBS在处理非均匀数据时尤为有效。 在MATLAB中,可以使用`nurbs`函数创建NURBS对象,它接受控制点、权值、 knot向量等参数。控制点定义了NURBS曲线的基本形状,而knot向量决定了曲线的平滑度和分布。权值则影响曲线通过控制点的方式,大的权值会使曲线更靠近该点。 例如,我们可以使用以下代码创建一个简单的NURBS曲线: ```matlab % 定义控制点 controlPoints = [1 1; 2 2; 3 1; 4 2]; % 定义knot向量 knotVector = [0 0 0 1 1 1]; % 定义权值(默认为1,如果未指定) weights = ones(size(controlPoints,1),1); % 创建NURBS对象 nurbsObj = nurbs(controlPoints, weights, knotVector); ``` 然后,我们可以用`plot`函数来绘制NURBS曲线: ```matlab plot(nurbsObj); grid on; ``` `data_example.mat`可能包含了一个示例的NURBS数据集,其中可能包含了控制点坐标、权值和knot向量。我们可以通过加载这个数据文件来进一步研究NURBS的绘制: ```matlab load('data_example.mat'); % 加载数据 nurbsData = struct2cell(data_example); % 转换为cell数组 % 解析数据 controlPoints = nurbsData{1}; weights = nurbsData{2}; knotVector = nurbsData{3}; % 创建并绘制NURBS曲线 nurbsObj = nurbs(controlPoints, weights, knotVector); plot(nurbsObj); grid on; ``` MATLAB还提供了其他与NURBS相关的函数,如`evalnurbs`用于评估NURBS曲线上的点,`isoparm`用于生成NURBS曲面上的等参线,以及`isocurve`用于在NURBS曲面上提取特定参数值的曲线。这些工具对于分析和操作NURBS对象非常有用。 MATLAB中的NURBS功能允许用户方便地创建、编辑和可视化复杂的曲线和曲面。通过对控制点、knot向量和权值的调整,可以精确地控制NURBS的形状和行为,从而满足各种工程和设计需求。通过深入理解和熟练掌握这些工具,可以在MATLAB环境中实现高效的NURBS建模和分析。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值