本人用 android studio 实现的
源码
package packageName;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Toast;
import packageName.R;
public class MyActivity extends AppCompatActivity {
// 图片宽度
public static final int W = 200;
// 左边距
public static final int LEFT = 50;
// 上边距
public static final int TOP = 200;
// 适应图片的个数
public static final int L = 10;
// 四个方向的常量
public static final int SHANG = 1;
public static final int XIA = 2;
public static final int ZUO = 3;
public static final int YOU = 4;
// 图片控件
private ImageView[] allImg = new ImageView[L];
// 初始化十张图的 x 坐标
private int[] initX = {LEFT + W, LEFT + W, LEFT, LEFT + W * 3, LEFT, LEFT + W * 3, LEFT, LEFT + W, LEFT + W * 2, LEFT + W * 3};
// 初始化十张图的 y 坐标
private int[] initY = {TOP, TOP + W * 2, TOP, TOP, TOP + W * 2, TOP + W * 2, TOP + W * 4, TOP + W * 4, TOP + W * 4, TOP + W * 4};
// 设置十张图的 宽度
private int[] initW = {2 * W, 2 * W, W, W, W, W, W, W, W, W};
// 设置十张图的 高度
private int[] initH = {2 * W, W, 2 * W, 2 * W, 2 * W, 2 * W, W, W, W, W};
// 手指点击的开始位置,用于判断滑动方向
private int startX, startY;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
// 初始化图片
initImgs();
// 初始化位置
initPos();
// 添加事件
addListener();
}
private void addListener() {
// 添加新游戏按钮
ViewGroup.LayoutParams p1 = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
Button btn = new Button(this);
btn.setText("新游戏");
btn.setTextSize(20);
btn.setX(LEFT);
btn.setY(50);
addContentView(btn, p1);
btn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
initPos();
}
});
ViewGroup.LayoutParams[] params = new ViewGroup.LayoutParams[L];
for (int i = 0; i < L; i++) {
final ImageView tempImg = allImg[i];
params[i] = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
ViewGroup.LayoutParams tempP = params[i];
tempP.width = initW[i];
tempP.height = initH[i];
addContentView(tempImg, tempP);
final int finalI = i;
tempImg.setOnTouchListener(new View.OnTouchListener() {
@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:
int endX = (int) event.getX();
int endY = (int) event.getY();
// 假如是点击事件就不执行
if (startX == endX && startY == endY) {
return false;
}
// 是否为左右滑动
if (Math.abs(startX - endX) > Math.abs(startY - endY)) {
// 物体向左动
if (startX > endX) {
if (canMove(tempImg, finalI, ZUO)) {
left(tempImg);
}
} else {
if (canMove(tempImg, finalI, YOU)) {
right(tempImg);
}
}
} else {
// 物体向上动
if (startY > endY) {
if (canMove(tempImg, finalI, SHANG)) {
top(tempImg);
}
} else {
if (canMove(tempImg, finalI, XIA)) {
down(tempImg);
}
}
}
break;
}
if (isWin()) {
Toast.makeText(MyActivity.this, "You Win!", Toast.LENGTH_SHORT).show();
}
return true;
}
});
}
}
// 曹操到达指定的位置就算赢了
private boolean isWin() {
return allImg[0].getX() == LEFT + W && allImg[0].getY() == TOP + W * 3;
}
private void left(ImageView img) {
img.setX(img.getX() - W);
}
private void right(ImageView img) {
img.setX(img.getX() + W);
}
private void top(ImageView img) {
img.setY(img.getY() - W);
}
private void down(ImageView img) {
img.setY(img.getY() + W);
}
// 用于判断图片是否可以滑动, tag 为当前图片的索引, direct 为滑动方向
private boolean canMove(ImageView img, int tag, int direct) {
// 目标图片的 x, y 坐标和 宽高
int x = (int) img.getX();
int y = (int) img.getY();
int w = img.getWidth();
int h = img.getHeight();
// 其它图片的 x, y 坐标和 宽高
int x1, y1, w1, h1;
// 判断移动的方向来预处理坐标
switch (direct) {
case SHANG:
y -= W;
break;
case XIA:
y += W;
break;
case ZUO:
x -= W;
break;
case YOU:
x += W;
}
// 每种图片都有其边界
switch (tag) {
case 0:
if (x < LEFT || x > LEFT + W * 2 || y < TOP || y > W * 3 + TOP) {
return false;
}
break;
case 1:
if (x < LEFT || x > LEFT + W * 2 || y < TOP || y > W * 4 + TOP) {
return false;
}
break;
case 2:
case 3:
case 4:
case 5:
if (x < LEFT || x > LEFT + W * 3 || y < TOP || y > W * 3 + TOP) {
return false;
}
break;
default:
if (x < LEFT || x > LEFT + W * 3 || y < TOP || y > W * 4 + TOP) {
return false;
}
}
// 遍历其他的图片,判断是否碰撞到了
for (int i = 0; i < L; i++) {
if (i != tag) {
x1 = (int) allImg[i].getX();
y1 = (int) allImg[i].getY();
w1 = allImg[i].getWidth();
h1 = allImg[i].getHeight();
// 矩形碰撞器的实现,大家可以画画图来参考
if (x1 >= x && x1 < x + w && y1 >= y && y1 < y + h ||
x1 >= x && x1 < x + w && y1 <= y && y1 > y - h1 ||
x >= x1 && x < x1 + w1 && y >= y1 && y < y1 + h1 ||
x >= x1 && x < x1 + w1 && y > y1 - h && y <= y1) {
return false;
}
}
}
return true;
}
private void initPos() {
for (int i = 0; i < L; i++) {
ImageView tempImg = allImg[i];
tempImg.setX(initX[i]);
tempImg.setY(initY[i]);
}
}
private void initImgs() {
// 0 曹操 1 关羽 2 赵云 3 张飞 4 黄忠 5 马超 6 兵 7 兵 8 兵 9 兵
int[] imgId = {R.drawable.r120, R.drawable.r121, R.drawable.r122, R.drawable.r123, R.drawable.r124,
R.drawable.r125, R.drawable.r126, R.drawable.r127, R.drawable.r128, R.drawable.r129};
for (int i = 0; i < L; i++) {
allImg[i] = new ImageView(this);
final ImageView tempImg = allImg[i];
tempImg.setImageResource(imgId[i]);
}
}
}