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; } }请帮我优化这段代码
时间: 2024-04-21 08:29:55 浏览: 10
以下是对代码的一些优化建议:
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);
}
}