package com.game.Utils; import android.content.Context; import android.graphics.Point; import android.media.MediaPlayer; import android.util.AttributeSet; import android.view.MotionEvent; import android.view.View; import android.widget.LinearLayout; import com.game.Activity.MainFragment; import com.game.Model.Card; import com.game.R; import java.util.ArrayList; import java.util.List; public class GameView extends LinearLayout { private Context context; private MediaPlayer player; private Card[][] cardsMap = new Card[Config.LINES][Config.LINES]; private List<Point> emptyPoints = new ArrayList<Point>(); public GameView(Context context) { super(context); this.context = context; player = MediaPlayer.create(context, R.raw.move); initGameView(); } public GameView(Context context, AttributeSet attrs) { super(context, attrs); this.context = context; player = MediaPlayer.create(context, R.raw.move); initGameView(); } //初始化Gameview private void initGameView() { setOrientation(LinearLayout.VERTICAL); setBackgroundColor(0xffbbada0); setOnTouchListener(new OnTouchListener() { private float startX , startY , offsetX , offsetY; @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: startX = event.getX(); startY = event.getY(); break; case MotionEvent.ACTION_UP: offsetX = event.getX() - startX; offsetY = event.getY() - startY; if (Math.abs(offsetX) > Math.abs(offsetY)) { if (offsetX < -5) { player.start(); swipeLeft(); } else if (offsetX > 5) { player.start(); swipeRight(); } } else { if (offsetY < -5) { player.start(); swipeUp(); } else if (offsetY > 5) { player.start(); swipeDown(); } } break; } return true; } }); } //初始化卡片大小 @Override protected void onSizeChanged(int w, int h, int oldw, int oldh) { super.onSizeChanged(w, h, oldw, oldh); Config.CARD_WIDTH = (Math.min(w, h) - 10) / Config.LINES; addCards(Config.CARD_WIDTH, Config.CARD_WIDTH); startGame(); } //添加卡片 private void addCards(int cardWidth, int cardHeight) { Card c; LinearLayout line; LayoutParams lineLp; for (int y = 0; y < Config.LINES; y++) { line = new LinearLayout(getContext()); lineLp = new LayoutParams(-1, cardHeight); addView(line, lineLp); for (int x = 0; x < Config.LINES; x++) { c = new Card(getContext()); line.addView(c, cardWidth, cardHeight); cardsMap[x][y] = c; } } } //开始游戏(也是重新开始) public void startGame() { MainFragment aty = MainFragment.getMainFragment(); aty.clearScore(); aty.showBestScore(aty.getBestScore()); for (int y = 0; y < Config.LINES; y++) { for (int x = 0; x < Config.LINES; x++) { cardsMap[x][y].setNum(0); } } addRandomNum(); addRandomNum(); } //添加随机卡片 private void addRandomNum() { emptyPoints.clear(); for (int y = 0; y < Config.LINES; y++) { for (int x = 0; x < Config.LINES; x++) { if (cardsMap[x][y].getNum() <= 0) { emptyPoints.add(new Point(x, y)); } } } if (emptyPoints.size() > 0) { Point p = emptyPoints.remove((int) (Math.random() * emptyPoints .size())); cardsMap[p.x][p.y].setNum(Math.random() > 0.1 ? 2 : 4); MainFragment.getMainFragment().getAnimLayer() .createScaleTo1(cardsMap[p.x][p.y]); } } //向左移动 private void swipeLeft() { boolean merge = false; for (int y = 0; y < Config.LINES; y++) { for (int x = 0; x < Config.LINES; x++) { for (int x1 = x + 1; x1 < Config.LINES; x1++) { if (cardsMap[x1][y].getNum() > 0) { if (cardsMap[x][y].getNum() <= 0) { MainFragment .getMainFragment() .getAnimLayer() .createMoveAnim(cardsMap[x1][y], cardsMap[x][y], x1, x, y, y); cardsMap[x][y].setNum(cardsMap[x1][y].getNum()); cardsMap[x1][y].setNum(0); x--; merge = true; } else if (cardsMap[x][y].equals(cardsMap[x1][y])) { MainFragment .getMainFragment() .getAnimLayer() .createMoveAnim(cardsMap[x1][y], cardsMap[x][y], x1, x, y, y); cardsMap[x][y].setNum(cardsMap[x][y].getNum() * 2); cardsMap[x1][y].setNum(0); MainFragment.getMainFragment().addScore( cardsMap[x][y].getNum()); merge = true; } break; } } } } if (merge) { addRandomNum(); checkComplete(); } } //向右移动 private void swipeRight() { boolean merge = false; for (int y = 0; y < Config.LINES; y++) { for (int x = Config.LINES - 1; x >= 0; x--) { for (int x1 = x - 1; x1 >= 0; x1--) { if (cardsMap[x1][y].getNum() > 0) { if (cardsMap[x][y].getNum() <= 0) { MainFragment .getMainFragment() .getAnimLayer() .createMoveAnim(cardsMap[x1][y], cardsMap[x][y], x1, x, y, y); cardsMap[x][y].setNum(cardsMap[x1][y].getNum()); cardsMap[x1][y].setNum(0); x++; merge = true; } else if (cardsMap[x][y].equals(cardsMap[x1][y])) { MainFragment .getMainFragment() .getAnimLayer() .createMoveAnim(cardsMap[x1][y], cardsMap[x][y], x1, x, y, y); cardsMap[x][y].setNum(cardsMap[x][y].getNum() * 2); cardsMap[x1][y].setNum(0); MainFragment.getMainFragment().addScore( cardsMap[x][y].getNum()); merge = true; } break; } } } } if (merge) { addRandomNum(); checkComplete(); } } //向上移动 private void swipeUp() { boolean merge = false; for (int x = 0; x < Config.LINES; x++) { for (int y = 0; y < Config.LINES; y++) { for (int y1 = y + 1; y1 < Config.LINES; y1++) { if (cardsMap[x][y1].getNum() > 0) { if (cardsMap[x][y].getNum() <= 0) { MainFragment .getMainFragment() .getAnimLayer() .createMoveAnim(cardsMap[x][y1], cardsMap[x][y], x, x, y1, y); cardsMap[x][y].setNum(cardsMap[x][y1].getNum()); cardsMap[x][y1].setNum(0); y--; merge = true; } else if (cardsMap[x][y].equals(cardsMap[x][y1])) { MainFragment .getMainFragment() .getAnimLayer() .createMoveAnim(cardsMap[x][y1], cardsMap[x][y], x, x, y1, y); cardsMap[x][y].setNum(cardsMap[x][y].getNum() * 2); cardsMap[x][y1].setNum(0); MainFragment.getMainFragment().addScore( cardsMap[x][y].getNum()); merge = true; } break; } } } } if (merge) { addRandomNum(); checkComplete(); } } //向下移动 private void swipeDown() { boolean merge = false; for (int x = 0; x < Config.LINES; x++) { for (int y = Config.LINES - 1; y >= 0; y--) { for (int y1 = y - 1; y1 >= 0; y1--) { if (cardsMap[x][y1].getNum() > 0) { if (cardsMap[x][y].getNum() <= 0) { MainFragment .getMainFragment() .getAnimLayer() .createMoveAnim(cardsMap[x][y1], cardsMap[x][y], x, x, y1, y); cardsMap[x][y].setNum(cardsMap[x][y1].getNum()); cardsMap[x][y1].setNum(0); y++; merge = true; } else if (cardsMap[x][y].equals(cardsMap[x][y1])) { MainFragment .getMainFragment() .getAnimLayer() .createMoveAnim(cardsMap[x][y1], cardsMap[x][y], x, x, y1, y); cardsMap[x][y].setNum(cardsMap[x][y].getNum() * 2); cardsMap[x][y1].setNum(0); MainFragment.getMainFragment().addScore( cardsMap[x][y].getNum()); merge = true; } break; } } } } // DialogUtils.getAddChartDialog(context, MainFragment.getMainFragment().getScore()); if (merge) { addRandomNum(); checkComplete(); } } //检查是否完成 private void checkComplete() { boolean complete = true; ALL: for (int y = 0; y < Config.LINES; y++) { for (int x = 0; x < Config.LINES; x++) { if (cardsMap[x][y].getNum() == 0 || (x > 0 && cardsMap[x][y].equals(cardsMap[x - 1][y])) || (x < Config.LINES - 1 && cardsMap[x][y] .equals(cardsMap[x + 1][y])) || (y > 0 && cardsMap[x][y].equals(cardsMap[x][y - 1])) || (y < Config.LINES - 1 && cardsMap[x][y] .equals(cardsMap[x][y + 1]))) { complete = false; break ALL; } } } if (complete) { DialogUtils.getAddChartDialog(context, MainFragment.getMainFragment().getScore()); } } }