有一些类似的线程,我已经尝试了一些解决方案,但是没有一个可以解决我的预期结果。 我有一个2D阵列(这是一个游戏板)。 如果我想将玩家ID移到板上的某个位置,我想检查该位置是否有一个等于玩家ID的相邻单元格。否则它将无法放置。
例如,如果我有一个董事会:
[0, 0, 0, 0, 0, 0, 0, 1, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0]
[0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
如果我尝试将1
放在[0][0]
的位置,则应该拒绝它,但是如果我尝试将其放置在[0][7], [0][9], [1][6], [1][7],[1][8]
(包括对角线)中。
我猜我当前的代码是一个开始尝试?但是我不确定如何进行clientID
检查:
public void move(int client, int x, int y) {
int startPosX = (x - 1 < MIN_X) ? x : x-1;
int startPosY = (y - 1 < MIN_Y) ? y : y-1;
int endPosX = (x + 1 > MAX_X) ? x : x+1;
int endPosY = (y + 1 > MAX_Y) ? y : y+1;
for (int rowNum=startPosX; rowNum<=endPosX; rowNum++) {
for (int colNum=startPosY; colNum<=endPosY; colNum++) {
if (storeArray[x][y] == EMPTY && client <= 5 && client >= 1) {
storeArray[x][y] = client;
int count = totals.containsKey(client) ? totals.get(client) : 1;
totals.put(client, count + 1);
}
}
}
因此它遍历行和列,并且如果在周围的任何单元格中,都应该放置它。但是我仍然可以将其放置在任何地方。 我的代码是否甚至可以完成应做的事情?
我缺少符合我的标准的哪些东西,可以修改此代码以使其正常工作吗?
答案 0 :(得分:2)
如果无法存储客户端的坐标,则可以将if语句修改为以下内容。如果您可以存储坐标,那么我肯定会使用Leo Leontev的答案。
/*I removed check for client to be between 1-5, can be re-added.
I would add the checks for the desired spot being empty and the client
being within 1-5 to the top of the method.
For loop iterates over the possible spaces where the client would be in range
check if client is in a space*/
if (storeArray[rowNum][colNum]==client) {
//storeArray[rowNum][colNum]=0;
storeArray[x][y] = client;
//unchanged
int count = totals.containsKey(client) ? totals.get(client) : 1;
totals.put(client, count + 1);
}
您还可以使用Math.min
和Math.max
来简化startX,Y,endX,Y,以避免尝试将客户端移出开发板而导致的indexOutOfBounds错误。
int startPosX = Math.max(x-1,0);
int startPosY = Math.max(y-1,0;
int endPosX = Math.min(x+1,storeArray.length-1);
int endPosY = Math.min(y+1,storeArray[0].length-1);
如果在totals.put(client,count+1);
调用之后没有执行任何操作,则可以添加return;
语句以退出该方法。如果仍然需要做更多工作,可以在外部for循环中添加标签,然后脱离标签。两种方法都会阻止您的计数每次移动不止一次。
outerloop:
for(int rowNum=startPosX;rowNum<=endPosX;rowNum++){
for(int colNum=startPosY;colNum<=endPosY;colNum++){
if(...){
//code
totals.put(client, count+1);
break outerloop;
}
}
}
这是我编辑器中的方法
public static move(int client, int x, int y){
if(storeArray[x][y]==client)
return;
int startPosX = Math.max(x-1,0), startPosY=Math.max(y-1,0);
int endPosX = Math.min(x+1,storeArray.length-1), endPosY = Math.min(y+1,storeArray[0].length-1);
outerloop:
for(int rowNum=startPosX;rowNum<=endPosX;rowNum++)
{
for(int colNum=startPosY;colNum<=endPosY;colNum++){
if(storeArray[rowNum][colNum]==client)
{
storeArray[x][y]=client;
System.out.println("Successful move");
int count = totals.getOrDefault(client, 1);
totals.put(client, count + 1);
break outerloop;
//could set colNum=endPosY+1 and rowNum=endPosX+1 if you don't want to use label/break
}
}
}
}
答案 1 :(得分:0)
您可以使用数组存储客户的坐标:
ArrayList<int[]> clientCoords = new ArrayList<>;
因此 move 方法如下所示:
public void move(int client, int x, int y) {
int[] coords = clientCoords.get(client);
int old_x = coords[0], old_y = coords[1]; // previous coordinates of the client
// check that the new cell is adjacent
if(Math.abs(x - old_x) <= 1 && Math.abs(y - old_y) <= 1){
clientCoords.set(client, new int[2]{x, y});
// your code
int count = totals.containsKey(client) ? totals.get(client) : 1;
totals.put(client, count + 1);
}
}