Поэтому у меня есть 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
может просто содержать объекты (не примитивы), поэтому вы должны вставлять Integer
в качестве отображаемого значения.
Поскольку Integer
является неизменным классом, вы не можете напрямую изменить значение, вам нужно заменить его, отбросив старое значение, например:
HashMap<Player, Integer> walls = new HashMap<Player,Integer>();
int currentWalls = walls.get(player);
walls.put(player, currentWalls-1);
Я бы использовал AtomicInteger для хранения ваших значений. Это потокобезопасно, если несколько игроков одновременно сталкиваются с стенами. И это проще, чем воссоздать новый Integer каждый раз (как в ответе @Jack)
HashMap<Player, AtomicInteger> walls = new HashMap<Player,AtomicInteger>();
...
walls.get(player).decrementAndGet();
Если необходимо, вы можете вернуть значение из вызова декрементАндГет(), чтобы получить новое количество стенок.
walls.put(theKey, new AtomicInteger(numwalls));
Чтобы изменить значение, сохраненное с помощью ключа, вы должны удалить старое значение и добавить новое значение.
Тем не менее, считали ли вы создание класса Player для инкапсуляции playerId и количества стен, которые имеет игрок? Это может работать лучше для ваших планов.