package com.yimeng.mygame; import java.util.ArrayList; import java.util.List; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.graphics.Point; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.widget.GridLayout; public class GameView extends GridLayout { // 构造方法,初始界面 public GameView(Context context) { super(context); initGameView(); } // 构造方法,初始界面 public GameView(Context context, AttributeSet attrs) { super(context, attrs); initGameView(); } // 构造方法,初始界面 public GameView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); initGameView(); } // 界面初始方法 private void initGameView() { setColumnCount(4); setBackgroundColor(0xffbbada0);// bbada0a1debe setOnTouchListener(new View.OnTouchListener() { private float startX, startY, offsetX, offsetY; @Override public boolean onTouch(View arg0, MotionEvent arg1) { switch (arg1.getAction()) { case MotionEvent.ACTION_DOWN: startX = arg1.getX(); startY = arg1.getY(); break; case MotionEvent.ACTION_UP: offsetX = arg1.getX() - startX; offsetY = arg1.getY() - startY; if (Math.abs(offsetX) > Math.abs(offsetY)) { if (offsetX < -5) { swipeLeft(); } else if (offsetX > 5) { swipeRight(); } } else { if (offsetY < -5) { swipeUp(); } else if (offsetY > 5) { swipeDown(); } } break; default: break; } return true; } }); } @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); int cardWidth = (Math.min(w, h) - 10) / 4; addCards(cardWidth, cardWidth); startGame(); } private void addCards(int cardWidth, int cardHeight) { Card c; for (int y = 0; y < 4; y++) { for (int x = 0; x < 4; x++) { c = new Card(getContext()); c.setNum(0); addView(c, cardWidth, cardHeight); cardMap[x][y] = c; } } } private void startGame() { MainActivity.getMainActivity().clearScore(); for (int y = 0; y < 4; y++) { for (int x = 0; x < 4; x++) { cardMap[x][y].setNum(0); } } addRandomNum(); addRandomNum(); } private void addRandomNum() { emptyPionts.clear(); for (int y = 0; y < 4; y++) { for (int x = 0; x < 4; x++) { if (cardMap[x][y].getNum() <= 0) { emptyPionts.add(new Point(x, y)); } } } Point p = emptyPionts .remove((int) (Math.random() * emptyPionts.size())); cardMap[p.x][p.y].setNum(Math.random() > 0.1 ? 2 : 4); } private void swipeLeft() { boolean merg = false; for (int y = 0; y < 4; y++) { for (int x = 0; x < 4; x++) { for (int x1 = x + 1; x1 < 4; x1++) { if (cardMap[x1][y].getNum() > 0) { if (cardMap[x][y].getNum() <= 0) { cardMap[x][y].setNum(cardMap[x1][y].getNum()); cardMap[x1][y].setNum(0); x--; merg = true; } else if (cardMap[x][y].equals(cardMap[x1][y])) { cardMap[x][y].setNum(cardMap[x][y].getNum() * 2); cardMap[x1][y].setNum(0); MainActivity.getMainActivity().addScore( cardMap[x][y].getNum()); merg = true; } break; } } } } if (merg) { addRandomNum(); checkComplete(); } } private void swipeRight() { boolean merg = false; for (int y = 0; y < 4; y++) { for (int x = 3; x >= 0; x--) { for (int x1 = x - 1; x1 >= 0; x1--) { if (cardMap[x1][y].getNum() > 0) { if (cardMap[x][y].getNum() <= 0) { cardMap[x][y].setNum(cardMap[x1][y].getNum()); cardMap[x1][y].setNum(0); x++; merg = true; } else if (cardMap[x][y].equals(cardMap[x1][y])) { cardMap[x][y].setNum(cardMap[x][y].getNum() * 2); cardMap[x1][y].setNum(0); MainActivity.getMainActivity().addScore( cardMap[x][y].getNum()); merg = true; } break; } } } } if (merg) { addRandomNum(); checkComplete(); } } private void swipeUp() { boolean merg = false; for (int x = 0; x < 4; x++) { for (int y = 0; y < 4; y++) { for (int y1 = y + 1; y1 < 4; y1++) { if (cardMap[x][y1].getNum() > 0) { if (cardMap[x][y].getNum() <= 0) { cardMap[x][y].setNum(cardMap[x][y1].getNum()); cardMap[x][y1].setNum(0); y--; merg = true; } else if (cardMap[x][y].equals(cardMap[x][y1])) { cardMap[x][y].setNum(cardMap[x][y].getNum() * 2); cardMap[x][y1].setNum(0); MainActivity.getMainActivity().addScore( cardMap[x][y].getNum()); merg = true; } break; } } } } if (merg) { addRandomNum(); checkComplete(); } } private void swipeDown() { boolean merg = false; for (int x = 0; x < 4; x++) { for (int y = 3; y >= 0; y--) { for (int y1 = y - 1; y1 >= 0; y1--) { if (cardMap[x][y1].getNum() > 0) { if (cardMap[x][y].getNum() <= 0) { cardMap[x][y].setNum(cardMap[x][y1].getNum()); cardMap[x][y1].setNum(0); y++; merg = true; } else if (cardMap[x][y].equals(cardMap[x][y1])) { cardMap[x][y].setNum(cardMap[x][y].getNum() * 2); cardMap[x][y1].setNum(0); MainActivity.getMainActivity().addScore( cardMap[x][y].getNum()); merg = true; } break; } } } } if (merg) { addRandomNum(); checkComplete(); } } public void checkComplete() { boolean complete = true; All: for (int y = 0; y < 4; y++) { for (int x = 0; x < 4; x++) { if (cardMap[x][y].getNum() == 0 || (x > 0 && cardMap[x][y].equals(cardMap[x - 1][y])) || (x < 3 && cardMap[x][y].equals(cardMap[x + 1][y])) || (y > 0 && cardMap[x][y].equals(cardMap[x][y - 1])) || (y < 3 && cardMap[x][y].equals(cardMap[x][y + 1]))) { complete = false; break All; } } } if (complete) { new AlertDialog.Builder(getContext()) .setTitle("游戏结束!") .setMessage( "得分:" + MainActivity.getMainActivity().getScore()) .setPositiveButton("重新挑战", new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface arg0, int arg1) { startGame(); } }).show(); } } private Card[][] cardMap = new Card[4][4]; private List<Point> emptyPionts = new ArrayList<Point>(); }

bshshah LV1
6月20日
rrrrrrrrrr LV1
2023年9月27日
zhuimengren LV4
2022年5月30日
anneli LV1
2022年2月24日
15162681641 LV1
2021年12月7日
KCBERG LV4
2021年12月1日
马化腾他爸爸 LV1
2021年10月27日
张飞45465 LV1
2021年10月16日
LHKHUVHC LV1
2021年7月30日
rayon6666 LV1
2021年7月2日

bshshah LV1
6月20日
7456321 LV1
2024年4月22日
yerwiu LV10
2024年1月6日
微信网友_6793785677565952 LV1
2023年12月25日
rrrrrrrrrr LV1
2023年9月27日
yyyyyyzh LV8
2023年6月11日
200171 LV9
2023年6月1日
齐吊大神 LV6
2023年4月25日
微信网友_6399771178995712
2023年3月22日
暂无贡献等级
gaoxianhua LV2
2022年8月31日