Перемещение робота подкласса программирования на Java - PullRequest
0 голосов
/ 07 ноября 2019

Мне было дано следующее назначение:

Создать матрицу 10x10 в виде 2D-массива. Предположим, что робот находится в положении [0, 0]. Теперь случайным образом создайте ход. Движение может привести робота к одному из восьми возможных соседних слотов - {вверх, вниз, влево, вправо, влево-вверх, влево-вниз, вправо-вверх и вправо-вниз}} -эти слоты представлены {1, 2, 3, 4, 5, 6, 7, 8}. Однако в [0, 0] у робота есть только три возможных слота для перемещения - вправо, вниз, вправо-вниз. Создайте другого робота по имени R2 и поместите его в [9, 9]. Теперь случайным образом сгенерируйте целое число в диапазоне от [1 до 8]. Это первое случайное целое число соответствует возможному ходу робота R1. Если ход действителен, то переместите R1 в свой новый слот. Ход недействителен, если он выводит робота за пределы матрицы [10x10]. Если движение недопустимо, продолжайте генерировать случайные целые числа, пока не будет найдено правильное движение. Повторите эту процедуру для второго робота R2. Если оба R1 и R2 находятся в одном и том же слоте, остановитесь, напечатайте последний слот, напечатайте последовательность случайных чисел, которые привели R1 в этот слот, и напечатайте последовательность случайных чисел, которые привели R2 в один и тот же слот. Реализуйте эту программу с помощью класса Robot и подкласса MovingRobot.

Методы, переменные, типы возвращаемых данных и параметры задаются инструктором и не могут быть изменены.

```public class Robot {

int x;
int y;
public static final int DOWN = 1;
public static final int LEFT = 2;
public static final int LEFT_DOWN_CORNER = 3;
public static final int LEFT_UP_CORNER = 4;
public static final int RIGHT = 5;
public static final int RIGHT_DOWN_CORNER = 6;
public static final int RIGHT_UP_CORNER = 7;
public static final int UP = 8;

//getters
public int getX() {
    return x;
}

public int getY() {
    return y;
}

//setters
public void setX(int x) {
    this.x = x;
}

public void setY(int y) {
    this.y = y;
}

//constructor
public Robot(int x, int y) {
    this.x = x;
    this.y = y;
}
}//end Robot class

import java.util.ArrayList;

public class MovingRobot extends Robot{
    ArrayList<Integer> moves;
    int nextMove;


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

public boolean validateNextMove() {
    if ((nextMove == LEFT || nextMove == LEFT_UP_CORNER || nextMove == LEFT_DOWN_CORNER) && (this.getY() == 0))
        return false;
    if ((nextMove == RIGHT || nextMove == RIGHT_UP_CORNER || nextMove == RIGHT_DOWN_CORNER) && (this.getY() == 9))
        return false;
    if ((nextMove == UP || nextMove == LEFT_UP_CORNER || nextMove == RIGHT_UP_CORNER) && (this.getX() == 0))
        return false;
    if ((nextMove == DOWN || nextMove == LEFT_DOWN_CORNER || nextMove == RIGHT_DOWN_CORNER) && (this.getX() == 9))
        return false;
    else
        return true;
}

public int generateNextMove(){
       return (int)(Math.random()*8) + 1;
}

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

public String printMoves(){
    String movesReport = "";
    for (var nextMove: moves) {
        if (nextMove == DOWN) movesReport += "Down, ";
        if (nextMove == LEFT) movesReport += "Left, ";
        if (nextMove == LEFT_DOWN_CORNER) movesReport += "Left Down Corner, ";
        if (nextMove == LEFT_UP_CORNER) movesReport += "Left Up Corner, ";
        if (nextMove == RIGHT) movesReport += "Right, ";
        if (nextMove == RIGHT_DOWN_CORNER) movesReport += "Right Down Corner, ";
        if (nextMove == RIGHT_UP_CORNER) movesReport += "Right Up Corner, ";
        if (nextMove == UP) movesReport += "Up, ";
    }
    return movesReport;
}

public void move(){
    do nextMove = generateNextMove();
    while (validateNextMove() == false);
    switch (nextMove) {
        case 1: //LEFT
            this.x -= 1;
            moves.add(nextMove);
            break;
        case 2: //LEFT DOWN
            this.x -= 1;
            this.y += 1;
            moves.add(nextMove);
            break;
        case 3: //LEFT UP
            this.x -= 1;
            this.y -= 1;
            moves.add(nextMove);
            break;
        case 4: //RIGHT
            this.x += 1;
            moves.add(nextMove);
            break;
        case 5: // RIGHT DOWN
            this.x += 1;
            this.y += 1;
            moves.add(nextMove);
            break;
        case 6: // RIGHT UP
            this.x += 1;
            this.y -= 1;
            moves.add(nextMove);
            break;
        case 7: // UP
            this.y -= 1;
            moves.add(nextMove);
            break;
        case 8: //DOWN
            this.y += 1;
            moves.add(nextMove);
            break;
        default: System.out.print("invalid move");
    }
}

public static void main(String[] args) {
    var r1 = new MovingRobot(0,0);
    var r2 = new MovingRobot(9, 9);
    r1.moves = new ArrayList<>();
    r2.moves = new ArrayList<>();
    while (!sameSlot(r1, r2)) {
        r1.move();
        if (!sameSlot(r1, r2)) {
            r2.move();
        }
    }
    System.out.println("Robot 1's moves were: " + r1.printMoves());
    System.out.println("Robot 2's moves were: " + r2.printMoves());
   }
}```

Я являюсьполучение:

Исключение в потоке "main" java.lang.OutOfMemoryError: пространство кучи Java в java.base / java.util.Arrays.copyOf (Arrays.java:3721) в java.base /java.util.Arrays.copyOf (Arrays.java:3690) в java.base / java.util.ArrayList.grow (ArrayList.java:237) в java.base / java.util.ArrayList.grow (ArrayList.java:242) в java.base / java.util.ArrayList.add (ArrayList.java:485) в java.base / java.util.ArrayList.add (ArrayList.java:498) в MovingRobot.move (MovingRobot.java:60) в MovingRobot.main (MovingRobot.java:97)

...