0

我的坐标列表:

    int[][] coords = {
       {3093, 3630 }, {3095, 3632}, {3098, 3633},
       {3101, 3633 }, {3104, 3631}, {3106, 3629}, 
       {3107, 3627}, {3108, 3624}, {3109, 3620},
       {3108, 3617}, {3106, 3614}, {3102, 3613},
       {3099, 3613}, {3097, 3613}, {3093, 3614},
       {3090, 3617}, {3087, 3619}
    };

生成部分:

    int random = Misc.random(coords.length - 1);
    handler.move(coords[random][0], coords[random][1], 0);

基本上我想要做的是,如果这些坐标已经被采用,那么重新生成坐标。

  1. 我不能真正将这些坐标存储到一个大数组列表中,因为我并不总是希望这个功能发挥作用,例如,如果我的玩家比 coords[] 数组中的项目多,那么它不会被激活。

因此,我创建了一个已用坐标的数组列表,这是我如何做到这一点的逻辑:

    int[][] coords = {
       {3093, 3630 }, {3095, 3632}, {3098, 3633},
       {3101, 3633 }, {3104, 3631}, {3106, 3629}, 
       {3107, 3627}, {3108, 3624}, {3109, 3620},
       {3108, 3617}, {3106, 3614}, {3102, 3613},
       {3099, 3613}, {3097, 3613}, {3093, 3614},
       {3090, 3617}, {3087, 3619}
    };

    ArrayList<Integer> coordinates = new ArrayList<Integer>();

    int random = Misc.random(coords.length - 1);

    if (getPlayersCount() < coords.length) {
        if (coordinates.contains(coords[random][0], coords[random][1])) {
            random = Misc.random(coords.length - 1);
        }
        else {
            handler.move(coords[random][0], coords[random][1], 0);
            coords.add(coords[random][0], coords[random][1]);
        }
    }
    else {
        random = Misc.random(coords.length - 1);
        handler.move(coords[random][0], coords[random][1], 0);
    }

基本上,如果玩家的数量少于数组长度,则处理。如果坐标数组列表包含生成的 X、Y,则重新生成它,否则移动播放器并将坐标添加到列表中。

但似乎我做错了什么,因为我收到了这个错误:error: no suitable method found for contains(int,int)

我怎样才能做到这一点?

4

1 回答 1

7

ArrayList#contains将 aObject与列表中包含的那些对象进行比较...

如果此列表包含指定元素,则返回 true。更正式地说,当且仅当此列表包含至少一个元素 e 满足 (o==null ? e==null : o.equals(e)) 时,才返回 true。

您的列表包含 的数组int,这些数组不容易比较。

Object如果您使用whoequals方法能够比较其他类似对象的坐标,那会容易得多。就像是...

public class Coordinate {
    private int latitude;
    private int longitude;

    public Coordinate(int latitude, int longitude) {
        this.latitude = latitude;
        this.longitude = longitude;
    }

    public int getLatitude() {
        return latitude;
    }

    public int getLongitude() {
        return longitude;
    }

    public boolean equals(Object value) {
        boolean equals = false;
        if (value instanceof Coordinate) {
            Coordinate coord = (Coordinate) value;
            equals = getLatitude() == coord.getLatitude() && getLongitude() == coord.getLongitude();
        }
        return equals;
    }

    //good practice to override hashcode when you override equals
    public int hashcode() {
        int hash = 7;
        hash = 89 * hash + this.latitude;
        hash = 89 * hash + this.longitude;
        return hash;
    }
}

然后你可以使用更像...

Coordinate[] coords = {
   new Coordinate(3093, 3630 ), new Coordinate(3095, 3632), new Coordinate(3098, 3633),
   new Coordinate(3101, 3633 ), new Coordinate(3104, 3631), new Coordinate(3106, 3629), 
   new Coordinate(3107, 3627), new Coordinate(3108, 3624), new Coordinate(3109, 3620),
   new Coordinate(3108, 3617), new Coordinate(3106, 3614), new Coordinate(3102, 3613),
   new Coordinate(3099, 3613), new Coordinate(3097, 3613), new Coordinate(3093, 3614),
   new Coordinate(3090, 3617), new Coordinate(3087, 3619)
};

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

int random = Misc.random(coords.length - 1);

if (getPlayersCount() < coords.length) {
    Coordinate coord = new Coordinate(coords[random].getLatitude(), coords[random].getLongitude());
    if (coordinates.contains(coord)) {
        random = Misc.random(coords.length - 1);
    }
    else {
        handler.move(coords[random].getLatitude(), coords[random].getLongitude(), 0);
        coordinates.add(coords[random]);
    }
}
else {
    random = Misc.random(coords.length - 1);
    handler.move(coords[random].getLatitude(), coords[random].getLongitude(), 0);
}
于 2013-08-05T10:47:40.740 回答