ivOne = (ImageView)findViewById(R.id.ivOne);
ivOne.setId(a[0]);
//final ImageView ivOne = (ImageView)findViewById(R.id.ivOne);
//ivOne.setEnabled(false);
ivOne.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
ivOne.setBackgroundResource(images[a[0]]);
Log.e("r[0]:", Integer.toString(a[0]));
if (firstTap)
{
firstId = v.getId();
firstTap = false;
}
else
{
//ivOne.setEnabled(false);
int secondId = v.getId();
Log.e("secondId", Integer.toString(secondId));
if ((secondId == firstId) && (score != 0))
{
//ivOne.setEnabled(false);
if (ivOneScored == false)
{
score--;
ivOneScored = true;
}
}
firstTap = true;
}
tvScore.setText("Remaining:" + Integer.toString(score));
}
});
答案 0 :(得分:2)
我在市场上有一个非常相似的记忆匹配游戏。我做的是创建一个代表卡片的类(带有图像和id属性),并为卡片和图像分配一个id(0-9),因为我将它们加载到只有10个图像对象的临时arraylist中。
public class GameTile {
public int id;
public Drawable image;
}
然后我遍历列表两次,并将卡添加到我用于我的适配器的主要arraylist ...之后我使用Collections.shuffle来洗牌......现在......继续选择。如你所知,在记忆游戏中,你只需要随时翻转2张牌。我正在使用gridview来保存我的卡片...所以我所做的是使用gridview中的OnItemClickListener而不是imageview。其次,当点击一张卡片时,我将位置添加到另一个名为“selected”的arraylist,它从不包含超过2个项目...我们试图匹配的项目的位置...在OnItemClickListener中,当事件是解雇,我检查项目是否已经存在于“已选中”并返回,如果确实...实际上忽略了点击。
if (selected.contains(position)) {
return;
}
当“selected”包含2个项目时,我会忽略所有点击,直到处理程序完成检查匹配。
if (selected.size() > 1) {
return;
}
因此,当用户选择了2个项目时,我设置了一个处理程序来调用检查匹配项的runnable。如果匹配(通过比较我第一次加载图像时设置的id字段),我将两个位置添加到另一个仅包含匹配项的arraylist,并且该处理程序也清除“selected”,如果有匹配,我将图像更改为空白。当所有20张牌都匹配时,我会赢得一个胜利,它会完成所有胜利并重置游戏牌。
答案 1 :(得分:1)
您必须确保这些卡片具有相同的符号,但卡片不同。
所以你的行
if ((secondId == firstId) && (score != 0))
必须看起来像
中的某些内容if ((firstCard != secondCard) && (secondId == firstId) && (score != 0))
其中firstCard
和secondCard
识别桌面上的卡片(不是卡片上的符号)
答案 2 :(得分:0)
如果我理解你的话,你只需说view.setOnClickListener(null)
这两个是否匹配?如果要同时禁用它们,只需存储一个映射以将ID链接到视图,然后清除“视图”的单击侦听器以及属于第二个ID的视图。