public void onClick(View v) { if (!isClickable) { return; } int id = (int) v.getTag(); if (cardStatus[id] == 1) { return; } if (firstCard == -1) { firstCard = id; ImageView card = findViewById(cardIds[id]); card.setImageResource(cards[id]); } else { secondCard = id; ImageView card = findViewById(cardIds[id]); card.setImageResource(cards[id]); if (cards[firstCard] == cards[secondCard]) { cardStatus[firstCard] = 1; cardStatus[secondCard] = 1; firstCard = -1; secondCard = -1; if (checkWin()) { Toast.makeText(this, "You Win!", Toast.LENGTH_SHORT).show(); } } else { isClickable = false; Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { ImageView card1 = findViewById(cardIds[firstCard]); ImageView card2 = findViewById(cardIds[secondCard]); card1.setImageResource(R.drawable.card_back); card2.setImageResource(R.drawable.card_back); firstCard = -1; secondCard = -1; isClickable = true; } }, 1000); } } }向我解释一下这段代码
时间: 2024-02-11 11:26:51 浏览: 21
这段代码是在实现一个简单的内存卡片游戏的过程中用于处理卡片翻转和匹配的逻辑。其中,`onClick()`方法是当用户点击卡片时执行的方法。
首先,通过`isClickable`变量的值来判断当前卡片是否可点击,如果不可点击则直接返回,不执行任何操作。
接着,获取当前点击的卡片的ID,并检查该卡片是否已经翻开,如果已经翻开则直接返回。
如果当前是第一张卡片被翻开,则将该卡片的ID赋值给`firstCard`变量,并设置该卡片的图片为对应的图片资源。如果当前是第二张卡片被翻开,则将该卡片的ID赋值给`secondCard`变量,并设置该卡片的图片为对应的图片资源。
如果两张卡片的图片资源相同,则表示匹配成功,将两张卡片的状态设置为已匹配状态,同时将`firstCard`和`secondCard`变量重置为-1,表示现在没有任何卡片被翻开。随后,调用`checkWin()`方法来检查游戏是否胜利,如果胜利则弹出一个提示。
如果两张卡片的图片资源不相同,则表示匹配失败,将`isClickable`变量设置为false,表示当前卡片不可点击,同时使用一个`Handler`对象来延迟一秒钟执行一个匿名内部类,用于将两张卡片翻回去,并将`firstCard`和`secondCard`变量重置为-1,同时将`isClickable`变量设置为true,表示卡片可以重新被点击。
总体来说,这段代码实现了一个简单的内存卡片游戏的逻辑,通过对卡片状态的管理来实现卡片的翻转和匹配。
相关问题
public class MainActivity extends AppCompatActivity implements View.OnClickListener { private int[] cards = {R.drawable.card1, R.drawable.card2, R.drawable.card3, R.drawable.card1, R.drawable.card5, R.drawable.card6, R.drawable.card7, R.drawable.card8}; private int[] cardIds = {R.id.card1, R.id.card2, R.id.card3, R.id.card4, R.id.card5, R.id.card6, R.id.card7, R.id.card8}; private int[] cardStatus = new int[8]; private int firstCard = -1, secondCard = -1; private boolean isClickable = true; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); for (int i = 0; i < cardIds.length; i++) { ImageView card = findViewById(cardIds[i]); card.setTag(i); card.setOnClickListener(this); } Collections.shuffle(Arrays.asList(cards)); } @Override public void onClick(View v) { if (!isClickable) { return; } int id = (int) v.getTag(); if (cardStatus[id] == 1) { return; } if (firstCard == -1) { firstCard = id; ImageView card = findViewById(cardIds[id]); card.setImageResource(cards[id]); } else { secondCard = id; ImageView card = findViewById(cardIds[id]); card.setImageResource(cards[id]); if (cards[firstCard] == cards[secondCard]) { cardStatus[firstCard] = 1; cardStatus[secondCard] = 1; firstCard = -1; secondCard = -1; if (checkWin()) { Toast.makeText(this, "You Win!", Toast.LENGTH_SHORT).show(); } } else { isClickable = false; Handler handler = new Handler(); handler.postDelayed(new Runnable() { @Override public void run() { ImageView card1 = findViewById(cardIds[firstCard]); ImageView card2 = findViewById(cardIds[secondCard]); card1.setImageResource(R.drawable.card_back); card2.setImageResource(R.drawable.card_back); firstCard = -1; secondCard = -1; isClickable = true; } }, 1000); } } } private boolean checkWin() { for (int i = 0; i < cardStatus.length; i++) { if (cardStatus[i] == 0) { return false; } } return true; } }请帮我优化这段代码
以下是对代码的一些优化建议:
1. 将静态资源的ID和图片数组合并成一个Map,这样可以更方便地管理资源。
2. 将卡片点击事件的处理逻辑拆成两个方法,以提高代码可读性。
3. 将卡片的翻转和状态更新操作提炼成一个方法,以避免重复代码。
4. 将卡片匹配成功和失败的操作提炼成两个方法,以避免重复代码。
5. 使用Java 8的Stream API替换循环,以提高代码简洁性。
优化后的代码如下所示:
public class MainActivity extends AppCompatActivity implements View.OnClickListener {
private final Map<Integer, Integer> cardMap = new HashMap<>();
private final int[] cardIds = {R.id.card1, R.id.card2, R.id.card3, R.id.card4, R.id.card5, R.id.card6, R.id.card7, R.id.card8};
private final int[] cardStatus = new int[8];
private int firstCard = -1, secondCard = -1;
private boolean isClickable = true;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Arrays.stream(cardIds).forEach(id -> {
ImageView card = findViewById(id);
card.setTag(id);
card.setOnClickListener(this);
});
cardMap.put(R.id.card1, R.drawable.card1);
cardMap.put(R.id.card2, R.drawable.card2);
cardMap.put(R.id.card3, R.drawable.card3);
cardMap.put(R.id.card4, R.drawable.card1);
cardMap.put(R.id.card5, R.drawable.card5);
cardMap.put(R.id.card6, R.drawable.card6);
cardMap.put(R.id.card7, R.drawable.card7);
cardMap.put(R.id.card8, R.drawable.card8);
Collections.shuffle(Arrays.asList(cardIds));
}
@Override
public void onClick(View v) {
if (!isClickable) {
return;
}
int id = (int) v.getTag();
if (cardStatus[id] == 1) {
return;
}
if (firstCard == -1) {
firstCard = id;
flipCard(v, cardMap.get(id));
} else {
secondCard = id;
flipCard(v, cardMap.get(id));
if (cardMap.get(firstCard).equals(cardMap.get(secondCard))) {
handleMatched();
} else {
handleMismatched();
}
}
}
private void flipCard(View v, int imageId) {
ImageView card = (ImageView) v;
card.setImageResource(imageId);
cardStatus[(int) v.getTag()] = 1;
}
private void handleMatched() {
cardStatus[firstCard] = 1;
cardStatus[secondCard] = 1;
firstCard = -1;
secondCard = -1;
if (checkWin()) {
Toast.makeText(this, "You Win!", Toast.LENGTH_SHORT).show();
}
}
private void handleMismatched() {
isClickable = false;
new Handler().postDelayed(() -> {
ImageView card1 = findViewById(firstCard);
ImageView card2 = findViewById(secondCard);
card1.setImageResource(R.drawable.card_back);
card2.setImageResource(R.drawable.card_back);
cardStatus[firstCard] = 0;
cardStatus[secondCard] = 0;
firstCard = -1;
secondCard = -1;
isClickable = true;
}, 1000);
}
private boolean checkWin() {
return Arrays.stream(cardStatus).allMatch(status -> status == 1);
}
}
boolean action1 = nodeInfo.performAction(AccessibilityNodeInfo.ACTION_CLICK); if (action1) { // 回收 nodeInfo.recycle(); printLogMsg(" 打开抖音极速版成功。" ); return true; } while (!nodeInfo.isClickable()) { nodeInfo = nodeInfo.getParent(); } if (nodeInfo.isClickable()) { boolean action = nodeInfo.performAction(AccessibilityNodeInfo.ACTION_CLICK); // 回收 nodeInfo.recycle(); return action; }
这段代码首先尝试执行AccessibilityNodeInfo节点的点击动作,并将结果赋值给action1。如果点击动作成功执行,会进行一些其他操作,然后返回true。
如果点击动作失败,代码会进入一个while循环,通过遍历节点的父节点来寻找一个可点击的节点。一旦找到可点击的节点,会再次尝试执行点击动作,并将结果赋值给action。最后,会回收节点并返回action的值。