Android游戏: 华容道

本人用 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]);
        }
    }
}

  • 1
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值