基于Android的2048小游戏的简单实现
2017-07-05翟亚静成丽君
翟亚静++成丽君
摘 要2048是目前比较流行的一款适用于各类人群的益智小游戏,在原来设计基础上市场上推出了它的各种新玩法,比如与俄罗斯方块、消消乐、连连看等游戏的结合令2048小游戏在一定程度上增添了更多趣味性。本文采用Java语言和Android平台实现了 2048经典模式的运行,描写了游戏的简单实现。
【关键词】游戏 益智 实现
1 引言
Android 智能手机目前拥有最多的用户使用群体,随着它的不断更新与进步,基于Android的手机游戏也正在经历从简单到复杂的进化过程。通过与俄罗斯方块、消消乐、连连看等游戏思想的结合,使2048小游戏在经典模式的玩法上推出了形式和趣味更强大的众多新玩法。本文采用Java语言,通过Android平台实现了 2048经典模式的运行,描写了游戏的简单实现,以方便实现2048小游戏的后续升级开发。
2 设计
2.1 算法设计
(1)2048游戏界面为一个4*4的方形格子,在格子上方显示当前分数,其下方为最高分。右上角可选择模式,分小裙裙和经典模式。开始时随机出现两个数字,出现的数字仅可能为2或4,设置出现2的概率大于4。
(2)用户可以上下左右四个方向用手指滑动方块,若方块移动方向上有相同的数字则合并,支持同时合并但不支持连续合并,合并消去的格子之和即为所得分数。
(3)每次移动一步,空格上随机出现一个数字(可能为2或者4)。
(4)若格子被数字填满,则游戏结束,用户可以选择重新开始或者退出游戏。
2.2 程序流程图
如图1所示。
2.3 界面实现
如图2所示。
3 核心代码及相关算法解释
setOnTouchListener(new View.OnTouchListener() {
//设置位置起始点和偏移点
//算法逻辑:由于手指在滑动方向会有偏差,一般不会精准的向四个方向滑动,//所以判断是水平方向还是垂直方向的意图,当水平方向偏移量大于垂直方向时表明用户是水//平滑动意图。同时我们只需要知道两点,即:用户手指按下的坐标点和手指离开时的坐标点,
//通过进行比对,从而识别出用户的意图。
private float startX, startY, offsetX, offsetY;
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getAction()) {
//手指按下
case MotionEvent.ACTION_DOWN:
//按下时的x,y坐标
startX = event.getX();
startY = event.getY();
break;
//手指离开
case MotionEvent.ACTION_UP:
//计算手指离开时的偏移量(离开时坐标点-按下时坐标点),从而判断方块是往哪个方向移动
offsetX = event.getX() - startX;
offsetY = event.getY() - startY;
//识别移动方向,若offsetX的绝对值大于offsetY的,则水平移动
if(Math.abs(offsetX) > Math.abs(offsetY)){
//为避免误差,将范围设置为<-5
if(offsetX < -5){
toLeft();
}
else if(offsetX > 5){
toRight();
}
}
else {
if(offsetY < -5){
toUp();
}
else if(offsetY > 5){
toDown();
}
}
break;
default:
break;
}
return true;
}
});
}
//隨机数
private void addRandomNum(){
//新建一个list存放空的方块,操作之前清空
Points.clear();
//对所有位置进行遍历
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
//空方块此时才可以添加值,有值时不进行添加
if (cardsMap[j][i].getNum() <= 0){
Points.add(new Point(j, i));
}
}
}
//取方块。用Math.random()返回一个0-1的数,当大于0.3时,值是2否则为4
Point p = Points.remove((int)(Math.random() * Points.size()));
cardsMap[p.x][p.y].setNum(Math.random()> 0.3 ? 2 : 4);
}
//给出方块向左移动时的三种情况,其余三个移动方向同理
// 1)左边为空
//2)左边碰到的第一个数值相等,则相加
//3)左边碰到的第一个数值不相等,则将其靠左
private void toLeft(){
boolean addFlag = 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){
//如果当前位置上为0,就放在该位置上
if(cardsMap[x][y].getNum() <= 0){
cardsMap[x][y].setNum(cardsMap[x1][y].getNum());
//将原来位置上的值清除
cardsMap[x1][y].setNum(0);
//继续遍历
x--;
addFlag = true;
}
//有值且相同时,合并
else if (cardsMap[x][y].getNum() == cardsMap[x1][y].getNum()){
cardsMap[x][y].setNum(cardsMap[x][y].getNum()*2);
//将原来位置上的值清除
cardsMap[x1][y].setNum(0);
MainActivity.getMainActivity().addScore(cardsMap[x][y].getNum());
addFlag = true;
}
break;
}
}
}
}
if(addFlag == true){
addRandomNum();
endCheck();
}
}
4 結语
本文描述了2048小游戏采用Java语言+Eclipse+ADT+JDK开发的关键算法,不仅游戏玩法简单易操作,实现也相对简单,程序开发仅需要平常使用的安卓操作系统手机进行测试,适合我们初学者提高对Android知识及算法的掌握与应用。
参考文献
[1]Android实训案例(四).https://wenku.baidu.com/view/5e77b1c8ac51f01dc281e53a580216fc700a5373.html.2016-10-17/2017-05-06.
[2]郭霖.第一行代码[Android(第2版)[M].人民邮电出版社,2012.
作者简介
翟亚静(1995-),女,山西省长治市人。山西农业大学软件学院2014级在读本科生。主要研究方向为软件工程。
作者单位
山西农业大学软件学院 山西省晋中市 030801