2048游戏:(三)Activity及逻辑处理
WelcomeActivity
package com.test.my2048game;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
public class WelcomeActivity extends Activity {
private TextView scoreView;
private int score = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.welcome);
}
public void BeginGameOnClick(View view) {
Intent intent = new Intent(WelcomeActivity.this, MainActivity.class);
this.startActivity(intent);
// Toast.makeText(this, "开始", Toast.LENGTH_SHORT).show();
}
}
MainActivity
package com.test.my2048game;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.TextView;
import android.widget.Toast;
public class MainActivity extends Activity {
private TextView scoreView;
private int score = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
scoreView = (TextView) this.findViewById(R.id.tv_curscore);
}
//退出游戏
public void ExitGameOnClick(View view){
new AlertDialog.Builder(this).setTitle("你好").setMessage("确认退出?")
.setNegativeButton("取消", new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which) {
// Toast.makeText(MainActivity.this, "exit", Toast.LENGTH_SHORT).show();
}
})
.setPositiveButton("确定", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
clearScore();
Intent intent = new Intent(MainActivity.this, WelcomeActivity.class);
startActivity(intent);
}
}).show();
}
public void clearScore() {
score = 0;
showScore();
}
public void addScore(int num) {
score += num;
showScore();
}
public void showScore() {
scoreView.setText(score + "");
}
private static MainActivity mainActivity = null;
public MainActivity(){
mainActivity = this;
}
public static MainActivity getInstance(){
return mainActivity;
}
}
CardView
package com.test.my2048game;
import android.content.Context;
import android.graphics.Color;
import android.view.Gravity;
import android.widget.FrameLayout;
import android.widget.TextView;
public class CardView extends FrameLayout {
private int num;
private TextView label;
public CardView(Context context){
super(context);
label = new TextView(context);
label.setBackgroundColor(0x80FFFF00);
label.setTextSize(24);
label.setTextColor(Color.RED);
label.setGravity(Gravity.CENTER);
LayoutParams param = new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT);
param.setMargins(0, 0, 10, 10);
addView(label,param);
}
public int getNum() {
return num;
}
public void setNum(int num) {
this.num = num;
if(num <= 0){
this.num = 0;
label.setText("");
}else{
label.setText(num+"");
}
}
public boolean equals(CardView card){
return getNum() == card.getNum();
}
}
GameMainView
package com.test.my2048game;
import java.util.ArrayList;
import java.util.List;
import android.R.color;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.graphics.Color;
import android.graphics.Point;
import android.util.AttributeSet;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.GridLayout;
/**
* 游戏主界面
*
* @author zhw
*
*/
public class GameMainView extends GridLayout {
public GameMainView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
public GameMainView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public GameMainView(Context context) {
super(context);
init();
}
public static final int CARD_ROW = 4;// 总行数
public static final int CARD_COL = 4;// 总列数
@Override
protected void onSizeChanged(int w, int h, int oldw, int oldh) {
super.onSizeChanged(w, h, oldw, oldh);
int width = (w - 8) / CARD_ROW;
int height = (h - 8) / CARD_COL;
addCardView(width, height);
// 开始游戏
// (注意startGame,不能放在init方法中。init方法是在构造函数中调用,此时有些属性尚未初始化。onSizeChanged是在构造函数之后调用)
startGame();
}
/**
* 添加随机显示
*/
private void addRandomCard() {
try {
emptyCard.clear();
for (int x = 0; x < CARD_ROW; x++) {
for (int y = 0; y < CARD_COL; y++) {
Point p = new Point(x, y);
emptyCard.add(p);
}
}
Point point = emptyCard.remove((int) (Math.random() * emptyCard.size()));
int randNum = Math.random() > 0.1 ? 2 : 4;
cardArr[point.x][point.y].setNum(randNum);
} catch (Exception e) {
Log.v("error", e.getMessage());
e.printStackTrace();
}
}
// 空卡片
private List<Point> emptyCard = new ArrayList<Point>();
// 卡片数组
private CardView[][] cardArr = new CardView[CARD_ROW][CARD_COL];
/**
* 添加card view 矩阵
*/
private void addCardView(int width, int height) {
CardView card;
for (int y = 0; y < CARD_COL; y++) {
for (int x = 0; x < CARD_ROW; x++) {
card = new CardView(getContext());
card.setNum(0);
addView(card, width, height);
cardArr[x][y] = card;
}
}
}
/**
* 初始化
*/
private void init() {
this.setColumnCount(CARD_COL);
this.setBackgroundColor(Color.DKGRAY);
// 添加touch监听
setOnTouchListener(new GameOnTouchListener());
}
/**
* 开始游戏
*/
private void startGame() {
MainActivity.getInstance().clearScore();
for (int x = 0; x < CARD_ROW; x++) {
for (int y = 0; y < CARD_COL; y++) {
cardArr[x][y].setNum(0);
}
}
for (int i = 0; i < 2; i++) {
addRandomCard();
}
}
/**
* touch监听
*
* @author zhw
*
*/
private final class GameOnTouchListener implements OnTouchListener {
// touch坐标
private int startX, startY, disX, disY;
private final static int IGNORE_DIS = 7; // 误差距离
@Override
public boolean onTouch(View v, MotionEvent event) {
switch (event.getActionMasked()) {
case MotionEvent.ACTION_DOWN:// 按下
startX = (int) event.getX();
startY = (int) event.getY();
break;
case MotionEvent.ACTION_UP:// 抬起
int disX = ((int) event.getX()) - startX;
int disY = ((int) event.getY()) - startY;
if (Math.abs(disX) > Math.abs(disY)) {// 水平方向
if (disX > IGNORE_DIS) {
TurnToRight(); // 向右
} else if (disX < -IGNORE_DIS) {
TurnToLeft(); // 向左
}
} else if (Math.abs(disX) < Math.abs(disY)) { // 垂直方向
if (disY > IGNORE_DIS) {
TurnToDown();// 向下
} else if (disY < -IGNORE_DIS) {
TurnToUp(); // 向上
}
}
;
break;
}
return true;
}
}
/**
* 向上翻
*/
private void TurnToUp() {
// System.out.println("TurnToUp");
boolean isAddNewCard = false;
for (int x = 0; x < CARD_ROW; x++) {
for (int y = 0; y < CARD_COL; y++) { // outA
for (int i = y + 1; i < CARD_ROW; i++) { // innerB
if (cardArr[x][i].getNum() > 0) { // innerB不为空
// 如果outA为空。 示例: 0 2
if (cardArr[x][y].getNum() <= 0) {
// B清空,A设为B
cardArr[x][y].setNum(cardArr[x][i].getNum());
cardArr[x][i].setNum(0);
y--;
isAddNewCard = true;
} else if (cardArr[x][y].equals(cardArr[x][i])) { // 如果outA不为空,示例
// 2
// 2
// A*2,B设为空
cardArr[x][y].setNum(cardArr[x][y].getNum() * 2);
cardArr[x][i].setNum(0);
isAddNewCard = true;
MainActivity.getInstance().addScore(cardArr[x][y].getNum());
}
break;
}
}
}
}
if (isAddNewCard) {
addRandomCard();
}
}
private void TurnToRight() {
// System.out.println("TurnToRight");
boolean isAddNewCard = false;
for (int y = 0; y < CARD_COL; y++) {
for (int x = CARD_ROW - 1; x >= 0; x--) { // outA
for (int i = x - 1; i >= 0; i--) { // innerB
if (cardArr[i][y].getNum() > 0) { // innerB不为空
// 如果outA为空。 示例: 2 0
if (cardArr[x][y].getNum() <= 0) {
// B清空,A设为B
cardArr[x][y].setNum(cardArr[i][y].getNum());
cardArr[i][y].setNum(0);
x++;
isAddNewCard = true;
} else if (cardArr[x][y].equals(cardArr[i][y])) { // 如果outA不为空,示例
// A*2,B设为空
cardArr[x][y].setNum(cardArr[x][y].getNum() * 2);
cardArr[i][y].setNum(0);
isAddNewCard = true;
MainActivity.getInstance().addScore(cardArr[x][y].getNum());
}
break;
}
}
}
}
if (isAddNewCard) {
addRandomCard();
}
}
private void TurnToLeft() {
// System.out.println("TurnToLeft");
boolean isAddNewCard = false;
for (int y = 0; y < CARD_COL; y++) {
for (int x = 0; x < CARD_ROW; x++) {
for (int x1 = x + 1; x1 < CARD_ROW; x1++) {
if (cardArr[x1][y].getNum() > 0) {
if (cardArr[x][y].getNum() <= 0) {
cardArr[x][y].setNum(cardArr[x1][y].getNum());
cardArr[x1][y].setNum(0);
x--;
isAddNewCard = true;
} else if (cardArr[x][y].equals(cardArr[x1][y])) {
cardArr[x][y].setNum(cardArr[x][y].getNum() * 2);
cardArr[x1][y].setNum(0);
isAddNewCard = true;
MainActivity.getInstance().addScore(cardArr[x][y].getNum());
}
break;
}
}
}
}
// if (isAddNewCard) {
// addRandomCard();
// }
}
private void TurnToDown() {
// System.out.println("TurnToDown");
boolean isAddNewCard = false;
for (int x = 0; x < CARD_ROW; x++) {
for (int y = CARD_COL - 1; y >= 0; y--) {
for (int y1 = y - 1; y1 >= 0; y1--) {
if (cardArr[x][y1].getNum() > 0) {
if (cardArr[x][y].getNum() <= 0) {
cardArr[x][y].setNum(cardArr[x][y1].getNum());
cardArr[x][y1].setNum(0);
y++;
isAddNewCard = true;
} else if (cardArr[x][y].equals(cardArr[x][y1])) {
cardArr[x][y].setNum(cardArr[x][y].getNum() * 2);
cardArr[x][y1].setNum(0);
isAddNewCard = true;
MainActivity.getInstance().addScore(cardArr[x][y].getNum());
}
break;
}
}
}
}
if (isAddNewCard) {
addRandomCard();
}
}
private void checkIsFinish() {
boolean isFinish = true;
ALL: for (int y = 0; y < 4; y++) {
for (int x = 0; x < 4; x++) {
if (cardArr[x][y].getNum() == 0 || (x > 0 && cardArr[x][y].equals(cardArr[x - 1][y]))
|| (x < 3 && cardArr[x][y].equals(cardArr[x + 1][y]))
|| (y > 0 && cardArr[x][y].equals(cardArr[x][y - 1]))
|| (y < 3 && cardArr[x][y].equals(cardArr[x][y + 1]))) {
isFinish = false;
break ALL;
}
}
}
if (isFinish) {
new AlertDialog.Builder(getContext()).setTitle("你好").setMessage("游戏结束")
.setNegativeButton("退出", new DialogInterface.OnClickListener(){
@Override
public void onClick(DialogInterface dialog, int which) {
}
})
.setPositiveButton("重来", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
startGame();
}
}).show();
}
}
}
浙公网安备 33010602011771号