基于Android的2048小游戏的简单实现

2017-07-05 20:02翟亚静成丽君
电子技术与软件工程 2017年12期
关键词:实现益智游戏

翟亚静++成丽君

摘 要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

猜你喜欢
实现益智游戏
益智故事会
办公室人员尚需制定个人发展规划
浅析铁路通信传输的构成及实现方法
爆笑游戏