记忆游戏代码疑问:仅点击单张卡片时为何检查secondCard非空且值相等?
关于记忆游戏代码逻辑的疑问解答
嘿,这个问题问得特别准——你一下子就抓住了这段代码里的逻辑漏洞!先把你的代码贴出来方便分析:
if (clicked == 1 ) { firstCard=cardAction; if (secondCard!=null && firstCard.getValue() == secondCard.getValue()){ firstCard.setText(""); secondCard.setText(""); } firstCard.setText (Integer.toString (firstCard.getValue ())); }
你的疑问完全正确!
当你第一次点击卡片时,secondCard确实应该是null,所以这个if判断里的条件secondCard!=null && ...根本不会触发——也就是说,这段代码里的匹配检查在第一次点击时完全是多余的,而且逻辑顺序还错得离谱。
这段代码的核心问题
正常的记忆游戏逻辑应该是分两步走的:
- 第一次点击:记录卡片、显示数值,不做匹配检查
- 第二次点击:记录第二张卡片、显示数值,再检查是否匹配,然后处理匹配/不匹配的结果
但这段代码把「匹配检查」放在了第一次点击的分支里,不仅时机不对,还犯了一个更致命的错误:就算某次点击时secondCard不为空(比如第二次点击,但代码只处理了clicked==1的情况),它先执行了「清空卡片文本」的操作,紧接着又立刻把firstCard的数值重新显示出来——等于刚清空又恢复,完全达不到匹配成功后隐藏卡片的效果。
修正后的逻辑示例
我们可以调整代码逻辑,让它符合记忆游戏的正常流程:
// 假设clicked初始为0,用来标记是第几次点击 if (clicked == 0) { // 第一次点击:记录并显示第一张卡片 firstCard = cardAction; firstCard.setText(Integer.toString(firstCard.getValue())); clicked = 1; // 切换到等待第二张卡片的状态 } else if (clicked == 1) { // 第二次点击:记录并显示第二张卡片 secondCard = cardAction; secondCard.setText(Integer.toString(secondCard.getValue())); // 检查两张卡片是否匹配 if (firstCard.getValue() == secondCard.getValue()) { // 匹配成功:清空两张卡片的文本 firstCard.setText(""); secondCard.setText(""); } else { // 匹配失败:延迟几秒后隐藏两张卡片的数值(模拟翻回去的效果) new Timer().schedule(new TimerTask() { @Override public void run() { firstCard.setText(""); secondCard.setText(""); } }, 3000); // 3秒后执行 } // 重置状态,准备下一轮匹配 clicked = 0; firstCard = null; secondCard = null; }
简单来说,原代码的逻辑顺序和触发时机都搞错了,你一开始的疑问完全合理——那个匹配检查在第一次点击时确实毫无意义,而且整个代码的流程不符合记忆游戏的正常交互逻辑。
内容的提问来源于stack exchange,提问作者javax
相关产品推荐
相关产品推荐

