summaryrefslogtreecommitdiff
path: root/src/Q9/MovingRobot.java
blob: 391f407c8ed43a2609155686e682be64aa69758a (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
182
183
184
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.UP:
        return canMoveUp();
      case Robot.RIGHT_UP_CORNER:
        return canMoveUp() && canMoveRight();
      case Robot.RIGHT:
        return canMoveRight();
      case Robot.RIGHT_DOWN_CORNER:
        return canMoveDown() && canMoveRight();
      case Robot.DOWN:
        return canMoveDown();
      case Robot.LEFT_DOWN_CORNER:
        return canMoveDown() && canMoveLeft();
      case Robot.LEFT:
        return canMoveLeft();
      case Robot.LEFT_UP_CORNER:
        return canMoveLeft() && canMoveUp();
      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 = "";
    int row = 0;

    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 += "|\n";

    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.UP:
        moveUp();
        break;
      case Robot.RIGHT_UP_CORNER:
        moveUp();
        moveRight();
        break;
      case Robot.RIGHT:
        moveRight();
        break;
      case Robot.RIGHT_DOWN_CORNER:
        moveDown();
        moveRight();
        break;
      case Robot.DOWN:
        moveDown();
        break;
      case Robot.LEFT_DOWN_CORNER:
        moveDown();
        moveLeft();
        break;
      case Robot.LEFT:
        moveLeft();
        break;
      case Robot.LEFT_UP_CORNER:
        moveLeft();
        moveUp();
        break;
      default:
        return;
    }
    moves.add(direction);
  }

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

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

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

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

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

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

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

  private void moveLeft() {
    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) {
    }
  }
}