1. 程式人生 > 其它 >安卓開發2048

安卓開發2048

技術標籤:安卓

Card

package com.example.game2048.view;

import android.content.Context;
import android.graphics.Color;
import android.view.Gravity;
import android.widget.FrameLayout;
import android.widget.TextView;

import androidx.annotation.NonNull;

public class Card extends FrameLayout {
  private TextView label;
private int num; public Card(@NonNull Context context) { super(context); label = new TextView(getContext()); label.setGravity(Gravity.CENTER); label.setTextSize(40); label.setTextColor(Color.WHITE); label.setBackgroundColor(Color.parseColor("#1E88E5")); LayoutParams params =
new LayoutParams(-1, -1); params.setMargins(10, 10, 10, 10); label.setLayoutParams(params); addView(label); setNum(0); } public int getNum() { return num; } public void setNum(int num) { this.num = num; if (num == 0) { label.setText(""); } else { label.
setText(num + ""); } } public boolean equals(Card target) { return this.getNum() == target.getNum(); } }

GameView

package com.example.game2048.view;

import android.content.Context;
import android.graphics.Color;
import android.graphics.Point;
import android.util.AttributeSet;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.GridLayout;

import java.util.ArrayList;
import java.util.List;

public class GameView extends GridLayout {
  private boolean gameIsOver;
  private Card[][] mCard = new Card[4][4];
  private List<Point> everyEmp = new ArrayList<>();

  private void init() {
    setColumnCount(4);
    setBackgroundColor(Color.parseColor("#FB8C00"));

    createCard(getCardWH(), getCardWH());

    startGame();

    setOnTouchListener(new OnTouchListener() {
      int startX, startY, offsetX, offsetY;

      @Override
      public boolean onTouch(View v, MotionEvent event) {
        switch (event.getAction()) {
          case MotionEvent.ACTION_DOWN:
            startX = (int) event.getX();
            startY = (int) event.getY();
            break;
          case MotionEvent.ACTION_UP:
            offsetX = (int) (event.getX() - startX);
            offsetY = (int) (event.getY() - startY);
            if (Math.abs(offsetX) > Math.abs(offsetY)) {
              if (offsetX < -5) {
                slideLeft();
              } else if (offsetX > 5) {
                slideRight();
              }
            } else {
              if (offsetY > 5) {
                slideBottom();
              } else if (offsetY < -5) {
                slideTop();
              }
            }
            break;
        }
        return true;
      }
    });
  }

  private void slideBottom() {
    boolean merge = false;
    for (int x = 0; x < 4; x++) {
      for (int y = 3; y >= 0; y--) {
        for (int y1 = y - 1; y1 >= 0; y1--) {
          if (mCard[x][y1].getNum() > 0) {
            if (mCard[x][y].getNum() <= 0) {
              mCard[x][y].setNum(mCard[x][y1].getNum());
              mCard[x][y1].setNum(0);
              merge = true;
              y++;
            } else if (mCard[x][y].equals(mCard[x][y1])) {
              mCard[x][y].setNum(mCard[x][y].getNum());
              mCard[x][y1].setNum(0);
              merge = true;
            }
            break;
          }
        }
      }
    }
    if (merge) {
      addRandomNum();
      check();
    }
  }

  private void slideTop() {
    boolean merge = false;

    for (int x = 0; x < 4; x++) {
      for (int y = 0; y < 4; y++) {

        for (int y1 = y + 1; y1 < 4; y1++) {
          if (mCard[x][y1].getNum() > 0) {
            if (mCard[x][y].getNum() <= 0) {
              mCard[x][y].setNum(mCard[x][y1].getNum());
              mCard[x][y1].setNum(0);
              y--;
              merge = true;

            } else if (mCard[x][y].equals(mCard[x][y1])) {
              mCard[x][y].setNum(mCard[x][y].getNum() * 2);
              mCard[x][y1].setNum(0);
              merge = true;
            }
            break;
          }
        }

      }
    }
    if (merge) {
      addRandomNum();
      check();
    }
  }

