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