Как исправить метод getName() в классе Robot ? Как задать границы random не от 0 до 4, а от 1 до 4? Вывод в консоль вот такой:
C:\Users\admin\.jdks\openjdk-15.0.1\bin\java.exe "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2020.2.3\lib\idea_rt.jar=49996:C:\Program Files\JetBrains\IntelliJ IDEA Community Edition 2020.2.3\bin" -Dfile.encoding=UTF-8 -classpath D:\IDEA_project\JavaRushTasks\out\production\2.JavaCore com.javarush.task.task13.task1328.Solution
com.javarush.task.task13.task1328.Solution$Robot@30dae81 атаковал робота com.javarush.task.task13.task1328.Solution$Robot@1b2c6ec2, атакована голова, защищена голова
com.javarush.task.task13.task1328.Solution$Robot@30dae81 атаковал робота com.javarush.task.task13.task1328.Solution$Robot@1b2c6ec2, атакована нога, защищена рука
com.javarush.task.task13.task1328.Solution$Robot@1b2c6ec2 атаковал робота com.javarush.task.task13.task1328.Solution$Robot@30dae81, атакована нога, защищена null
com.javarush.task.task13.task1328.Solution$Robot@30dae81 атаковал робота com.javarush.task.task13.task1328.Solution$Robot@1b2c6ec2, атакована грудь, защищена null
com.javarush.task.task13.task1328.Solution$Robot@1b2c6ec2 атаковал робота com.javarush.task.task13.task1328.Solution$Robot@30dae81, атакована голова, защищена грудь
com.javarush.task.task13.task1328.Solution$Robot@30dae81 атаковал робота com.javarush.task.task13.task1328.Solution$Robot@1b2c6ec2, атакована голова, защищена грудь
com.javarush.task.task13.task1328.Solution$Robot@1b2c6ec2 атаковал робота com.javarush.task.task13.task1328.Solution$Robot@30dae81, атакована грудь, защищена рука
com.javarush.task.task13.task1328.Solution$Robot@30dae81 атаковал робота com.javarush.task.task13.task1328.Solution$Robot@1b2c6ec2, атакована null, защищена рука

Process finished with exit code 0
Метод getName() в классе Robot написан вот так (понятно, что надо исправить return Robot.this, но надо понять как):
public static class Robot extends AbstractRobot { /*(+)*/

        public Robot(String stringName) {
            super(stringName);
        }

        @Override
        public Robot getName() {
            return Robot.this;
        }
    }
Мой код целиком вот такой:
package com.javarush.task.task13.task1328;

/*
Битва роботов
*/

/*Битва роботов
Для начала разберись в том, что делает код: это будет непросто.
Затем измени код согласно новой архитектуре и добавь новую логику:
Сделай класс AbstractRobot абстрактным, вынеси логику атаки и защиты из Robot в AbstractRobot.
Отредактируй класс Robot, учитывая AbstractRobot.
Расширь класс BodyPart новой частью тела BodyPart.CHEST("грудь").
Добавь новую часть тела в реализацию интерфейсов Attackable и Defensable (в классе AbstractRobot).*/

/*Требования:
1. Класс AbstractRobot должен быть абстрактным. (+)
2. Класс AbstractRobot должен реализовывать интерфейсы Attackable и Defensable. (+)
3. Класс Robot должен наследоваться от класса AbstractRobot. (+)
4. Логика поведения роботов должна быть вынесена в класс AbstractRobot.
5. В классе BodyPart должна содержаться и быть инициализирована final static переменная CHEST типа BodyPart.
6. Новую часть тела (BodyPart) нужно добавить в логику методов attack и defense в классе AbstractRobot.*/

import java.util.Random;

public class Solution {
    public static void main(String[] args) {
        Robot amigo = new Robot("Амиго");
        Robot enemy = new Robot("Сгибальщик-02");

        doMove(amigo, enemy);
        doMove(amigo, enemy);
        doMove(enemy, amigo);
        doMove(amigo, enemy);
        doMove(enemy, amigo);
        doMove(amigo, enemy);
        doMove(enemy, amigo);
        doMove(amigo, enemy);
    }

    public static void doMove(AbstractRobot robotFirst, AbstractRobot robotSecond) {
        BodyPart attacked = robotFirst.attack();
        BodyPart defenced = robotFirst.defense();
        System.out.println(String.format("%s атаковал робота %s, атакована %s, защищена %s",
                robotFirst.getName(), robotSecond.getName(), attacked, defenced));
    }

    public static abstract class AbstractRobot implements Attackable, Defensable { /*(+)*/
        private static int damageCounter;
        private String stringName;

        public String getStringName() {
            return stringName;
        }

        public static int getDamageCounter() {
            return damageCounter;
        }

        public AbstractRobot (String stringName) {
            this.stringName = stringName;
        }

        Random random = new Random();

        public BodyPart attack() {
            BodyPart attackedBodyPart = null;
            damageCounter = random.nextInt(5);

            if (damageCounter == 1) {
                attackedBodyPart = BodyPart.ARM;
            } else if (damageCounter == 2) {
                attackedBodyPart = BodyPart.HEAD;
            } else  if (damageCounter == 3) {
                attackedBodyPart = BodyPart.LEG;
            } else if (damageCounter == 4) {
                attackedBodyPart = BodyPart.CHEST;
                damageCounter = 0;
            }
            return attackedBodyPart;

        }

        public BodyPart defense() {
            BodyPart defenseBodyPart = null;
            damageCounter = random.nextInt(5);
            if (damageCounter == 1) {
                defenseBodyPart = BodyPart.HEAD;
            } else if (damageCounter == 2) {
                defenseBodyPart = BodyPart.LEG;
            } else if (damageCounter == 3) {
                defenseBodyPart = BodyPart.CHEST;
            } else if (damageCounter == 4) {
                defenseBodyPart = BodyPart.ARM;
                damageCounter = 0;
            }
            return defenseBodyPart;
        }

        public abstract Robot getName();


        //public abstract BodyPart attack();

    }

    public static class Robot extends AbstractRobot { /*(+)*/

        public Robot(String stringName) {
            super(stringName);
        }

        @Override
        public Robot getName() {
            return Robot.this;
        }
    }

    public static final class BodyPart {
        final static BodyPart HEAD = new BodyPart("голова");
        final static BodyPart LEG = new BodyPart("нога");
        final static BodyPart ARM = new BodyPart("рука");
        final static BodyPart CHEST = new BodyPart("грудь");

        private String bodyPart;

        public String getBodyPart() {
            return bodyPart;
        }

        private BodyPart(String bodyPart) {
            this.bodyPart = bodyPart;
        }

        @Override
        public String toString() {
            return this.bodyPart;
        }
    }

    public interface Attackable { /*(+)*/
        BodyPart attack();
    }

    public interface Defensable { /*(+)*/
        BodyPart defense();
    }
}