java - 为什么在我的贪吃蛇游戏中对象比较返回 false

标签 java

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/

相关文章:

java - jSTL 可以检查属性是否已添加到模型中吗?

java - 使用 RadioButton 上的 OnCheckedChangeListener 反向显示/隐藏布局

用于测试 AST 访问者的 Java 源代码

java - java IText 中不存在 com.itextpdf.text.pdf.PdfPKCS7 库

java - 如何使 Scene2d 窗口适合其内容? (Libgdx)

java - 您如何使用 Java 确定 Windows 的 32 位或 64 位体系结构?

java - CDI 注入(inject)未在 Jackson 序列化程序中解决

java - 使用 int 或整数

Java:多线程内的 XA 事务传播

java - 获取X509证书的指纹