0

我想制作一个 10x10 的网格并将机器人放在 (10,1) 位置(左下角)。我希望这个机器人能够向前移动、左转/右转并在网格中拾取/放置物体。当放置在任何位置时,网格中应该有一个数字,显示该位置放置了多少个对象,就像这样:

..........
...1......
..2.......
....3.....
..........
..........
......9...
.....4....
.........1
..........

我们不会在网格中看到机器人。我有两节课。班级机器人:

public class Robot {

private Area area;
private Robot rob;

public Robot(Area area){
    this.area = area;
    rob = new Robot(area);
}

public void Right(){

}
public void Left(){

}
public void Forward(){

}
public void Put(){

}
public void PickUp(){

}
public (?) getPosition(){ // should return robot's position

}
}

课区:

private int numberOfObjects;
private Robot robot;
private static final int X = 10;
private static final int Y = 10;
private Object [][] area; // grid

public Area(){ // defines a grid and robot
    area = new Area[X][Y];
    for(int a=0;a<X;a++){
        for(int b=0;b<Y;b++)
            area[a][b]=".";
    }

    numberOfObjects = 0; // grid is initially empty
    Area ar = new Area();
    robot = new Robot(ar);
}

public void Put(int x,int y){ // put the object to position (x,y)
    area[x][y]=numberOfObjects++;
}

public void PickUp(int x,int y){ // pick up the object in position (x,y)
    if(area[x][y]!=null){
        area[x][y]=numberOfObjects--;
    }
}

public void PrintAGrid(){
    for(int r=0;r<X;r++){
        for(int c=0;c<Y;c++)
        System.out.print(area[r][c]+" ");
     System.out.println();
    }
    System.out.println();
}
}

如何将机器人放置在位置 (10,1)?我如何声明和设置它的方向(即在右边)?我想写其他方法会很容易,所以我不关注它。

4

3 回答 3

2

您的代码有几个问题。

  1. 为什么你有一个Robot类里面的实例Robot?你根本没有使用过那个实例!
  2. private Object [][] area;应该是int[][] area。你总是保存int在这个,对吧?
  3. 如果我正确地理解了您的要求,那么您的实施pick并不put正确。

以下是如何解决问题的帮助。我不得不多次考虑是否Robot应该在Grid或它应该是另一种方式。我最终得到了Gridin Robot。可能Grid是单身人士。

这是我们的Grid

public class Grid {
    private int[][] numberOfObjects = new int[10][10];

    public void put(int x, int y) {
        numberOfObjects[y][x]++;
    }

    public void pick(int x, int y) {
        numberOfObjects[y][x]--;
    }
}

您可以将参数替换int x, int yPoint.

这是机器人

public class Robot {
    private static final int NORTH = 0, EAST = 1, SOUTH = 2, WEST = 3;
    private int direction;
    private int x, y;

    private Grid grid;

    public Robot(Grid grid) {
        this.x = 0;
        this.y = 0;

        this.grid = grid;
        direction = NORTH;
    }

    public void right() {
        direction++;
        if (direction == 4) {
            direction = 0;
        }
    }

    public void left() {
        direction--;
        if (direction == -1) {
            direction = 3;
        }
    }

    public void forward() {
        if (direction == NORTH) {
            y--;
        } else if (direction == SOUTH) {
            y++;
        } else if (direction == EAST) {
            x++;
        } else if (direction == WEST) {
            x--;
        }
    }

    public void put() {
        grid.put(x, y);
    }

    public void pick() {
        grid.pick(x, y);
    }
}
于 2013-05-19T17:24:19.750 回答
0

您需要用一个变量表示当前位置并将其初始化为 10 1 位置,尽管您的数组为 0-9 和 0-9,所以这可能是 9,0。要存储这个位置,可以尝试一个包含Point x,y的 Point 对象。

于 2013-05-19T16:49:48.510 回答
0

如果有人对 JavaScript 版本感兴趣,你可以在这里查看这个 repo 。一般来说:

  1. 机器人必须有一个朝向(left, up, right, down)。
  2. 这是三个可能的命令:left, right, move

话虽如此,该算法非常简单:

totalScore = 0
Foreach i in input
  computeCurrentDirection()
  if input != MOVE: continue
  totalScore += i

return totalScore

有人可能会采取一些技巧来优化功能。看看switchDirection

const directionArray = [Directions.RIGHT, Directions.DOWN, Directions.LEFT, Directions.UP];

const switchDirection = (currDirection, command) => {
    if (command === Commands.MOVE) {
        return currDirection
    }

    const currDirectionIndex = directionArray.indexOf(currDirection);
    if (command === Commands.RIGHT) {
        return directionArray[(currDirectionIndex + 1) % 4];
    }
    return directionArray[((currDirectionIndex - 1) + 4) % 4];
}

有人可能会使用数组来帮助计算机器人即将到来的方向,而不是使用详尽的方法。这显着减少了所需代码的数量。

请注意,此实施可以轻松扩展,以适应项目扩展所需的任何新要求。面对此类问题时,请尝试以可测试和可扩展的方式构建您的代码库,因为通常情况下,审阅者对您的编码组织技能感兴趣,而不是您是否能够解决问题。

于 2021-05-26T20:41:20.430 回答