Как уменьшить значение в HashMap?

1

Поэтому у меня есть playerID и несколько numwalls для каждого игрока в настольной игре, которую я делаю. Прямо сейчас, чтобы удалить стены, когда каждый игрок использует один, каждый в основном разделяет стены.

Поэтому я решил, что должен сделать hashmap чтобы держать playerID в качестве ключа и numwalls как значение.

Но я не знаю, как уменьшить значение ключей, когда предполагается использовать стену.

Я покажу свой код, в котором есть проблема.

public int getWallsRemaining(int i) {
    return numWalls;
}

public void lastMove(PlayerMove playerMove) {
    System.out.println("in lastMove... " + playerMove);
    /**
     * if piece moves, update its position
     */
    if(playerMove.isMove() == true){

        Integer player = playerMove.getPlayerId();

        Coordinate newLoc = new Coordinate(playerMove.getEndRow(), playerMove.getEndCol());
        playerHomes.put(player, newLoc);

    }
    /**
     * if a wall is placed, subtract the wall form the player who placed it
     * and subtract the appropriate neighbors.
     */
    if(playerMove.isMove() == false){
        numWalls-=1;
        removeNeighbor(playerMove.getStart(), playerMove.getEnd());

    }


}

Здесь, где я все инициализирую, walls - это моя карта для того, что я пытаюсь сделать:

private Map<Coordinate, HashSet<Coordinate>> graph;

private int PlayerID;
private int numWalls;
private Map<Integer, Coordinate> playerHomes;
private Map<Integer, Integer> walls;



@Override
public void init(Logger logger, int playerID, int numWalls, Map<Integer, Coordinate> playerHomes) {


    this.PlayerID = playerID;
    this.walls = new HashMap<Integer, Integer>();
    this.numWalls = numWalls;
    this.playerHomes = playerHomes;
    this.graph = new HashMap<Coordinate, HashSet<Coordinate>>();
    walls.put(playerID,numWalls);

    for(int r = 0; r <= 10; r++){
        for(int c = 0; c <= 10; c++){
            HashSet<Coordinate> neighbors = new HashSet<Coordinate>();
                 if(r > 0){
                    neighbors.add(new Coordinate(r - 1, c));
                 }
                if(r < 8){
                     neighbors.add(new Coordinate(r + 1, c));
                 }
                if(c > 0){
                    neighbors.add(new Coordinate(r, c - 1));
                 }
                if(c < 8){
                    neighbors.add(new Coordinate(r, c + 1));
                 }
            graph.put((new Coordinate(r,c)), neighbors);
        }
    }
}

Вы можете увидеть в моем методе lastMove что я уменьшаю стены на 1. Это моя проблема. Я хочу playerID указанное число playerID numwall на 1. Что у меня теперь работает только для 1 игрока. Мне нужно это для работы до 4 игроков.

Теги:
hashmap
decrement

3 ответа

2
Лучший ответ

HashMap может просто содержать объекты (не примитивы), поэтому вы должны вставлять Integer в качестве отображаемого значения.

Поскольку Integer является неизменным классом, вы не можете напрямую изменить значение, вам нужно заменить его, отбросив старое значение, например:

HashMap<Player, Integer> walls = new HashMap<Player,Integer>();

int currentWalls = walls.get(player);
walls.put(player, currentWalls-1);
1

Я бы использовал AtomicInteger для хранения ваших значений. Это потокобезопасно, если несколько игроков одновременно сталкиваются с стенами. И это проще, чем воссоздать новый Integer каждый раз (как в ответе @Jack)

HashMap<Player, AtomicInteger> walls = new HashMap<Player,AtomicInteger>();

...

walls.get(player).decrementAndGet();

Если необходимо, вы можете вернуть значение из вызова декрементАндГет(), чтобы получить новое количество стенок.

  • 0
    Привет, спасибо за ваш ответ. Теперь я работаю, используя карту ключей и значений Integer, но ваша идея AtomicInteger интересна и нова для меня. Итак, я создал цикл в моем init для заполнения моей карты стен, но когда я делаю wall.put (i, numwalls), я получаю сообщение об ошибке в numWalls, в котором говорится, что для этого требуется AtomicInteger, а не Integer. Я немного запутался, но мне нравится твоя идея
  • 0
    Java будет «автоматически» помещать int в Integer, но не в AtomicInteger. В вашем цикле идите walls.put(theKey, new AtomicInteger(numwalls));
0

Чтобы изменить значение, сохраненное с помощью ключа, вы должны удалить старое значение и добавить новое значение.

Тем не менее, считали ли вы создание класса Player для инкапсуляции playerId и количества стен, которые имеет игрок? Это может работать лучше для ваших планов.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню