Proyecto Android --- juego de rompecabezas (abajo)

Continuando con el artículo anterior, el artículo anterior completó el tiempo en el juego y la disposición aleatoria automática de los fragmentos del programa. Este artículo completará las partes restantes (el movimiento de los fragmentos y la lógica del éxito del rompecabezas)

El proceso de implementación es más o menos: la última foto no se muestra de forma predeterminada, pero realmente existe. Haga clic en la imagen adyacente en el área en blanco (solo se hace clic en la imagen en el área en blanco y es válida) y luego realice el movimiento de la imagen después hacer clic y el intercambio del área en blanco.Después del segundo movimiento, si la combinación de la imagen total final es la misma que la imagen final dada, ¡aparecerá un cuadro emergente que muestra el éxito del rompecabezas!

De hecho, el resumen es un conjunto de conocimientos. ¡Use el intercambio de valores de coordenadas de la matriz para mostrar el intercambio de imágenes y use el movimiento de la imagen varias veces (el intercambio del número de matrices) para ver si es la misma que la imagen designada final importada (orden numérico especificado)!

El método de implementación específico: (los comentarios del código ya están muy detallados y se comentan paso a paso de acuerdo con la lógica, que es fácil de entender)

Si no entiende algo en el área de comentarios, puede dejarme un mensaje o un mensaje privado. Si el artículo tiene errores de código, lógica o escritura inexacta, corríjame. Corregiré y aprenderé a tiempo, ¡gracias!

Para lograr el efecto de hacer clic en los fragmentos:

