创建可用坐标的数组列表
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
只检查 xPos
和 yPos
。
编辑:
如果您不能使用 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);
}
}
}
我目前正在制作贪吃蛇游戏,我不想让苹果在我的贪吃蛇中生成。我试图通过这样做来解决这个问题:
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
只检查 xPos
和 yPos
。
编辑:
如果您不能使用 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);
}
}
}