Как отслеживать переменную при сортировке в списке? (Риск-игра) - PullRequest
0 голосов
/ 01 мая 2018

В настоящее время я пишу Risk-игру на Java и пытаюсь атаковать часть кода.

Для тех из вас, кто не знает, как работает ход атаки в игре на риск, я кратко объясню: здесь мы находимся в случае, когда атакующий использует 3 отряда для атаки на противостоящую территорию с 2 отрядами для ее защиты , За каждое подразделение, участвующее в бою, будет брошен кубик. Таким образом, это означает, что атакующий собирается бросить 3 кубика, а защитник - 2 кубика. Затем цель состоит в том, чтобы сохранить 3 значения кубиков атакующего, расположить их в порядке убывания, затем сделать то же самое для 2 значений защитника и сравнить два списка, чтобы определить, кто выиграл, а кто проиграл бой (для Дополнительную информацию о том, как работает атака риска, пожалуйста, проверьте на этом сайте: https://www.wikihow.com/Play-Risk)

Теперь возникает проблема. В моей игре на риск у меня есть 3 различных типа юнитов: стрелок (в моем коде карабинер, потому что я француз), десантник и стрелок. Во время боя единственное важное различие между этими 3 юнитами состоит в том, что границы игральных костей различны: - Стрелок: кости будут катиться от 1 до 6 включительно - Десантник: от 2 до 7 в комплекте - Стрелок: от 4 до 9 включительно.

То есть у стрелка больше шансов выиграть бой.

В моем классе игры в кости есть два важных метода: первый - это бросание кости и возвращение результата:

public int resultatdes (){
    //borneinf = lower possible value of the dice
    //bornesup = higher possible value of the dice

    int resultat = 0;
    Random rand = new Random();
    resultat = rand.nextInt(this.bornesup) + this.borneinf ; 
    return resultat;

} 

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

Случай, когда атакующий использует 1 стрелка, 1 десантника и 1 стрелка:

public void resultat_combat(ArrayList<Integer> attaque, ArrayList<Integer> defense ){
    //a1 = number of rifleman for the attacker
    //a2 = number of paratrooper for the attacker
    //a3 = number of gunner for the attacker
    //d1, d2, d3 are the same but for the defender

    attaque.addAll(Arrays.asList(a1, a2, a3));
    defense.addAll(Arrays.asList(d1, d2, d3));


    if (a1 + a2 + a3 == 3 && a1 == 1 && a2 ==1 && a3 == 1){

        Des de1 = new Des(1,6); //creating dice for the rifleman
        Des de2 = new Des(2,7); //creating dice for the paratrooper
        Des de3 = new Des(4,9); //creating dice for the gunner
        int a = de1.resultatdes(); //rolling the dices
        int b = de2.resultatdes();
        int c = de3.resultatdes();
        //Here there should be a code to store the results in a list, order it in decreasing order and compare it to the defense list
    }

То же самое, но для защитника, где он защищается двумя стрелками:

if (d1 + d2 + d3 == 2 && d1==2){

        Des de4 = new Des(1,6);
        Des de5 = new Des(1,6);
        int d = de4.resultatdes();
        int e = de5.resultatdes();
}

МОЙ ВЫПУСК: Когда я храню результаты игры в кости в списке или в таблице, я знаю, что первое значение в списке - это одно из стрелка, второе - у десантника, а третье - у стрелка. НО, когда я сортирую список в порядке убывания, я теряю след, какой результат игры в кости соответствует какой единице. Поэтому я могу сказать, кто выиграл между кубиком атакующего и кубиком защитника, но я не могу знать, какой тип юнита погиб, потому что я не могу связать значение кубика, отсортированного в списке, с юнитом.

Вы знаете, как это сделать?

Заранее спасибо, что нашли время прочитать этот длинный вопрос, я старался быть максимально ясным, хотя английский не является моим родным языком.

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Как следует из другого ответа, в ОО-программе будут классы, представляющие разные объекты в домене.

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

Во-первых, мы можем создать Enum для представления типов:

public enum UnitType {

    RIFLEMAN, PARATROOPER, GUNNER;
}

Тогда мы можем создать класс для захвата результата броска. Это сохраняет результат броска и связанный с ним тип и реализует интерфейс java.lang.Comparable, поэтому мы можем использовать Collections.sort () без указания компаратора;

public class DiceRollResult implements Comparable<DiceRollResult> {

    private UnitType unitType;
    private int result;

    public DiceRollResult(UnitType unitType, int result) {
        this.unitType = unitType;
        this.result = result;
    }

    public UnitType getUnitType() {
        return unitType;
    }

    public int getResult() {
        return result;
    }

    @Override
    public int compareTo(DiceRollResult other) {
        return this.result - other.result;
    }
}

A Тестовый класс:

public class DiceRollResultTest {

    public static void main(String[] args) {
        List<DiceRollResult> results = new ArrayList<>();

        results.add(new DiceRollResult(UnitType.GUNNER, new 
                  Random().nextInt(6)));

        results.add(new DiceRollResult(UnitType.PARATROOPER, new 
                  Random().nextInt(6)));

        results.add(new DiceRollResult(UnitType.RIFLEMAN, new 
                  Random().nextInt(6)));

        Collections.sort(results);

        for (int i = 0; i < results.size(); ++i) {
            System.out.println("The result at position " + i + " is " + 
                 results.get(i).getResult() + " for "
                    + results.get(i).getUnitType());
        }
    }
}
0 голосов
/ 01 мая 2018

Вам нужно изменить дизайн ваших сущностей.

Иметь интерфейс Troop и реализовывать различные типы войск, которые у вас есть.

Иметь класс Player, чтобы иметь список интерфейсов Troop.

Имейте метод attack на Player.

Поскольку Troop сам реализует поведение, вы можете удалить самый нижний элемент, и поведение других элементов отряда будет неизменным, и, следовательно, вам не нужно будет отслеживать тип отряда в другом месте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...