基本上,我正在使用插槽制作棋盘游戏。每个连接的客户端都存储在地图中。
当用户移动到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]);
答案 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);
}