
在构建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号