100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > Android游戏: 华容道

Android游戏: 华容道

时间:2021-12-30 20:46:59

相关推荐

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;@Overrideprotected 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() {@Overridepublic 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() {@Overridepublic 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]);}}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。