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();
		}
	}

}

  

posted @ 2015-07-21 11:44  2015android  阅读(398)  评论(0编辑  收藏  举报