如何检查拼图游戏是否完成?

时间:2011-09-20 06:11:33

标签: android image imageview puzzle

我正在准备一个像拼图一样的小游戏,因为我在布局中使用了9张imageview,其中有9张不同的图像。在启动那些是实际图像时将图像设置为imageview,在shuffle用户将滑动图像以完成拼图之后,我想用实际图像检查修改后的图像,如果它们是相同的,则天气是否相等弹出消息像游戏一样。

我试过这个

1.在图像之间使用AND运算符(Drawables),但运气不好。

2.对图像使用setLevel(),将这些setLevel值与滑动后的图像的getLevel值进行比较仍然不吉利..这里的问题是如果我点击imageview一次getLevel()给出正确的值,如果我点击更多而不是一次它给出零值。为什么会这样......

如果您在我的代码中发现任何错误,请帮助我,否则请指导我做好技术..

Xml code like this
<RelativeLayout
   //9 imageview's  
像这样的jave代码中的

如果用户点击imageview,它将交换图像的

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

4 个答案:

答案 0 :(得分:5)

好的,这是您为解决方案所做的工作。

  1. 维护一组新的drawable,将它们标记为您最初的原始drawable。 可能就像
  2. drawable og11 = imageView11.getDrawable(); 在洗牌之前做这个部分。现在你有原始的drawables,以drawables的形式存储。

    1. 每次点击后,检查og11 == imageView11.getDrawable(),...等等拼图中的所有图像,如果匹配,则匹配,否则,它们不匹配。
    2. HTH。

答案 1 :(得分:2)

我有一个简单的解决方案。在jumbling之前(准备拼图之前)使用View.setTag(index)将序列号Integer标签设置为ImageViews。然后每次用户进行移动时,遍历所有imageview并检查它们是否有序。如果乱序,那么拼图还没有完成。

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.

答案 2 :(得分:0)

使用==运算符时,它们会检查两个对象是否都引用同一个对象。但在你的情况下,它们是两个不同的对象。

您应该为实际图像和其他图像设置标记。并检查它们是否相同。这应该适用于你的if条件。

对于drawable类,我注意到了一个方法setLevel和getLevel。您可以将此用于您的要求。

答案 3 :(得分:0)

为什么不使用gridView?每次更改后,只需检查项目以查看图像是否按预期顺序