Как вернуть строку и тип int в метод?

1

Напишите класс для персонажа видеоигры. Персонаж должен иметь имя, тип (разведчик, солдат, медик и т.д.) И текущее состояние здоровья. Поэтому ему нужны три атрибута:

String name, String type, int health

Этот класс должен иметь следующие методы:

GameCharacter( String newName, String newType, newCurHealth ) Конструктор, который принимает три входа.

changeHealth( int change ) Метод, который изменяет здоровье персонажа. Здоровье персонажей изменится на величину изменения, поэтому оно будет уменьшаться, если изменение отрицательное, и вверх, если оно положительное. Если здоровье опускается ниже 0, changeHealth должно вернуть строку "Ваш персонаж мертв".

Вот мой код до сих пор. Есть ли что-нибудь, что я могу сделать, чтобы сделать его лучше? & способ вернуть строку во втором методе?

public class GameCharacter {
    private String name;
    private String type;
    private int health;

    public GameCharacter(String newName, String newType, int newCurHealth){
        name = newName;
        type = newType;
        health = newCurHealth;
    }

    public int changeHealth (int change){
        if (change < 0){
            return health - change;
        } else if (change > 0){
            return health + change;
        } else if (health < 1){
            // string that character is dead
        }
    }

    public static void main(String[] args){
        GameCharacter Mario = new GameCharacter ("Mario", "Hero", 100);
        GameCharacter Luigi = new GameCharacter ("Luigi", "Sidekick", 100);
        GameCharacter Bowser = new GameCharacter ("Bowser", "Villian", 100);
    }
}
  • 0
    Нет, где ваше требование говорит, что changeHealth должен вернуть обновленное health . Так что просто измените тип возвращаемого значения на String и верните какое-нибудь другое сообщение для первых 2 if-else .
  • 0
    Он либо возвращает int, либо возвращает String, если вы не хотите использовать уродливую технику возврата числа в качестве его десятичного представления в виде String, или возвращаете Object, либо Integer, либо String, который передает ответ вызывающей стороне. Я бы придерживался int, возвращал бы также значение меньше 0. и предоставлял бы метод bool isDead ()
Показать ещё 3 комментария
Теги:

8 ответов

2

Вы не можете вернуть ни int ни String. Вам нужно выбрать один тип, и вы должны подумать о своем дизайне, если хотите вывести сообщение. Например, просто changeHealth() возвращаемое значение changeHealth() после вызова метода.

Или вы можете определить настраиваемое исключение (или использовать существующее). Просто чтобы вы начали:

public int changeHealth(int change) {
  int result = health;

  if (health < 1) {
    throw new IllegalStateException("Cannot change health, character is dead already.");
  }

  // Calculate health change (if any)
  health += change;

  // Return new health
  return health;
}
  • 1
    Этот метод changeHealth не меняет здоровье персонажа.
  • 0
    Вы правы насчет этого, я слишком сконцентрировался на возвращаемом значении типа int и String . Исправлена логика кода.
1

Было бы разумнее всегда возвращать то же самое, независимо от того, умер ли ваш персонаж или нет.

Например:

public class GameCharacter {
    private String name;
    private String type;
    private int health;


    public GameCharacter(String newName, String newType, int newCurHealth){
        name = newName;
        type = newType;
        health = newCurHealth;
    }

    public String changeHealth (int change){
        // Adding positive number will increase health.
        // Adding negative number will decrease health.
        health += change;
        if (health > 0){
            return "Your character now has " + health + " health.";
        } else {
            return "Your character is dead.";
        }
    }

    public static void main(String[] args){
        GameCharacter Mario = new GameCharacter ("Mario", "Hero", 100);
        GameCharacter Luigi = new GameCharacter ("Luigi", "Sidekick", 100);
        GameCharacter Bowser = new GameCharacter ("Bowser", "Villain", 100);
    }
}
1

Смиренно, я думаю, что вы хотите не очень хорошо. Ваши методы должны быть настолько семантическими, насколько это возможно.

Лучшим подходом было бы возвращение отрицательного int, и ваш класс GameCharacter может иметь метод isDead или isAlive, который даст вам это состояние.

