安卓開發2048
阿新 • • 發佈:2020-12-12
技術標籤:安卓
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();
}
}