欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

Android小项目:2021最新版本的2048小游戏

最编程 2024-08-15 11:12:53
...

Android小项目–2048小游戏

文章目录

  • Android小项目--2048小游戏
    • 1.摘要
    • 2.实现的功能
    • 3.完成的界面展示
    • 4.功能具体实现的过程
      • 1. 游戏面板GameView的设计(采用GridLayout布局)
      • 2. Cell类的设计:Cell用来表示游戏中的小格子
      • 3. 将cell添加到GameView中:
      • 4. 游戏模式的改变:
      • 5. 记录当前分数及历史最高分数
      • 6. 判断游戏是否结束
    • 5. 总结

1.摘要

现如今,电子游戏已慢慢渗透进人们生活中,并在扮演着越来越重的角色。2048小游戏属于益智类小游戏,它做到了娱乐性、趣味性、教育性相统一。益智类的游戏即是需要去开动大脑去思考从而获得游戏的胜利。简单的益智类游戏可以使玩家在娱乐中不断的开发大脑。这样一来就实现了在娱乐中学习。

这篇文章主要为大家介绍了Android实现2048小游戏的相关内容,感兴趣的小伙伴们可以参考一下!

2.实现的功能

  1. 确认布局
  2. UI界面
  3. 2048游戏逻辑的实现
  4. 游戏界面:
    • 基本的4×4格子
    • 扩展的5×5格子
    • 扩展的6×6格子
  5. 记录当前得分和历史最高分数
  6. 游戏模式:
    • 经典模式:达到2048即为“成功”,游戏结束。
    • 无限模式:没有2048的上限,在没有失败的情况下,玩家可以一直玩下去.
  7. 最后游戏结束时“You Win!”或“You Lose!”的判定

3.完成的界面展示

!!在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.功能具体实现的过程

1. 游戏面板GameView的设计(采用GridLayout布局)

  • 先自定义一个GameView类,继承GridLayout,添加两个构造方法(GridLayout布局是Android 4.0新增的布局。引入该布局极大地方便了Grid类型的布局开发,不熟悉该布局的读者朋友可以在Android开发者网站上寻找相关的开发资料进行学习)
public class GameView extends GridLayout {
   

 //两个必要的构造方法
 public GameView(Context context) {
   
   super(context);
   initView();
 }

 public GameView(Context context, AttributeSet attrs) {
   
   super(context, attrs);
   initView();
 }
}
  • 在initView()中定义格子的宽和高,并且添加触摸事件监听
 public void initView(int mode) {
   
        gameMode = mode;
        canSwipe = true;
        // 移除所有视图,以便更改游戏难度
        removeAllViews();
        // 初始化格子
        if (mode == Constant.MODE_CLASSIC) {
   
            // 经典模式
            gridColumnCount = Config.GRIDColumnCount;
        } else if (mode == Constant.MODE_INFINITE) {
   
            // 无限模式
            gridColumnCount = 6;
        }
        cells = new Cell[gridColumnCount][gridColumnCount];
        // 设置界面大小
        setColumnCount(gridColumnCount);
        // 获取格子的宽
        int cellWidth = getCellSize();
        // 获取格子的高
        int cellHeight = getCellSize();
        addCell(cellWidth, cellHeight);
        startGame();
        setOnTouchListener((v, event) -> {
   
            // 通知父控件不要拦截此控件的onTouch事件
            v.getParent().requestDisallowInterceptTouchEvent(true);
            if (canSwipe) {
   
                switch (event.getAction()) {
   
                    case MotionEvent.ACTION_DOWN:
                        setX = event.getX();
                        setY = event.getY();
                        break;
                    case MotionEvent.ACTION_UP:
                        offsetX = event.getX() - setX;
                        offsetY = event.getY() - setY;
                        // 判断滑动方向
                        int orientation = getOrientation(offsetX, offsetY);
                        switch (orientation) {
   
                            case 0:
                                // 向右滑动
                                swipeRight();
                                break;
                            case 1:
                                // 向左滑动
                                swipeLeft();
                                break;
                            case 2:
                                // 向下滑动
                                swipeDown();
                                break;
                            case 3:
                                // 向上滑动
                                swipeUp();
                                break;
                            default:
                            break;
                        }
                    default:
                    break;
                }
            }
            return true;
        });
    }
  • 添加滑动事件(这里举例上滑):
  • 简要说一下此处实现的游戏玩法算法:首先用for循环一行一行地去遍历每一个cell,然后从当前的位置往右去遍历,判断如果获取到了某一个值不是空的,此时有两种情况,一是当前位置上的值是空的,此时把获取到的值放到当前位置上,同时把获取到的位置上的数字清掉;二是当前位置上的值不是空的,并且获取到的值和当前位置上的值相同,则把合并这两个卡片,把当前位置上的值乘以二,同时把获取到的位置上的数字清掉。
  • 还有一种情况是,如果我们当前位置上是空的,然后把右边的值放到当前的位置上去了,此时继续往后边(右边)去遍历,后边的位置还是空的,然后右边又有一个数字和之前放过去的数字是一样的情况的话,也是把它放到这个空位置上去了,这时会发生一个状况:这两张数字实际是一样的,但是它们并不合并。为了避免这种情况的发生,我们再让它去遍历一次,即让x-- ,这样这个问题就解决了。
    //上滑事件
    private void swipeUp() {
   
        // 判断是否需要添加数字
        boolean needAddDigital = false;
        for (int i = 0; i < gridColumnCount; i++) {
   
            for (int j = 0; j < gridColumnCount; j++) {
   
                // 获取当前位置数字
                int currentDigital = cells[j][i].getDigital();
                someData.add(currentDigital);
                if (currentDigital != 0) {
   
                    // 记录数字