public class Snake {
private int snakeLength;
private Position[] snakeBody;
public Snake(int row, int col) {
snakeLength = 1;
snakeBody = new Position[5];
Position initial = new Position(row, col);
snakeBody[0] = initial;
}
public boolean snakePosition(Position pos) {
boolean test = false;
for(int i = 0; i <= snakeBody.length-1;i++) {
if (snakeBody[0] != null) {
boolean isEqual = pos.equals(snakeBody[0]);
if (isEqual == true) {
test = true;
}
}
}
return test;
}
主要方法:
public class TestAsmt1 {
public static void main(String[] args) {
testPassed = true;
theSnake = new Snake(1,1);
if (!theSnake.snakePosition(new Position(1,1))) testPassed = false;
职位:
public class Position {
private int positionRow;
private int positionColumn;
public Position(int row, int column) {
positionColumn = column;
positionRow = row;
}
public boolean equals (Position otherPosition) {
if(otherPosition.getRow() == this.getRow() && otherPosition.getCol() == this.getCol() ) {
return true;
} else {
return false;
}
}
}
我不明白为什么当我比较对象时它返回 false。 testpassed 对我来说应该是真的。我究竟做错了什么?我已经尝试解决这个问题至少两个小时了。特别查看 if(pos.equals(snakeBody[i])) 行。我昨天看到其他人也遇到了这个问题(这项作业将于今晚午夜到期),但他们无法解决它。知道问题是什么吗?
最佳答案
您正在正在做的是创建一个名为 equals 的函数,该函数将 Position 对象作为参数。您应该做的是重写以对象作为参数的现有 equals 函数,并实现 hashCode 函数,完成 equals/hashCode 契约(Contract)。
为此,Position 类需要包含最终字段。您还需要覆盖我所说的功能。这可以通过以下方式完成;
public class Position {
private final int positionRow;
private final int positionColumn;
public Position(int row, int column) {
positionColumn = column;
positionRow = row;
}
@Override
public boolean equals (Object other) {
if (other == this) {
return true;
}
if (other instanceof Position) {
Position otherPosition = (Position) other;
return this.positionRow == otherPosition.positionRow && this.positionColumn == otherPosition.positionColumn;
}
return true;
}
@Override
public int hashCode() {
return Objects.hash(positionRow, positionColumn);
}
}
还值得注意的是,函数 Snake#snakePosition 也被破坏了。您循环遍历蛇体数组的所有索引,但仅检查 Position 参数是否等于蛇体数组中索引 0 处的第一个对象。这就是改进的方法。
public boolean intersects(Position pos) {
return Arrays.stream(snakeBody).filter(Objects::nonNull).anyMatch(body -> body.equals(pos));
}
public static void main(String[] args) {
Snake theSnake = new Snake(1,1);
boolean testPassed = theSnake.intersects(new Position(1,1));
System.out.println("Test passed: " + testPassed);
}
关于java - 为什么在我的贪吃蛇游戏中对象比较返回 false,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60161192/