在构建java多米诺记忆游戏时,开发者常会遇到两个关键挑战:
这两个问题共同导致了游戏无法按照预期进行:牌面无法保持揭示,并且由于gameOver()方法依赖于所有牌都被揭示的计数,游戏也永远无法判断为结束。
要解决对象比较不准确的问题,我们需要在Domino类中重写equals()方法。Java的Object类默认的equals()方法行为与==运算符相同,即比较内存地址。为了实现基于内容的比较,我们必须提供自定义的逻辑。
当重写equals()方法时,强烈建议同时重写hashCode()方法。这是Java契约的一部分:如果两个对象根据equals()方法是相等的,那么它们的hashCode()方法必须产生相同的整数结果。违反这一契约会导致在使用基于哈希的集合(如HashMap、HashSet)时出现不可预测的行为。
以下是Domino类中equals()和hashCode()的正确实现:
立即学习“Java免费学习笔记(深入)”;
public class Domino { private int top, bottom; private boolean revealed; public Domino(int x, int y) { // 确保top <= bottom,使(x,y)和(y,x)被视为同一个多米诺牌 if (x > y) { top = y; bottom = x; } else { top = x; bottom = y; } } public int getTop() { return top; } public int getBottom() { return bottom; } public boolean isRevealed() { return revealed; // 简化逻辑,直接返回revealed } public void setRevealed(boolean revealed) { this.revealed = revealed; } @Override public int hashCode() { int hash = 7; // 使用top和bottom的值计算哈希码 hash = 59 * hash + this.getTop(); hash = 59 * hash + this.getBottom(); return hash; } @Override public boolean equals(Object obj) { // 1. 检查是否是同一个对象引用 if (this == obj) { return true; } // 2. 检查传入对象是否为null或类型不匹配 if (!(obj instanceof Domino)) { return false; } // 3. 类型转换 final Domino other = (Domino) obj; // 4. 比较关键属性 if (this.getTop() != other.getTop()) { return false; } if (this.getBottom() != other.getBottom()) { return false; } return true; // 所有属性都匹配,则认为相等 } }
注意事项:
解决了对象比较问题后,下一步是在MemoryLane类的guess方法中,当玩家猜对时,更新相应多米诺牌的revealed状态。
修改MemoryLane类的guess方法如下:
import java.util.Arrays; import java.util.Random; public class MemoryLane { private Domino[] board; // ... (构造函数和shuffle方法保持不变) ... public boolean guess(int i, int k) { // 使用重写后的equals方法进行对象内容比较 if (board[i].equals(board[k])) { // 如果匹配,设置这两个多米诺牌为已揭示 board[i].setRevealed(true); board[k].setRevealed(true); return true; } return false; } // ... (peek, gameOver, toString 方法保持不变) ... }
通过在guess方法中调用board[i].setRevealed(true)和board[k].setRevealed(true),我们确保了当两个多米诺牌匹配时,它们的revealed状态被正确更新。
MemoryLane类中的gameOver()方法负责判断游戏是否结束,它通过遍历board数组,统计所有已揭示的多米诺牌数量,并与棋盘总长度进行比较。
public boolean gameOver() { int count = 0; for(int i = 0; i < board.length; i++) { if(board[i].isRevealed()) { // 检查每个多米诺牌的揭示状态 count ++; } } return (count == board.length); // 如果所有牌都已揭示,则游戏结束 }
由于我们已经在guess方法中正确地更新了匹配多米诺牌的revealed状态,isRevealed()方法现在将返回正确的值。这意味着gameOver()方法将能够准确地追踪游戏进度,并在所有多米诺牌都被揭示时,正确地将游戏标记为结束。
本次问题修复强调了Java面向对象编程中的几个核心概念:
通过正确实现这些原则,我们不仅修复了多米诺记忆游戏的显示和结束问题,也提升了代码的健壮性和可维护性。在未来的Java开发中,牢记这些最佳实践将有助于避免类似的常见错误。
以上就是Java多米诺记忆游戏:修复对象比较与揭示状态问题的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号