game

发布时间 2023-06-18 03:53:45作者: 洛殊

1 布局文件 activity_main

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:layout_gravity="center"
    android:orientation="vertical"
    tools:context=".MainActivity">
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="拼图游戏"
        android:textSize="35sp"
        android:layout_gravity="center"
        android:padding="10dp"/>

    <GridLayout
        android:id="@+id/gridLayout"
        android:layout_width="match_parent"
        android:layout_height="360dp"
        android:columnCount="3"
        android:rowCount="3"
        >

        <ImageView
            android:id="@+id/m00"
            android:layout_columnWeight="1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:scaleType="centerInside"
            android:layout_row="0"
            android:layout_column="0"
             />

        <ImageView
            android:id="@+id/m01"
            android:scaleType="centerInside"
            android:layout_columnWeight="1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_row="0"
            android:layout_column="1"
             />

        <ImageView
            android:id="@+id/m02"
            android:scaleType="centerInside"
            android:layout_columnWeight="1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_row="0"
            android:layout_column="2"
            />

        <ImageView
            android:id="@+id/m10"
            android:scaleType="centerInside"
            android:layout_columnWeight="1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_row="1"
            android:layout_column="0"
            android:padding="2dp" />

        <ImageView
            android:id="@+id/m11"
            android:scaleType="centerInside"
            android:layout_columnWeight="1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_row="1"
            android:layout_column="1"
            android:padding="2dp" />

        <ImageView
            android:id="@+id/m12"
            android:scaleType="centerInside"
            android:layout_columnWeight="1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_row="1"
            android:layout_column="2"
            android:padding="2dp" />


        <ImageView
            android:id="@+id/m20"
            android:scaleType="centerInside"
            android:layout_columnWeight="1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="2dp" />

        <ImageView
            android:id="@+id/m21"
            android:scaleType="centerInside"
            android:layout_columnWeight="1"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:padding="2dp" />

        <ImageView
            android:id="@+id/m22"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_columnWeight="1"
            android:padding="2dp"
            android:scaleType="centerInside" />

    </GridLayout>


    <Button
        android:id="@+id/refresh"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="重新打乱"
        android:textColor="@color/white"
        android:background="@color/design_default_color_secondary"
        android:textSize="20sp"
        android:layout_gravity="center"/>




    <TextView
        android:id="@+id/txt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="一共走了0步"
        android:layout_columnSpan="3"
        android:textStyle="bold"
        android:textSize="20sp"
        android:layout_gravity="center" />


</LinearLayout>

2 控制文件 MainActivity

package com.example.game;

import static java.lang.Math.abs;

import androidx.appcompat.app.AppCompatActivity;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Rect;
import android.graphics.RectF;
import android.graphics.drawable.BitmapDrawable;
import android.hardware.camera2.params.LensShadingMap;
import android.os.Bundle;
import android.util.Log;
import android.view.MotionEvent;
import android.view.View;
import android.widget.Button;
import android.widget.GridLayout;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.HashSet;
import java.util.Random;
import java.util.Set;

public class MainActivity extends AppCompatActivity {
    ImageView [] imgs=new ImageView[9];

    // 九份图片的数组
    Bitmap[] bitmaps = new Bitmap[9];

    Bitmap bitmap = Bitmap.createBitmap(1000, 800, Bitmap.Config.ARGB_8888);
    Canvas canvas =new Canvas(bitmap);
    Button refresh;
    TextView txt;
    float old_x=0,old_y=0;
    int m=3,n=3;
    int count=0;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        imgs[0]=findViewById(R.id.m00);
        imgs[1]=findViewById(R.id.m01);
        imgs[2]=findViewById(R.id.m02);
        imgs[3]=findViewById(R.id.m10);
        imgs[4]=findViewById(R.id.m11);
        imgs[5]=findViewById(R.id.m12);
        imgs[6]=findViewById(R.id.m20);
        imgs[7]=findViewById(R.id.m21);
        imgs[8]=findViewById(R.id.m22);
        refresh=findViewById(R.id.refresh);
        txt=findViewById(R.id.txt);

        //设置响应点击
        for(int i=0;i<9;i++){
            imgs[i].setOnTouchListener(new myTouch());
        }
        refresh.setOnClickListener(new refreshClick());


        // 想绘制的图片
        Bitmap srcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.image);
        // 源区域,表示整个图片
        Rect srcRect = new Rect(0, 0, srcBitmap.getWidth(), srcBitmap.getHeight());
        // 目标区域,表示画布的大小
        RectF dstRectF = new RectF(0f, 0f, canvas.getWidth(), canvas.getHeight());
        // 绘制图片
        canvas.drawBitmap(srcBitmap, srcRect, dstRectF, null);
        this.refresh();





    }

    private void refresh() {
        // 九份图片的宽度和高度
        int w = bitmap.getWidth() / 3;
        int h = bitmap.getHeight() / 3;
        // 随机数生成器
        Random random = new Random();
        // 用于记录已经截取过的位置
        Set<Integer> set = new HashSet<>();
        // 循环九次
        for (int i = 0; i < 9; i++) {
            // 随机生成一个位置,保证不重复
            int index;
            do {
                index = random.nextInt(9);
            } while (set.contains(index));
            set.add(index);
            // 计算该位置对应的左上角坐标
            int x = (index % 3) * w;
            int y = (index / 3) * h;
            // 截取该位置的图片,并存入数组

            bitmaps[i] = Bitmap.createBitmap(bitmap, x, y, w, h);
            imgs[i].setImageBitmap(bitmaps[i]);

        }
        txt.setText("一共走了0步");
    }

    private class refreshClick implements View.OnClickListener {
        @Override
        public void onClick(View v) {
            refresh();
        }
    }

    private class myTouch implements View.OnTouchListener {
        @Override
        public boolean onTouch(View v, MotionEvent event) {
            //计算组件位置
            GridLayout gridLayout=findViewById(R.id.gridLayout);
            int position=gridLayout.indexOfChild(v);


            switch (event.getAction()){
                case MotionEvent.ACTION_DOWN:
                    old_x=event.getX()-v.getLeft();
                    old_y=event.getY()-v.getTop();
                    break;

                case MotionEvent.ACTION_MOVE:
                    old_x=event.getX()-v.getLeft();
                    old_y=event.getY()-v.getTop();
                    break;

                case MotionEvent.ACTION_UP:
                    float new_x,new_y;
                    new_x=event.getX()-v.getLeft();
                    new_y=event.getY()-v.getTop();
                    judge(new_x-old_x,new_y-old_y,position);
                    break;
            }

            //true表示能识别抬起
            return true;
        }
    }


    private void judge(float x,float y,int position){
        if(abs(x)>=abs(y)){ //水平方向移动
            if(x>0){ //向右移
                move(position,position-1);

            }else{//向左移
                move(position,position+1);
            }

        }else{//垂直方向移动
            if(y>0){ //向下移
                move(position,position-n);

            }else{ //向上移动
                move(position,position+n);
            }

        }

    }

    private void move(int old_position,int new_position){  //上下左右 0123
        if(new_position>=0&&new_position<n*m) {
            Bitmap bitmapold=((BitmapDrawable) imgs[old_position].getDrawable()).getBitmap();
            Bitmap bitmapnew=((BitmapDrawable) imgs[new_position].getDrawable()).getBitmap();
            imgs[old_position].setImageBitmap(bitmapnew);
            imgs[new_position].setImageBitmap(bitmapold);

            count++;
            txt.setText("一共走了"+count+"步");
        }
    }
}

3 图片资源

image