Android 如何检查拼图游戏是否完成?
我正在准备一个像jigsaw这样的小游戏,为此我使用了9个imageview,在布局中有9个不同的图像。在开始时将图像设置为imageview这些都是实际图像,在洗牌后用户将滑动图像以完成拼图,我想检查修改后的图像与实际图像是否相等,如果相等则弹出一条消息,如gameover 我试过这样做 1.在图像之间使用AND运算符(可拖动),但不吉利 2.对图像使用setLevel(),比较这些setLevel值与滑动后图像的getLevel值,但仍然不吉利。。这里的问题是,如果我单击imageview一次,getLevel()给出正确的值,如果我多次单击,它给出的值为零。为什么会这样 如果你在我的代码中发现任何错误,请帮助我,否则请用好的技术指导我Android 如何检查拼图游戏是否完成?,android,image,imageview,puzzle,Android,Image,Imageview,Puzzle,我正在准备一个像jigsaw这样的小游戏,为此我使用了9个imageview,在布局中有9个不同的图像。在开始时将图像设置为imageview这些都是实际图像,在洗牌后用户将滑动图像以完成拼图,我想检查修改后的图像与实际图像是否相等,如果相等则弹出一条消息,如gameover 我试过这样做 1.在图像之间使用AND运算符(可拖动),但不吉利 2.对图像使用setLevel(),比较这些setLevel值与滑动后图像的getLevel值,但仍然不吉利。。这里的问题是,如果我单击imageview一
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)//拼图完成。
好的,下面是解决方案的步骤
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.