Как проверить, собрана головоломка или нет?

я готовлю одну небольшую игру, например, головоломку, для этого я использую 9 изображений с 9 различными изображениями в макете. установите изображения для просмотра изображений во время запуска, это фактические изображения, после перетасовки пользователь будет перемещать изображения, чтобы завершить головоломку, я хочу проверить измененное изображение с фактическим изображением, независимо от того, равны они или нет, если они равны всплывающее сообщение , вроде геймовера.

я пробовал вот так

1. с помощью оператора AND между изображениями (рисунками), но не повезло.

2.Используя setLevel() для изображений, сравните эти значения setLevel со значениями getLevel для изображений после скольжения. Не повезло. Здесь проблема в том, что если я нажимаю на изображение один раз, getLevel() дает правильное значение, если я нажимаю более одного раза. дает нулевое значение. Почему так происходит..

Пожалуйста, помогите мне, если вы найдете какую-либо ошибку в моем коде, в противном случае помогите мне с хорошей техникой.

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

в коде jave, подобном этому, если пользователь нажмет на изображение, он поменяет изображение

 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..

person RajaReddy PolamReddy    schedule 20.09.2011    source источник
comment
И немного кода, как вы пытаетесь...   -  person Lalit Poptani    schedule 20.09.2011
comment
В вашей головоломке используются формы головоломки или квадраты? Если лобзиком, поделитесь, как вы это сделали?   -  person portfoliobuilder    schedule 25.02.2015


Ответы (4)


Хорошо, вот что вы делаете для решения.

  1. поддерживайте новый набор рисунков, отмечая их как исходные чертежи, которые у вас были изначально. может быть похоже

Drawable og11 = imageView11.getDrawable(); сделайте эту часть перед перемешиванием. теперь у вас есть оригинальные чертежи, хранящиеся в виде чертежей.

  1. После каждого щелчка проверяйте, если og11 == imageView11.getDrawable(),... и т. д. для всех изображений в головоломке, если они совпадают, они совпадают, иначе они не совпадают.

ХТН.

person Yashwanth Kumar    schedule 23.09.2011

У меня есть простое решение. Установите теги серийного номера Integer в ImageViews с помощью View.setTag(index) перед смешиванием (перед подготовкой головоломки). Затем каждый раз, когда пользователь делает ход, перебирайте все изображения и проверяйте, в порядке ли они. Если не по порядку, то головоломка еще не завершена.

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.

При каждом движении:

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);

}

После каждого хода проверяйте завершение:

for (int i = 0; i < 9; i++) {
    if (imgView[i].getTag() != i) break;
}
if (i == 9)// puzzle completed.
person Ronnie    schedule 22.09.2011
comment
Создайте массив, содержащий 2 элемента для каждой позиции, объект рисования и его индекс. установите индекс для всех элементов, а затем перетасуйте массив. Затем создайте представления из этого перетасованного массива. не забудьте установить индексы вместе с чертежами. - person Ronnie; 23.09.2011
comment
На самом деле теги будут перемещаться вместе со своими чертежами. Вот что должно произойти. Индексы должны быть связаны с чертежами, поэтому, когда мы меняем местами чертежи, мы также меняем их теги. В этом случае представления не будут перемещаться. Это сработает, если вы попытаетесь. Я также добавил код для перетасовки. проверьте изменения. - person Ronnie; 23.09.2011
comment
Спасибо за помощь, я получил ответ для yashwanth, сравните с чертежами. в любом случае спасибо за ответ. - person RajaReddy PolamReddy; 23.09.2011

почему бы вам не использовать gridView? и после каждого изменения просто проверяйте элементы, чтобы увидеть, что изображения расположены в нужном порядке.

person Buda Gavril    schedule 20.09.2011
comment
я также попробовал gridview, я столкнулся с проблемой при проверке скольжения. и получение изображения из изображения. - person RajaReddy PolamReddy; 20.09.2011
comment
используйте адаптер, а в адаптере добавьте изображения и установите теги, такие как image_11. и проверьте теги, чтобы увидеть, что изображения расположены в нужном порядке - person Buda Gavril; 20.09.2011

Когда вы используете оператор ==, они проверяют, ссылаются ли оба объекта на один и тот же объект. Но в вашем случае это 2 разных объекта.

Вы должны установить тег как для фактического изображения, так и для другого изображения. И проверьте, одинаковы ли они. Это должно работать в вашем условии if.

Для класса drawable я заметил методы setLevel и getLevel. Возможно, вы сможете использовать это для своего требования.

person blessenm    schedule 20.09.2011
comment
оба являются чертежными, как установить тег для изображения, я знаю, как установить тег для просмотра изображения. - person RajaReddy PolamReddy; 20.09.2011
comment
Хм, похоже, встроенного метода нет. Вы можете расширить возможности рисования и добавить теги самостоятельно. Или вы можете установить для рисования изображение. На самом деле об этом уже спрашивали после того, как я выполнил поиск stackoverflow.com/questions/4420727/drawable-drawable. - person blessenm; 20.09.2011
comment
после смены одного вида на другой уровень вида обнуляется, почему? - person RajaReddy PolamReddy; 20.09.2011
comment
setLevel фактически используется с возможностью рисования списка уровней. Я просто подумал, что мы могли бы использовать значения int для нашей цели. Лучший способ для вас - расширить класс drawable или просто установить drawable в изображение. - person blessenm; 20.09.2011
comment
я последовал вашему третьему предложению (setLevel). в функции проверки он не входит в условие if.. - person RajaReddy PolamReddy; 21.09.2011
comment
хорошо, что вы решили. Кажется, награда принесла вам много ответов. - person blessenm; 23.09.2011
comment
да, на самом деле я сначала понял эту идею, но при проверке я сделал ошибку. - person RajaReddy PolamReddy; 23.09.2011