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

Android 如何检查拼图游戏是否完成?,android,image,imageview,puzzle,Android,Image,Imageview,Puzzle,我正在准备一个像jigsaw这样的小游戏,为此我使用了9个imageview,在布局中有9个不同的图像。在开始时将图像设置为imageview这些都是实际图像,在洗牌后用户将滑动图像以完成拼图,我想检查修改后的图像与实际图像是否相等,如果相等则弹出一条消息,如gameover 我试过这样做 1.在图像之间使用AND运算符(可拖动),但不吉利 2.对图像使用setLevel(),比较这些setLevel值与滑动后图像的getLevel值,但仍然不吉利。。这里的问题是,如果我单击imageview一

我正在准备一个像jigsaw这样的小游戏,为此我使用了9个imageview,在布局中有9个不同的图像。在开始时将图像设置为imageview这些都是实际图像,在洗牌后用户将滑动图像以完成拼图,我想检查修改后的图像与实际图像是否相等,如果相等则弹出一条消息,如gameover

我试过这样做

1.在图像之间使用AND运算符(可拖动),但不吉利

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

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

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

使用==运算符时,它们将检查两个对象是否引用同一个对象。但在你的例子中,它们是两个不同的对象

您应该为实际图像和其他图像设置标记。并检查两者是否相同。在你的情况下应该能用


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

为什么不使用gridView?每次更改后,只需检查项目,查看图像是否符合所需顺序

我有一个简单的解决方案。在混乱之前(准备拼图之前),使用View.setTag(索引)将序列号
Integer
标记设置为ImageView。然后每次用户移动时,循环检查所有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.
每次移动后检查是否完成:

for (int i = 0; i < 9; i++) {
    if (imgView[i].getTag() != i) break;
}
if (i == 9)// puzzle completed.
for(int i=0;i<9;i++){
if(imgView[i].getTag()!=i)中断;
}
如果(i==9)//拼图完成。

好的,下面是解决方案的步骤

  • 维护一套新的绘图工具,将它们标记为最初使用的原始绘图工具。 可能是
  • drawable og11=imageView11.getDrawable(); 洗牌前先做这部分。现在您有了原始的可提取项,以可提取项的形式存储

  • 每次单击后,检查og11==imageView11.getDrawable(),。。。以此类推,对于拼图中的所有图像,如果它们匹配,则匹配,否则不匹配

  • HTH.

    还有一些代码,你是如何尝试的……你的拼图是使用拼图形状还是正方形?如果是拼图,介意分享一下你们是怎么做到的吗?我也试过gridview,我在检查滑动时遇到了问题。和从imageview获取图像。使用适配器,在适配器中添加图像并设置“image_11”等标记。检查标签以查看图像是否符合所需的顺序都是可绘制的,如何将标签设置为图像,我知道如何将标签设置为图像视图..嗯,似乎没有内置的方法。您可以自己扩展drawable和添加标记功能。或者,您可以将drawable设置为imageview。在我将一个视图更改为另一个视图级别后进行搜索时,实际上有人问过这个问题,为什么?setLevel实际上与级别列表drawable一起使用。我只是想我们可以使用int值来达到我们的目的。对于u来说,最好的方法是扩展drawable类,或者只是将drawable设置为ImageView。我遵循了您的第三个建议(setLevel)。在checking函数中,它没有进入if条件。创建一个数组,每个位置包含两个项目,一个drawable及其索引。为所有项目设置索引,然后洗牌数组。然后从这个无序数组中创建视图。别忘了设置索引和可绘图项。事实上,标签会随着可绘图项一起移动。这就是应该发生的事情。索引应该链接到drawables,所以当我们交换drawables时,我们也交换它们的标记。在这种情况下,视图将不会移动。只要你试过,它就会起作用。我还添加了洗牌的代码。检查更改。谢谢帮助,我得到了yashwanth的答案,与drawables比较。无论如何,谢谢你的回答。
    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.