public class GameCharacter {
    private String name;
    private String type;
    private int health;

    public boolean isAlive(){ return health>0; }
    public boolean isDead(){ !isAlive(); }
}
1

Если вы объявляете метод для возврата int, вы не можете заставить его возвращать String как "специальный результат".

Существует несколько способов решить вашу проблему. Вы можете добавить такой метод, как checkAlive() который возвращает true, если текущее состояние здоровья больше 0 и false в противном случае, или сделать вызывающим агентом проверку возвращаемого значения (которое должно быть после изменения после изменения) и распечатать строку, если это значение равно меньше или равно 0.

Также я думаю, что у вас есть некоторые ошибки в вашей концепции: во-первых, ваш метод не изменяет значение здоровья внутри вашего класса; во-вторых, код внутри последнего, если вы хотите вернуть строку, будет выполняться только тогда, когда 0 передается как параметр для метода. Возможно, это не то, что вы хотите. Чтобы следовать моему предложению, отредактируйте метод следующим образом:

public int changeHealth(int change) {
    health += change;
    return health;
}
  • 0
    «Здоровье персонажа будет меняться в зависимости от количества изменений, поэтому оно будет ухудшаться, если изменение отрицательное, и повышаться, если оно положительное». Вам следует изменить -= на +=
1

Я думаю, вы неправильно поняли назначение. Метод не должен возвращать новое здоровье, но для изменения его здоровья, то есть просто обновить this.health "на месте" и изменить возвращаемый тип на String.

Кроме того, нет необходимости проверять, является ли change положительным или отрицательным; просто добавьте его в health !

public String changeHealth (int change) {
    this.health += change
    if (health < 1) {
         return "Your character is dead";
    } else {
        return null; // or whatever
    }
}

Изменение: в то время как другие ответы предлагают некоторые хорошие альтернативы и дополнения к API-интерфейсу Character, учитывая, что это похоже на присвоение, я думаю, вы должны придерживаться описания метода, то есть изменить здоровье и вернуть строку.

0
public String changeHealth(int change) {
    health += change;
    return health < 0 ? "Your character is dead" : null;
}
0

Я бы пересмотрел дизайн, особенно вокруг метода changeHealth. Однако, если вы действительно хотите иметь комбинированный тип возврата int и необязательную строку, вы можете создать новый класс, скажем, HealthStatus, который фактически содержит Optional<String>:

public class HealthStatus {
    public final int health;
    public final Optional<String> message;

    public HealthStatus(int health, String message) {
        this.health = health;
        this.message = Optional.of(message);
    }

    public HealthStatus(int health) {
        this.health = health;
        this.message = Optional.empty();
    }

    public int getHealth() {
        return health;
    }

    public Optional<String> getMessage() {
        return message;
    }
}

Затем в вашем методе changeHealth вы можете при необходимости вернуть сообщение:

public HealthStatus changeHealth(int change) {
    health += change;
    if (health < 1) {
        return new HealthStatus(health, "Your character is dead");
    } else {
        return new HealthStatus(health);
    }
}

И в тот момент, когда вы его вызываете, вы можете распечатать сообщение, если оно есть (или сделать все, что ему подходит):

// take 7 points of damage:
HealthStatus status = changeHealth(-7);
hitPoints = status.getHealth();
// print the message, if there is one
status.getMessage().ifPresent(System.out::println);
0

Немногие вещи,

во-первых, не беспокойтесь, ваш персонаж никогда не умрет

  if (change < 0){
         return health - change;
     } else if (change > 0){
         return health + change;
     }

вы добавляете положительное значение изменения к здоровью и вычитаете отрицательное значение. Математика 101 x - (-y) == x + y

во-вторых, ваш персонаж может умереть, но я не думаю, что любое действие, связанное с его мертвым, должно происходить внутри класса GameCharacter. я предлагаю вам вернуть значение true/false, которое указывает, что символ все еще жив. или создать перечисление. если вы пойдете таким путем, у вас будет много состояний (живых, почти-мертвых)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню