翟亞靜++成麗君
摘 要2048是目前比較流行的一款適用于各類人群的益智小游戲,在原來設計基礎上市場上推出了它的各種新玩法,比如與俄羅斯方塊、消消樂、連連看等游戲的結合令2048小游戲在一定程度上增添了更多趣味性。本文采用Java語言和Android平臺實現(xiàn)了 2048經(jīng)典模式的運行,描寫了游戲的簡單實現(xiàn)。
【關鍵詞】游戲 益智 實現(xiàn)
1 引言
Android 智能手機目前擁有最多的用戶使用群體,隨著它的不斷更新與進步,基于Android的手機游戲也正在經(jīng)歷從簡單到復雜的進化過程。通過與俄羅斯方塊、消消樂、連連看等游戲思想的結合,使2048小游戲在經(jīng)典模式的玩法上推出了形式和趣味更強大的眾多新玩法。本文采用Java語言,通過Android平臺實現(xiàn)了 2048經(jīng)典模式的運行,描寫了游戲的簡單實現(xiàn),以方便實現(xiàn)2048小游戲的后續(xù)升級開發(fā)。
2 設計
2.1 算法設計
(1)2048游戲界面為一個4*4的方形格子,在格子上方顯示當前分數(shù),其下方為最高分。右上角可選擇模式,分小裙裙和經(jīng)典模式。開始時隨機出現(xiàn)兩個數(shù)字,出現(xiàn)的數(shù)字僅可能為2或4,設置出現(xiàn)2的概率大于4。
(2)用戶可以上下左右四個方向用手指滑動方塊,若方塊移動方向上有相同的數(shù)字則合并,支持同時合并但不支持連續(xù)合并,合并消去的格子之和即為所得分數(shù)。
(3)每次移動一步,空格上隨機出現(xiàn)一個數(shù)字(可能為2或者4)。
(4)若格子被數(shù)字填滿,則游戲結束,用戶可以選擇重新開始或者退出游戲。
2.2 程序流程圖
如圖1所示。
2.3 界面實現(xiàn)
如圖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;
}
});
}
//隨機數(shù)
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的數(shù),當大于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)左邊碰到的第一個數(shù)值相等,則相加
//3)左邊碰到的第一個數(shù)值不相等,則將其靠左
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ù)遍歷
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開發(fā)的關鍵算法,不僅游戲玩法簡單易操作,實現(xiàn)也相對簡單,程序開發(fā)僅需要平常使用的安卓操作系統(tǒng)手機進行測試,適合我們初學者提高對Android知識及算法的掌握與應用。
參考文獻
[1]Android實訓案例(四).https://wenku.baidu.com/view/5e77b1c8ac51f01dc281e53a580216fc700a5373.html.2016-10-17/2017-05-06.
[2]郭霖.第一行代碼[Android(第2版)[M].人民郵電出版社,2012.
作者簡介
翟亞靜(1995-),女,山西省長治市人。山西農(nóng)業(yè)大學軟件學院2014級在讀本科生。主要研究方向為軟件工程。
作者單位
山西農(nóng)業(yè)大學軟件學院 山西省晉中市 030801