  private void slideRight() {
    boolean merge = false;
    for (int y = 0; y < 4; y++) {
      for (int x = 3; x >= 0; x--) {

        for (int x1 = x - 1; x1 >= 0; x1--) {
          if (mCard[x1][y].getNum() > 0) {
            if (mCard[x][y].getNum() <= 0) {
              mCard[x][y].setNum(mCard[x1][y].getNum());
              mCard[x1][y].setNum(0);
              x++;
              merge = true;

            } else if (mCard[x][y].equals(mCard[x1][y])) {
              mCard[x][y].setNum(mCard[x][y].getNum() * 2);
              mCard[x1][y].setNum(0);
              merge = true;
            }
            break;
          }
        }

      }
    }
    if (merge) {
      addRandomNum();
      check();
    }
  }

  private void slideLeft() {
    boolean merge = false;
    for (int y = 0; y < 4; y++) {
      for (int x = 0; x < 4; x++) {

        for (int x1 = x + 1; x1 < 4; x1++) {
          if (mCard[x1][y].getNum() > 0) {
            if (mCard[x][y].getNum() <= 0) {
              mCard[x][y].setNum(mCard[x1][y].getNum());
              mCard[x1][y].setNum(0);
              x--;
              merge = true;

            } else if (mCard[x][y].equals(mCard[x1][y])) {
              mCard[x][y].setNum(mCard[x][y].getNum() * 2);
              mCard[x1][y].setNum(0);
              merge = true;
            }
            break;
          }
        }
      }
    }

    if (merge) {
      addRandomNum();
      check();
    }
  }

  private void startGame() {
    for (int y = 0; y < 4; y++) {
      for (int x = 0; x < 4; x++) {
        mCard[x][y].setNum(0);
      }
    }

    addRandomNum();
    addRandomNum();
  }

  private void addRandomNum() {
    everyEmp.clear();

    for (int y = 0; y < 4; y++) {
      for (int x = 0; x < 4; x++) {
        if (mCard[x][y].getNum() == 0) {
          everyEmp.add(new Point(x, y));
        }
      }
    }

    Point point = everyEmp.remove((int) (Math.random() * everyEmp.size()));
    mCard[point.x][point.y].setNum(Math.random() > 0.1 ? 2 : 4);
  }

  private void createCard(int width, int height) {
    Card card;
    for (int y = 0; y < 4; y++) {
      for (int x = 0; x < 4; x++) {
        card = new Card(getContext());
        card.setNum(0);
        addView(card, width, height);
        mCard[x][y] = card;
      }
    }
  }

  private void check() {
    boolean over = true;
    All:
    for (int x = 0; x < 4; x++) {
      for (int y = 0; y < 4; y++) {
        if (mCard[x][y].getNum() == 0
          || x > 0 && mCard[x][y].equals(mCard[x - 1][y])
          || x < 3 && mCard[x][y].equals(mCard[x + 1][y])
          || y > 0 && mCard[x][y].equals(mCard[x][y - 1])
          || y < 3 && mCard[x][y].equals(mCard[x][y + 1])) {
          over = false;
          break All;
        }
      }
    }

    if (over) {
      Log.d("TAG", "check: over");
    }
  }

  private int getCardWH() {
    DisplayMetrics metrics = getResources().getDisplayMetrics();
    int widthPixels = metrics.widthPixels;
    int heightPixels = metrics.heightPixels;

    int min = Math.min(widthPixels, heightPixels);

    return min / 4;
  }

  public GameView(Context context) {
    this(context, null);
  }

  public GameView(Context context, AttributeSet attrs) {
    this(context, attrs, 0);
  }

  public GameView(Context context, AttributeSet attrs, int defStyleAttr) {
    super(context, attrs, defStyleAttr);
    init();
  }

}