Java Combat Simulator - я хочу смоделировать 1000 боев, чтобы отслеживать, сколько раз герой выигрывает / проигрывает - PullRequest
1 голос
/ 14 марта 2019

Я действительно новичок в мире Java, и я сейчас учусь, IFs / FORs / WHILEs и так далее.Чтобы сохранить интерес к предмету, я позволил своей стороне зануда освободиться:)

Я хочу смоделировать 1000 боев между Героем и Гоблином.Оба имеют свои характеристики и бросок d20, чтобы определить, попали ли они ((d20 + бонус)> вражеская броня).Если они бьют, они наносят соответствующий урон и продолжают обмениваться взрывами, пока один из них не умрет.Каждый раз, когда HP гоблинов падает ниже 0, герой получает «победу», в противном случае он получает «поражение».

Симуляция прерывается, когда цикл повторяется в течение 1000 игр, показывая, сколько побед и пораженийу героя было.

Это мой ошибочный код. Он продолжает бесконечно подсчитывать количество побед, не сбрасывая HP гоблинов и героев, также не считая количество поражений.Может ли кто-нибудь использовать простые конструкции, чтобы помочь мне понять, где я ошибаюсь?

import java.util.Random;
public class Random2 {
    public static void main(String[] args) {

        Random rand = new Random();

        int wins = 0, defeats = 0;
        int hpHero = 20, armorHero = 8, dmgHero = 4, bonusHero = 1;
        int hpGoblin = 10, armorGoblin = 5, dmgGoblin = 3, bonusGoblin = 1;

        for (int played = 0; played <= 1000; played++) {

            while (hpHero > 0 || hpGoblin > 0) {
                int d20Hero = rand.nextInt(19);
                d20Hero += 1;

                if ((bonusHero + d20Hero) > armorGoblin) {
                    System.out.println("You hit the goblin with a die result of " + (bonusHero + d20Hero));
                    hpGoblin -= dmgHero;
                    System.out.println("HP Goblin: " + hpGoblin);
                    if (hpGoblin > 0) {
                        int d20Goblin = rand.nextInt(19);
                        d20Goblin += 1;

                        if ((bonusGoblin + d20Goblin) > armorHero) {
                            System.out.println("Goblin hit the human with a die result of " + (bonusGoblin + d20Goblin));
                            hpHero -= dmgGoblin;
                            System.out.println("HP Hero: " + hpHero);

                            if (hpHero < 1) {
                                defeats++;
                                System.out.println("Defeats are: " + defeats);
                            }
                        }
                    } else {
                        wins++;
                        System.out.println("Wins are: " + wins);
                    }
                }


            }
        }

    }
}

Ответы [ 2 ]

1 голос
/ 14 марта 2019

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

    for (int played = 0; played <= 1000; played++) {
        hpHero = 20;
        hpGoblin = 10;
        while (hpHero > 0 || hpGoblin > 0) {

Я думаю, что может быть больше проблем, чем это, однако.

0 голосов
/ 14 марта 2019

Я пытался изменить ваш код как можно меньше, однако я бы порекомендовал потратить некоторое время и переосмыслить его, потому что он немного сложнее.

Две вещи, которые я заметил,

  • вы никогда не сбросите HP бойцов
  • атака гоблина зависит от атаки героя (вложенная, если означает, что гоблин не будет атаковать, если у героя не будет успешной атаки)

Вот обновленная версия

public class Random2 {

  public static void main(String[] args) {

    Random rand = new Random();

    int wins = 0, defeats = 0;
    int armorHero = 8, dmgHero = 4, bonusHero = 1;
    int armorGoblin = 5, dmgGoblin = 3, bonusGoblin = 1;

    // fight 1000 times
    for (int played = 0; played <= 1000; played++) {
      // start with full stats after each fight
      int hpHero = 20;
      int hpGoblin = 10;

      // while both combatants are still alive
      while (hpHero > 0 || hpGoblin > 0) {
        // hero rolls
        int d20Hero = rand.nextInt(19);
        d20Hero += 1;
        // if hero can hit then do the dmg
        if ((bonusHero + d20Hero) > armorGoblin) {
          System.out.println("You hit the goblin with a die result of " + (bonusHero + d20Hero));
          hpGoblin -= dmgHero;
          System.out.println("HP Goblin: " + hpGoblin);
        }

        // if the goblin is still alive then it rolls
        if (hpGoblin > 0) {
          int d20Goblin = rand.nextInt(19);
          d20Goblin += 1;

          // if the goblin can hit then do the dmg
          if ((bonusGoblin + d20Goblin) > armorHero) {
            System.out.println("Goblin hit the human with a die result of " + (bonusGoblin + d20Goblin));
            hpHero -= dmgGoblin;
            System.out.println("HP Hero: " + hpHero);

            // if hero died then count defeat
            if (hpHero < 1) {
              defeats++;
              System.out.println("Defeats are: " + defeats);
            }
          }
        } else { // if goblin did not survive then count a win for the hero
          wins++;
          System.out.println("Wins are: " + wins);
        }
      }
    }
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...