创建可用坐标的数组列表

Create arraylist of availableCoordinates

我目前正在制作贪吃蛇游戏,我不想让苹果在我的贪吃蛇中生成。我试图通过这样做来解决这个问题:


    ArrayList<Coordinate> availableCoordinates = new ArrayList<>();

    public void Coordinates() {


        for (int i = 0; i < numberOfSquaresY; i++) {
            for (int j = 0; j < numberOfSquaresX; j++) {
                availableCoordinates.add(new Coordinate(j*squareSize, i*squareSize, snake.get(0).color));
            }
        }

        for(int i = 0; i < availableCoordinates.size()-1; i++) {
            for (int j = 0; j < snake.size() - 1; j++) {
                if (availableCoordinates.get(i).xPos == snake.get(j).xPos && availableCoordinates.get(i).yPos == snake.get(j).yPos){
                    availableCoordinates.remove(i);
                }
            }
        }

    }

然而,只有 1 个值被删除,尽管应该删除 3 个值,但我不知道为什么。

使用 removeIf() 从列表中删除。

import java.util.ArrayList;
import java.util.List;

public class RemoveItemsFromListIfPresentInAnotherList {
    public static void main(String[] args) {
        List<Coordinate> availableCoords = new ArrayList<>();
        List<Coordinate> snakeCoords = new ArrayList<>();
        
        //..

        for (Coordinate snakeCoordinate : snakeCoords) {
            availableCoords.removeIf(availableCoord ->
                    (snakeCoordinate.getX() == availableCoord.getX() && snakeCoordinate.getY() == availableCoord.getY()));
        }
    }
}

class Coordinate {
    private int x;
    private int y;

    public Coordinate(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }
}

您遍历 availableCoordinates 并在此循环中从中删除项目。 因此,在您删除一个元素后,以下元素将获得一个新索引。 循环索引无论如何都会增加,所以你在删除后跳过一个元素。

我不会将所有坐标都添加到列表中,然后删除使用过的坐标。 在填写您的 availableCoordinates 时检查此字段是否空闲:

for (int i = 0; i < numberOfSquaresY; i++) {
    for (int j = 0; j < numberOfSquaresX; j++) {
        Coordinate c = new Coordinate(j*squareSize, i*squareSize, snake.get(0).color);
        if (!snake.contains(c)) {
            availableCoordinates.add(c);
        }
    }
}

假设 Coordinate#equals 只检查 xPosyPos

编辑: 如果您不能使用 contains,则必须创建第 3 个 for 级别来遍历蛇的元素:

boolean doIt;
for (int i = 0; i < numberOfSquaresY; i++) {
    for (int j = 0; j < numberOfSquaresX; j++) {
        Coordinate c = new Coordinate(j*squareSize, i*squareSize, snake.get(0).color);
        // reset flag for each coordinate
        doIt = true;
        for (Coordinate bodyElement : snake) {
            if (c.xPos == bodyElement.xPos && c.yPos == bodyElement.yPos) {
                // coordinate is used by snake
                doIt = false;
                // no need to check other body elements
                break;
            }
        }
        if (doIt) {
            availableCoordinates.add(c);
        }
    }
}