Как исправить метод 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();
}
}