marek
marek

Reputation: 129

Position and orientation of robot in a grid

I want to make a 10x10 grid and put the robot in position (10,1) (bottom left). I want this robot to be able to move forward, turn left/right and to pick up/put objects in a grid. When put in any position, there should be number in a grid which shows how many objects is put in this position, just like this:

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

We will not see the robot in a grid. I have two classes. Class Robot:

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

}
}

Class Area:

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();
}
}

How can I put the robot in position (10,1)? How can I declare and set its orientation (i.e. on the right)? I guess it will be easy to write other methods, so I do not focus on it.

Upvotes: 0

Views: 3437

Answers (3)

Menelaos Kotsollaris
Menelaos Kotsollaris

Reputation: 5506

If someone is interested in a JavaScript version, you can have a look at this repo right here. In general:

  1. The robot must have a facing direction (left, up, right, down).
  2. The are three possible commands: left, right, move.

With that being said, the algorithm is quite straightforward:

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

return totalScore

There are several sweet-tricks that someone might do to optimize the functions. Take a look at 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];
}

Instead of an exhaustive approach, someone might use an array to help compute the upcoming direction of the robot. This significantly reduces the amount of needed code.

Note this implementation can be easily expanded to accommodate any new requirements needed for project expansion. When faced with such questions, try to architect your codebase in a testable and expandable way, because it's usually the case where reviewers are interested in your coding organizational skills, rather than whether you are able to solve the problem or not.

Upvotes: 0

Mohayemin
Mohayemin

Reputation: 3870

There are several issues with your code.

  1. Why do you have an instance of Robot inside the class Robot? You have not used that instance at all!
  2. private Object [][] area; should be int[][] area. You always save int in this, right?
  3. If I understand your requirements correctly, Your implementation of pick and put is not correct.

Here is a help how you can solve the problems. I had to think several times if Robot should be in Grid or it should be the other way. I ended up with Grid in Robot. May be Grid could be a singleton.

Here is our 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]--;
    }
}

You can replace parameters int x, int y with a Point.

And here is the robot

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);
    }
}

Upvotes: 2

LanternMike
LanternMike

Reputation: 664

You need to represent the curent location with a variable and initialize it to the 10 1 postion, though your array goes 0-9 and 0-9 so this may be 9,0. to store this position maybe try a Point object that contains a Point x,y.

Upvotes: 0

Related Questions