//Representa la función de mover el botón en la ubicación especificada, intercambiando la imagen con el área en blanco 
    private void move(int imagebuttonId, int site) { 
//Juzgue la imagen seleccionada en la que fila y columna, el método de evaluación es a través de método de resto 
        int sitex=site/imageX; 
        int sitey=site%imageY; 
        //Obtener las coordenadas del área en blanco 
        int blankx=blankSwap/imageX; 
        int blanky=blankSwap%imageY; 
        //Dos condiciones para que las imágenes se muevan 
        // 1. En la misma El valor absoluto de la resta del número de filas y columnas es 1 2. En la misma columna, el valor absoluto de la resta del número de filas es 1 
        int x=Math.abs(sitex- blankx); 
        int y=Math.abs(sitey-blanky); 
        if ((x == 0&&y==1)||(y==0&&x==1)){ 
            //Encuentre este botón móvil 
            ImageButton por id clickButton= findViewById(imagebuttonId); 
            clickButton.setVisibility(View.INVISIBLE); 
            // botón para ver el área en blanco
            ImageButton blackButton=findViewById(blankImgid); 
            //Establece el área en blanco de la imagen 
            blackButton.setImageResource(image[imageIndex[site]]); 
            //Invisible entre movimientos, después del movimiento, configura el control para que sea visible 
            blackButton.setVisibility(View .VISIBLE); 
            //Registre el proceso de cambiar el subtítulo en la matriz que almacena la ubicación de la imagen 
            swap(site,blankSwap); 
            //La nueva actualización de la posición del área en blanco es igual a la posición del botón de clic entrante 
            blankSwap=site; 
            blankImgid= ID de botón de imagen; 
        }

Date cuenta del efecto lógico de juzgar si los escombros se mueven con éxito después de varias veces:

//Evaluar si el rompecabezas es exitoso 
    . private void JudgeGameOver() { 
     boolean loop=true;//Definir el bit indicador 
        para(int i=0;i<imageIndex.length;i++) { 
            if (imageIndex[i] != i ) { 
                loop = false; 
                break; 
            } 
        } 
            if(loop){ 
                //El rompecabezas tiene éxito, detiene el tiempo 
                handler.removeMessages(1); 
                //Después de que el rompecabezas tiene éxito, el jugador tiene prohibido continuar moviendo el botón 
                ib00 .setClickable(falso), 
                ib01.setClickable(falso), 
                ib02.setClickable(falso), 
                ib10.setClickable(falso), 
                ib11.setClickable(falso);
                ib12.setClickable(false); 
                ib20.setClickable(false); 
                ib21.setClickable(false); 
                ib22.setClickable(false); 
                ib22.setImageResource(image[8]); 
                ib22.setVisibility(View.VISIBLE); 
                // ventana emergente Cuadro de diálogo de éxito del usuario 
                AlertDialog.Builder builder=new AlertDialog.Builder(this); 
                builder.setMessage("¡Felicitaciones, el rompecabezas fue exitoso! Su tiempo es "+tiempo+" segundos").setPositiveButton("Confirmar",null); 
                builder .crear().mostrar(); 
            }

Código total de Java:

paquete com.ejemplo.rompecabezas; 

importar androidx.annotation.NonNull; 
importar androidx.appcompat.app.AlertDialog; 
importar androidx.appcompat.app.AppCompatActivity; 

importar android.anotación.SuppressLint; 
importar android.media.Imagen; 
importar android.os.Bundle; 
importar android.os.Handler; 
importar android.os.Message; 
importar android.text.AlteredCharSequence; 
importar android.view.View; 
importar android.widget.Button; 
importar android.widget.ImageButton; 
importar android.widget.TextView; 

clase pública MainActivity extiende AppCompatActivity { 
ImageButton ib00, ib01, ib02, ib10, ib11, ib12, ib20, ib21, ib22; 
Botón reiniciarBtn; 
TextView timeTv;
//定义每行每列图片的个数
private int imageX=3; 
    private int imageY=3; 
    //número total de imágenes 
    private int imgCount=imageX*imageY; 
    //posición del área en blanco 
    private int blankSwap=imgCount-1; 
    //inicialización del botón de identificación del área en blanco 
    private int blankImgid=R.id.pt_id_02x02; 

//Definir la variable de tiempo 
int time = 0; 
//Almacenar el arreglo de fragmentos para administración unificada 
    private int[]image={R.drawable.pt_id_00x00,R.drawable.pt_id_00x01, R. drawable.pt_id_00x02 , 
R.drawable.pt_tv_01x00, R.drawable.pt_tv_01x01, R.drawable.pt_tv_01x02, R.drawable.p1, R.drawable.p2, R.drawable.p3} 
    // Declarar una matriz de imágenes Matriz de subíndices, organice aleatoriamente esta matriz 
    private int[]imageIndex=new int[image.length]; 
Handler handler=new Handler(){ 
    @Override
    public void handleMessage(@NonNull Message msg) { 
     if (msg.what==1){ 
         time++; 
         timeTv.setText("Time: "+time+" segundos"); 
         handler.sendEmptyMessageDelayed(1,1000); 
     } 
    } 
}; 
    @Override 
    protected void onCreate(Bundle SavedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 
        initView(); 
        //Interrumpir fragmentos 
        disruptRandpm(); 
        handler.sendEmptyMessageDelayed(1,1000); 
    } 
/ / Interrumpir aleatoriamente el vacío privado irregular 
    disruptRandpm() { 
        for(int i=0;i<imageIndex.length;i++){
            imageIndex[i]=i; 
        }  
        //Especificar 20 veces, seleccionar aleatoriamente los valores correspondientes a los dos subíndices a intercambiar 
        int rand1,rand2;
        for(int j=0;j<20;j++){ 
            //Genera un subíndice aleatoriamente, el valor de 0-8 
            rand1=(int)(Math.random()*(imageIndex. length-1)); 
            //El segundo subíndice generado aleatoriamente no puede ser el mismo que la primera vez 
            do{ 
                rand2=(int)(Math.random()*(imageIndex.length-1)); 
                if(rand1! =rand2 ){ 
                    break; 
                } 
            }while (true); 
            //Intercambia los valores correspondientes en las dos marcas de esquina 
            swap(rand1,rand2); 
        } 
        //Organiza aleatoriamente en el control especificado 
        ib00.setImageResource(image[imageIndex[0] ]); 
        ib01.setImageResource(image[imageIndex[1]]);
        ib02.setImageResource(image[imageIndex[2]]);  
        ib10.setImageResource(image[imageIndex[3]]);
        ib11.setImageResource(image[imageIndex[4]]); 
        ib12.setImageResource(image[imageIndex[5]]); 
        ib20.setImageResource(image[imageIndex[6]]); 
        ib21.setImageResource(image[imageIndex[7]]); 
        ib22.setImageResource(image[imageIndex[8]]); 
    } 
//交换
    private void swap(int rand1, int rand2) { 
        int temp=imageIndex[rand1]; 
        imageIndex[rand1]=imageIndex[rand2]; 
        índice de imagen[rand2]=temp; 
    } 

    private void initView() { 
        ib00=findViewById(R.id.pt_id_00x00); 
        ib01=findViewById(R.id.pt_id_00x01);
        ib02=findViewById(R.id.pt_id_00x02); 
        ib10=findViewById(R.id.pt_id_01x00);
        ib11=findViewById(R.id.pt_id_01x01); 
        ib12=findViewById(R.id.pt_id_01x02); 
        ib20=findViewById(R.id.pt_id_02x00); 
        ib21=findViewById(R.id.pt_id_02x01); 
        ib22=findViewById(R.id.pt_id_02x02); 
        timeTv=findViewById(R.id.pt_tv_time); 
        reiniciarBtn=findViewById(R.id.pt_btn_restart); 

    } 

    public void onClick(Ver vista) { 
        int id=view.getId(); 
        cambiar (id){ 
            case R.id.pt_id_00x00: 
                mover(R.id.pt_id_00x00,0); 
                descanso; 
                descanso; 
            caso R.id.pt_id_00x02:
            caso R.id.pt_id_00x01:
                mover(R.id.pt_id_00x01,1); 
                descanso;
                mover(R.id.pt_id_00x02,2); 
                descanso; 
            case R.id.pt_id_01x00: 
                mover(R.id.pt_id_01x00,3); 
                descanso; 
            case R.id.pt_id_01x01: 
                mover(R.id.pt_id_01x01,4); 
                descanso; 
            case R.id.pt_id_01x02: 
                move(R.id.pt_id_01x02,5); 
                descanso; 
            case R.id.pt_id_02x00: 
                mover(R.id.pt_id_02x00,6); 
                descanso; 
            case R.id.pt_id_02x01: 
                move(R.id.pt_id_02x01,7); 
            case R.id.pt_id_02x02: 
                move(R.id.pt_id_02x02,8); 
                break; 
        } 
    } 
//Representa la función de mover el botón en la ubicación especificada, intercambiando la imagen con el área en blanco 
    private void move(int imagebuttonId, int site) { 
//Juzga la imagen seleccionada en qué línea, la primera columna, el método de juicio es a través del método de encontrar el resto 
        int sitex=site/imageX; 
        int sitey=site%imageY; 
        //Obtenga las coordenadas del área en blanco 
        int blankx=blankSwap/imageX; 
        int blanky =blankSwap%imageY; 
        //La imagen puede Dos condiciones para moverse 
        // 1. En la misma fila, el valor absoluto de la resta del número de columnas es 1; 2. En la misma columna, el valor absoluto de la resta del número de filas es 1 
        int x=Math.abs(sitex-blankx); 
        int y =Math.abs(sitey-blanky); 
        if((x == 0&&y==1)||(y==0&&x= =1)){ 
            // Encuentra este botón móvil por id
            ImageButton clickButton=findViewById(imagebuttonId);  
            clickButton.setVisibility(View.INVISIBLE);
            //Ver el botón en el área en blanco 
            ImageButton blackButton=findViewById(blankImgid); 
            //Establecer el área en blanco en la imagen 
            blackButton.setImageResource(image[imageIndex[site]]); 
            //Invisible entre movimientos, después de mover, configure el control para que sea visible 
            blackButton.setVisibility(View.VISIBLE); 
            //Registre el proceso de cambiar la marca de la esquina en la matriz que almacena la posición de la imagen 
            swap(site,blankSwap); 
            //La actualización de la nueva posición del área en blanco es igual a la pasada La ubicación del botón de clic 
            blankSwap=site; 
            blankImgid=imagebuttonId; 
        } 
//Juzga si el juego de rompecabezas se completa después de que se completa el movimiento 
        JudgeGameOver(); 
    } 
//Juzga si el rompecabezas es un éxito 
    privado void JudgeGameOver() { 
     boolean loop=true; //definiendo el indicador 
        para(int i=0;i <imageIndex. length; i++) {
            if (imageIndex[i] != i) { 
                loop = false; 
                break; 
            } 
        } 
            if(loop){ 
                //El rompecabezas es exitoso, deja de cronometrar 
                handler.removeMessages(1); 
                //Después de que el rompecabezas es exitoso, el jugador está prohibido continuar moviendo el botón 
                ib00 .setClickable(false), 
                ib01.setClickable(false), 
                ib02.setClickable(false), 
                ib10.setClickable(false), 
                ib11.setClickable(false), 
                ib12.setClickable(false); 
                ib20.setClickable(falso)  
                ib21.setClickable(falso);
                ;setClickable(falso);
                ib22.setImageResource(image[8]); 
                ib22.setVisibility(View.VISIBLE); 
                //Aparece el cuadro de diálogo de éxito del usuario AlertDialog.Builder 
                builder=new AlertDialog.Builder(this); 
                builder.setMessage("Felicitaciones, el rompecabezas ¡ha tenido éxito! El tiempo es "+tiempo+" segundos").setPositiveButton("Confirmar",null); 
                builder.create().show(); 
            } 
       // } 

    } 
//Reinicio del rompecabezas 
    public void restart(Ver vista ) { 
        / / el rompecabezas se reinicia, lo que permite al jugador mover las piezas 
        ib00.setClickable(true); 
        ib01.setClickable(true); 
        ib02.setClickable 
        ib11.setClickable(true); 
        ib10.setClickable(true);
        ib11.setClickable(true);
        ib20.setClickable(true); 
        ib21.setClickable(true); 
        ib22.setClickable(true); 
        //Interrupción del rompecabezas 
disruptRandpm(); 

        handler.removeMessages(1); 
        //El tiempo vuelve a 0 y re⏲ 
        time=0 ; 
        timeTv.setText("Tiempo: "+tiempo+" segundos"); 
        handler.sendEmptyMessageDelayed(1,1000); 

    } 
} 
Efecto de captura de pantalla:

 

Supongo que te gusta

Origin blog.csdn.net/Abtxr/article/details/126228834
Recomendado
Clasificación