对于循环映射覆盖先前的值

时间:2018-11-28 14:19:27

标签: java sockets dictionary

基本上,我正在使用插槽制作棋盘游戏。每个连接的客户端都存储在地图中。

当用户移动到2D数组中的坐标即“移动2,3”时,应将connectionID放在该位置。

当前的问题是,因为我有一个for循环;当我使用move命令时,连接ID被循环中的最后一个值替换。

public void move(int x, int y) {
    for (int value : gs.returnClients().values()) {
        storeArray[x][y] = value;
    }
}

即如果我连接了2个客户端:{62029=1, 62032=2}和我的董事会

[[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 1, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 2, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]

比方说,我想让客户端1移到0,而客户端3应该是:

[[0, 0, 0, 1, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 1, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 2, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]

但是我得到了:

[[0, 0, 0, 2, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 1, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 2, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]

因为它会覆盖for循环中映射的最后一个值。

我如何使它根据地图上的客户端“ id”移动?

编辑

在我的服务器上,我有clients.put(socket.getPort(), connectionID);和方法来返回地图和ID。我有一个GameService类,它执行的命令是

switch (request.type) {
       case MOVE:
            int clientID = Integer.parseInt(request.params[0]);
            int getX = Integer.parseInt(request.params[1]);
            int getY = Integer.parseInt(request.params[2]);
            game.move(clientID,getX, getY);
            return game.returnBoard();

在文件Request

String[] items = line.trim().split("\\s+");
            switch (items[0].toUpperCase()) {
                case "MOVE":
                    return new Request(RequestType.MOVE, items[1], items[2], items[3]);

1 个答案:

答案 0 :(得分:1)

据我了解您的代码,您需要按照以下方式进行移动:

public void move(int client, int x, int y) {
  storeArray[x][y] = client;
}

其中client是gs.returnClients().values()列表中数字中的一个(!)。如果您需要将其从该地图中删除,则需要为此提供适当的密钥,例如:

public void move(int clientId, int x, int y) {
  storeArray[x][y] = gs.returnClients().get(clientId);
}