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: