-1

基本的に、さまざまなシナリオで同じ数行を使用するコードがあり、コードが少し乱雑になります (特に、作成したものを複雑にしすぎた可能性がありますが、それは別の問題です)。私がやりたかったのは、そのコードを別の関数として保存し、それを長い方の関数で呼び出すことです。私が知る限り、これは機能するはずですが、長い関数には短い関数に設定されていない変数があり、それらが設定されている場合、関数の最終結果が変わると確信しています。

より長いコードは次のとおりです。

    public static void combat(Character a,Character b){
int battleturn = 1;
int maxTurns=20;
int draw1 = 0;
//stop after 20 turns, or stop when one player has 0 HP.
while (a.health > 0 && b.health > 0 && maxTurns > 0){
    /* run a round of combat*/
    if (b.health < 0.25 * b.maxHealth){
    if (b.getFlee(a)){
        System.out.println(">>>>>>>>>>The enemy has fled successfully<<<<<<<<<<");
        break;
    }else{
        System.out.println("Battle turn " + battleturn + ", <attack> or <flee>?");
        Scanner input = new
        Scanner(System.in);
        String move = input.next();
        while(!move.equals("attack") && !move.equals("flee")){
        System.out.println("Error: Please input <attack> or <flee>.");
        input = new Scanner(System.in);
        move = input.next();
        }
        if (move.equals("attack")){
        System.out.println(a.name + " dealt " + a.combatRound(b) + " damage to " + b.name + "." + " Enemy has " 
                   + b.getHealth() + "/" + b.getMaxHealth() + " health.");   
        System.out.println(b.name + " dealt " + b.combatRound(a) + " damage to " + a.name + "." + " You have " +
                   a.getHealth() + "/" + a.getMaxHealth() + " health");
        maxTurns--;
        battleturn++;
        }else if(move.equals("flee")){
        if (a.getFlee(b)){
            draw1++;
            System.out.println(">>>>>>>>>>You have fled!<<<<<<<<<<");
            break;
        }else{
            System.out.println(a.name + " dealt " + a.combatRound(b) + " damage to " + b.name + "." + " Enemy has " +
                       b.getHealth() + "/" + b.getMaxHealth() + " health.");         
            System.out.println(b.name + " dealt " + b.combatRound(a) + " damage to " + a.name + "." + " You have " +
                       a.getHealth() + "/" + a.getMaxHealth() + " health");  
            maxTurns--;
            battleturn++;
        }
        }
    }

    }else{
    System.out.println("Battle turn " + battleturn + ", <attack> or <flee>?");
    Scanner input = new
        Scanner(System.in);
    String move = input.next();
        while(!move.equals("attack") && !move.equals("flee")){
        System.out.println("Error: Please input <attack> or <flee>.");
        input = new Scanner(System.in);
        move = input.next();
    }
    if (move.equals("attack")){
        System.out.println(a.name + " dealt " + a.combatRound(b) + " damage to " + b.name+  "." + " Enemy has " +
                   b.getHealth() + "/" + b.getMaxHealth() + "health.");  
        System.out.println(b.name + " dealt " + b.combatRound(a) + " damage to " + a.name + "." + " You have " +
                   a.getHealth() + "/" + a.getMaxHealth() + " health");  
        maxTurns--;
        battleturn++;
    }else if(move.equals("flee")){
        if (a.getFlee(b)){
        draw1++;
        System.out.println(">>>>>>>>>>You have fled!<<<<<<<<<<");
        break;
        }else{
        System.out.println(a.name + " dealt " + a.combatRound(b) + " damage to " + b.name+ "." + " Enemy has " +
                   b.getHealth() + "/" + b.getMaxHealth() + " health.");     
        System.out.println(b.name + " dealt " + b.combatRound(a) + " damage to " + a.name + "." + " You have " +
                   a.getHealth() + "/" + a.getMaxHealth() + " health");  
        maxTurns--;
        battleturn++;
        }
    }
    }
}
}

ご覧のとおり、コードの一部が繰り返されています。

System.out.println("Battle turn " + battleturn + ", <attack> or <flee>?");
        Scanner input = new
        Scanner(System.in);
        String move = input.next();
        while(!move.equals("attack") && !move.equals("flee")){
        System.out.println("Error: Please input <attack> or <flee>.");
        input = new Scanner(System.in);
        move = input.next();
        }
        if (move.equals("attack")){
        System.out.println(a.name + " dealt " + a.combatRound(b) + " damage to " + b.name + "." + " Enemy has " 
                   + b.getHealth() + "/" + b.getMaxHealth() + " health.");   
        System.out.println(b.name + " dealt " + b.combatRound(a) + " damage to " + a.name + "." + " You have " +
                   a.getHealth() + "/" + a.getMaxHealth() + " health");
        maxTurns--;
        battleturn++;
        }else if(move.equals("flee")){
        if (a.getFlee(b)){
            draw1++;
            System.out.println(">>>>>>>>>>You have fled!<<<<<<<<<<");
            break;
        }else{
            System.out.println(a.name + " dealt " + a.combatRound(b) + " damage to " + b.name + "." + " Enemy has " +
                       b.getHealth() + "/" + b.getMaxHealth() + " health.");         
            System.out.println(b.name + " dealt " + b.combatRound(a) + " damage to " + a.name + "." + " You have " +
                       a.getHealth() + "/" + a.getMaxHealth() + " health");  
            maxTurns--;
            battleturn++;
        }
        }
    }

そのコードのチャンクをメソッドとして設定すると、変数 Battleturn、maxturns、draw1 がないためコンパイルされませんが、それらをそこに入れると、戦闘の量が台無しになります。

何か案は?

4

2 に答える 2

0

これは、あなたがやろうとしていることを達成するのに役立つかもしれません.

private static void reportDamage(Character a,
      Character b) {
    System.out.println(a.name + " dealt "
      + a.combatRound(b) + " damage to " + b.name
      + "." + " Enemy has " + b.getHealth() + "/"
      + b.getMaxHealth() + " health.");
}

このように戦闘方法を変更することをお勧めします。

int battleturn = 0;
int maxTurns = 20;
// stop after 20 turns, or stop when one player has 0
// HP.
Scanner input = new Scanner(System.in);
try {
  while (a.health > 0 && b.health > 0
      && battleturn < maxturn) {
    battleturn++;
    /* run a round of combat */
    if (b.getFlee(a)) {
      System.out.println(">>>>>>>>>>"
          + "The enemy has fled successfully"
          + "<<<<<<<<<<");
      break;
    } else {
      System.out.println("Battle turn "
          + battleturn + ", <attack> or <flee>?");

      boolean isFlee = false;
      boolean isAttack = false;
      String move = input.next();
      for (;;) {
        isAttack = "attack".equalsIgnoreCase(move);
        isFlee = "flee".equalsIgnoreCase(move);
        if (isFlee || isAttack) {
          break;
        }
        System.out.println("Error: "
            + "Please input <attack> or <flee>.");
        move = input.next();
      }
      if (isAttack) {
        reportDamage(a, b);
        reportDamage(b, a);
      } else { // isFlee
        if (a.getFlee(b)) {
          System.out.println(">>>>>>>>>>"
              + "You have fled successfully"
              + "<<<<<<<<<<");
          break;
        } else {
          // b is fleeing.
          // reportDamage(a, b);
          reportDamage(b, a);
        }
      }
    }
  }
} finally {
  input.close();
}
于 2013-11-11T04:18:00.940 に答える
0

Java アプリケーションはモジュール化する必要があります。各クラスは独自の機能を実行し、各メソッドは通常 1 つの操作を実行します。

メソッドでは、クラス変数または独自のローカル変数のいずれかを使用できます。

複数のメソッドが同じデータで動作する必要がある場合は、クラス (インスタンスおよび/または静的変数) の一部にするか、パラメーターとして各メソッドに渡す必要があります。

メソッドでクラス変数を定義しないようにしてください。これにより、クラス変数をシャドウするローカル変数が作成されます。

于 2013-11-11T04:06:04.813 に答える