¿Cómo comprobar si el rompecabezas está terminado o no?

Estoy preparando un pequeño juego como rompecabezas, para eso estoy usando 9 visualizaciones de imágenes con 9 imágenes diferentes en el diseño. configure las imágenes en vista de imagen en el momento de comenzar, esas son imágenes reales, después de que el usuario aleatorio deslice las imágenes para completar el rompecabezas, quiero verificar la imagen modificada con la imagen real, si es igual o no, si son iguales, aparecerá un mensaje emergente , como gameover.

lo intenté así

1. mediante el uso del operador AND entre las imágenes (dibujables) pero con mala suerte.

2.Utilizando setLevel () para las imágenes, compare esos valores de setLevel con los valores de getLevel para las imágenes después de deslizarse aún. Desafortunadamente ... aquí el problema es que si hago clic en la vista de imagen una vez, getLevel () da el valor correcto, si hago clic más de una vez da valor cero. Por qué sucede así ...

Por favor, ayúdeme si encuentra algún error en mi código, de lo contrario, guíeme con una buena técnica.

Xml code like this
<RelativeLayout
   //9 imageview's  

en código jave como este, si el usuario hace clic en la vista de imagen, intercambiará la imagen

 img_View11.setOnClickListener(new View.OnClickListener()  {            
    public void onClick(View v)  { 

        if(img_View21.getDrawable() == default_img || 
                                    img_View12.getDrawable() == default_img) {

            System.out.println("yes");
            ++click;
            Noof_moves.setText("Moves: " +click);
            ImageView iv = (ImageView)v;                 
            d11 = iv.getDrawable();   
            prev_img = prev_imgView.getDrawable();

            la11 = d11.getLevel();
            System.out.println("d11 value is " +la11);                  

            prev_imgView.setImageDrawable(d11);                 

            img_View11.setImageDrawable(prev_img);                
            prev_imgView = img_View11;

            check();
            }
        else { System.out.println("no");  }
        }
    });

void check(){

    System.out.println("in checking condition");
    if((lb11==la11) && (lb12==la12) && (lb13==la13) && (lb21==la21) && (lb22==la22)
        && (lb23==la23) && (lb31==la31) && (lb32==la32) && (lb33==la33)) {
            Context c = getBaseContext();
            System.out.println("gameover");
            Toast.makeText(c, " GameOver ", Toast.LENGTH_SHORT).show();
    }else{ System.out.println(" codition not checked "); }
} 
//here lb=level before sliding
//     la=level after sliding..

preguntado el 20 de septiembre de 11 a las 06:09

Y algunas cosas de código, cómo lo estás intentando ... -

¿Su rompecabezas usa formas de rompecabezas o en cuadrados? Si es un rompecabezas, ¿te importaría compartir cómo lo hiciste? -

4 Respuestas

Ok, esto es lo que haces para la solución.

  1. Mantenga un nuevo conjunto de dibujables marcándolos como dibujables originales que tenía inicialmente. puede ser como

dibujable og11 = imageView11.getDrawable (); haz esta parte antes de barajar. ahora tiene dibujables originales, almacenados en forma de dibujables.

  1. Después de cada clic, compruebe si og11 == imageView11.getDrawable (), ... y así sucesivamente para todas las imágenes en el rompecabezas, si coinciden, coinciden, de lo contrario, no.

HTH.

Respondido el 23 de Septiembre de 11 a las 10:09

Tengo una solución sencilla. Establecer el número de serie Integer etiquetas a ImageViews usando View.setTag (índice) antes de mezclar (antes de preparar el rompecabezas). Luego, cada vez que el usuario haga un movimiento, recorra todas las vistas de imágenes y verifique si están en orden. Si no funciona, el rompecabezas aún no está terminado.

class PuzzleItem {
   Drawable puzzlepartImage;
   int correctPosition;

   public PuzzleItem(Drawable d, int index) {
      puzzlepartImage = d;
      correctPosition = index;
   }
}

ArrayList<PuzzleItem> list = new ArrayList<PuzzleItem>();
for (int i = 0; i < 9; i++) {
    list.add(new PuzzleItem(drawables[i], i)); 
}
Collections.shuffle(list);

//Create the views from this list and add to the layout serially.
// set the last view as emptyview.

En cada movimiento:

void onClick(View v) {
    /* swap drawables */
    Drawable clickedDrawable = v.getDrawable();
    v.setDrawable(null);
    mEmptyView.setDrawable(clickedDrawable);
    mEmptyView = v;

    /* swap tag integers */
    Integer temp = (Integer)mEmptyView.getTag();
    mEmptyView.setTag(v.getTag());
    v.setTag(temp);

}

Después de cada movimiento, verifique que se complete:

for (int i = 0; i < 9; i++) {
    if (imgView[i].getTag() != i) break;
}
if (i == 9)// puzzle completed.

Respondido el 23 de Septiembre de 11 a las 10:09

Cree una matriz que contenga 2 elementos para cada posición, un elemento de dibujo y su índice. establezca el índice para todos los elementos y luego mezcle la matriz. Luego, cree vistas a partir de esta matriz mezclada. no olvide configurar los índices junto con los elementos de diseño. - Ronnie

En realidad, las etiquetas se moverán junto con sus elementos de diseño. Eso es lo que debería suceder. Los índices deben estar vinculados a los elementos de diseño, por lo que cuando intercambiamos elementos de diseño, también intercambiamos sus etiquetas. Las vistas no se moverán en este caso. Funcionará si lo ha intentado. También agregué el código para barajar. comprobar los cambios. - Ronnie

Gracias por la ayuda, obtuve la respuesta para yashwanth, compárelo con elementos de diseño. de todas formas gracias por la respuesta. - RajaReddy PolamReddy

¿Por qué no usas un gridView? y después de cada cambio, simplemente verifique los elementos para ver que las imágenes están en el orden deseado

Respondido el 20 de Septiembre de 11 a las 10:09

También probé gridview, tuve problemas al verificar el deslizamiento. y obteniendo la imagen de imageview. - RajaReddy PolamReddy

use un adaptador y en el adaptador agregue imágenes y establezca etiquetas como "image_11". y verifique las etiquetas para ver que las imágenes están en el orden deseado - Buda Gavril

Cuando usa el operador ==, están verificando si ambos objetos hacen referencia al mismo objeto. Pero en tu caso son 2 objetos diferentes.

Debe establecer una etiqueta tanto para la imagen real como para la otra imagen. Y compruebe si ambos son iguales. Eso debería funcionar en su condición if.

Para la clase dibujable, noté un método setLevel y getLevel. Es posible que pueda utilizar esto para sus necesidades.

Respondido el 20 de Septiembre de 11 a las 10:09

ambos son dibujables, cómo configurar la etiqueta en la imagen, sé cómo configurar la etiqueta en la vista de imagen .. - RajaReddy PolamReddy

Bueno, parece que no hay un método integrado. Puede ampliar la funcionalidad dibujable y agregar etiquetas usted mismo. O puede establecer el elemento de diseño en la vista de imagen. Esto se ha preguntado antes después de que hice una búsqueda. stackoverflow.com/questions/4420727/drawable-drawable - bendición

después de cambiar una vista a otra, el nivel de vista pasa a cero, ¿por qué? - RajaReddy PolamReddy

setLevel se usa en realidad con la lista de niveles dibujable. Solo pensé que podríamos usar los valores int para nuestro propósito. El mejor método para u es extender la clase de diseño o simplemente establecer el elemento de diseño en una vista de imagen - bendición

Seguí su tercera sugerencia (setLevel). en la función de verificación no entra en la condición if .. - RajaReddy PolamReddy

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.