summaryrefslogtreecommitdiff
path: root/src/Q9/MovingRobot.java
blob: c982250c0ada7007f857cff8569bb40df9c9c439 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
package Q9;

import java.util.*;

public class MovingRobot extends Robot {
  private ArrayList<Integer> moves = new ArrayList<Integer>();
  private int nextMove;

  public MovingRobot(int x, int y) {
    super(x, y);
  }

  public boolean validateNextMove() {
    return validateNextMove(nextMove);
  }

  public boolean validateNextMove(int direction) {
    switch (direction) {
      case Robot.NORTH:
        return canMoveNorth();
      case Robot.NORTH_EAST:
        return canMoveNorth() && canMoveEast();
      case Robot.EAST:
        return canMoveEast();
      case Robot.SOUTH_EAST:
        return canMoveSouth() && canMoveEast();
      case Robot.SOUTH:
        return canMoveSouth();
      case Robot.SOUTH_WEST:
        return canMoveSouth() && canMoveWest();
      case Robot.WEST:
        return canMoveWest();
      case Robot.NORTH_WEST:
        return canMoveWest() && canMoveNorth();
      default:
        return false;
    }
  }

  public int generateNextMove() {
    return new Random().nextInt(7) + 1;
  }

  public static boolean sameSlot(Robot r1, Robot r2) {
    return r1.getX() == r2.getX() && r1.getY() == r2.getY();
  }

  public static String printGrid(Robot x, Robot y) {
    String grid = "";
    for (int row = 0; row < 10; row++) {
      for (int column = 0; column < 10; column++) {
        if (x.getX() == row && x.getY() == column) grid += "|X";
        else if (y.getX() == row && y.getY() == column) grid += "|Y";
        else grid += "| ";
      }
      grid += String.format("|%s", System.lineSeparator());
    }

    return grid;
  }

  public String printMoves() {
    ArrayList<String> printableMoves = new ArrayList<String>();
    for (Integer move : this.moves) printableMoves.add(String.valueOf(move));
    return String.join(",", printableMoves);
  }

  public void move() {
    this.nextMove = generateNextMove();
    if (!validateNextMove(this.nextMove)) this.move();

    this.move(this.nextMove);
  }

  public void move(int direction) {
    if (!validateNextMove(direction)) return;

    switch (direction) {
      case Robot.NORTH:
        moveNorth();
        break;
      case Robot.NORTH_EAST:
        moveNorth();
        moveEast();
        break;
      case Robot.EAST:
        moveEast();
        break;
      case Robot.SOUTH_EAST:
        moveSouth();
        moveEast();
        break;
      case Robot.SOUTH:
        moveSouth();
        break;
      case Robot.SOUTH_WEST:
        moveSouth();
        moveWest();
        break;
      case Robot.WEST:
        moveWest();
        break;
      case Robot.NORTH_WEST:
        moveWest();
        moveNorth();
        break;
      default:
        return;
    }
    moves.add(direction);
  }

  private boolean canMoveNorth() {
    return this.getY() > 0;
  }

  private boolean canMoveSouth() {
    return this.getY() < 9;
  }

  private boolean canMoveEast() {
    return this.getX() < 9;
  }

  private boolean canMoveWest() {
    return this.getX() > 0;
  }

  private void moveNorth() {
    this.setY(this.getY() - 1);
  }

  private void moveSouth() {
    this.setY(this.getY() + 1);
  }

  private void moveEast() {
    this.setX(this.getX() + 1);
  }

  private void moveWest() {
    this.setX(this.getX() - 1);
  }

  public static void main(String[] args) {
    MovingRobot r1 = new MovingRobot(0, 0);
    MovingRobot r2 = new MovingRobot(9, 9);

    while (!MovingRobot.sameSlot(r1, r2)) {
      r1.move();
      r2.move();

      clear();
      System.out.println(MovingRobot.printGrid(r1, r2));
      sleep(1000);
    }

    System.out.println("=== Question 9 ===");
    System.out.println(String.format("Collision at: (%d, %d)", r1.getX(), r1.getY()));
    System.out.println(String.format("R1 Route: [%s]", r1.printMoves()));
    System.out.println(String.format("R2 Route: [%s]", r2.printMoves()));
  }

  private static void clear() {
    try {
      if (System.getProperty("os.name").contains("Windows")) Runtime.getRuntime().exec("cls");
      else {
        System.out.print("\033[H\033[2J");
        System.out.flush();
      }
    } catch (Exception e) {
    }
  }

  private static void sleep(int milliseconds) {
    try {
      Thread.sleep(milliseconds);
    } catch (InterruptedException e) {
    }
  }
}