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.实现的功能
- 确认布局
- UI界面
- 2048游戏逻辑的实现
- 游戏界面:
- 基本的4×4格子
- 扩展的5×5格子
- 扩展的6×6格子
- 记录当前得分和历史最高分数
- 游戏模式:
- 经典模式:达到2048即为“成功”,游戏结束。
- 无限模式:没有2048的上限,在没有失败的情况下,玩家可以一直玩下去.
- 最后游戏结束时“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) {
// 记录数字