2017-02-12 2 views
0

Ich versuche, ein RPG für ein Schulprojekt zu machen. Das Spiel endet, wenn Sie den Boss besiegen. Sie können zufällige Monster trainieren und bekämpfen, bevor Sie den Boss herausfordern. Das Problem, das ich gerade habe, ist, dass die Schleife in der Kampfmethode nicht aufhört.Eine Schleife wird nicht aufhören

import java.util.Scanner; 
import java.util.Random; 

public class A{ 
public static void main(String []args){ 
    Scanner get = new Scanner(System.in); 
    Random rng = new Random(); 

    int day = 0; 
    int choice; 
    String playerName; 

    int playerHealth = 10; int playerAttack = 5; int playerDefense = 5; 
    int boss1Health = 1000; int boss1Attack = 900; int boss1Defense = 900; 
    int slimeHealth = 100; int slimeAttack = 20; int slimeDefense = 20; 
    int goblinHealth = 80; int goblinAttack = 40; int goblinDefense = 10; 

    System.out.print("What is your name? "); 
    playerName = get.next(); 
    System.out.println("...Welcome, " + playerName); 

    while(bothAreAlive(playerHealth, boss1Health)){ 
     ++day; 
     while(true){ 
      action(day); 
      choice = get.nextInt(); 
      if(choice == 1){ 
       fight(playerName, playerHealth, playerAttack, playerDefense, "Skeleton King", boss1Health, boss1Attack, boss1Defense); 
       break; 
      } 
      if(choice == 2){ 
       int encounter = rng.nextInt(2); 
       if(encounter == 0){ 
        slimeHealth = 100; 
        fight(playerName, playerHealth, playerAttack, playerDefense, "Slime", slimeHealth, slimeAttack, slimeDefense); 
       } 
       else if(encounter == 1){ 
        goblinHealth = 80; 
        fight(playerName, playerHealth, playerAttack, playerDefense, "Goblin", goblinHealth, goblinAttack, goblinDefense); 
       } 
       break; 
      } 
      if(choice == 3){ 
       playerHealth += 10; 
       playerAttack += 5; 
       playerDefense += 5; 
       break; 
      } 
      if(choice == 4){ 
       showStats(playerName, playerHealth, playerAttack, playerDefense); 
      } 
     } 
    } 
} 

public static int attack(String attacker, String defender, int aAttack, int dDefense, int dHealth){ 
    int damage = Math.max(0, aAttack - dDefense); 
    System.out.println("\n" + attacker + " did " + damage + " damage to " + defender + "."); 
    dHealth = dHealth - damage; 
    System.out.println("\n" + defender + "'s health is now " + dHealth); 
    return dHealth; 
} 

public static int fight(String playerName, int playerHealth, int playerAttack, int playerDefense, String enemyName, int enemyHealth, int enemyAttack, int enemyDefense){ 
    Random rng = new Random(); 
    while(bothAreAlive(playerHealth, enemyHealth)){ 
     int playerChance = rng.nextInt(5); 
     int enemyChance = rng.nextInt(5); 
     if(enemyChance > 1){ 
      attack(enemyName, playerName, enemyAttack, playerDefense, playerHealth); 
     } 
     else{ 
      System.out.println("\n" + enemyName + " missed!"); 
     } 
     if(playerChance > 1){ 
      attack(playerName, enemyName, playerAttack, enemyDefense, enemyHealth); 
     } 
     else{ 
      System.out.println("\n" + playerName + " missed!"); 
     } 
    } 
    if(enemyHealth >= 0){ 
     System.out.println(enemyName + " has won..."); 
    } 
    else if(playerHealth >= 0){ 
     System.out.println("You have won!"); 
    } 
    return enemyHealth; 
} 

private static boolean bothAreAlive(int yourHealth, int enemyHealth){ 
    return yourHealth > 0 && enemyHealth > 0; 
} 

public static void action(int day){ 
    System.out.println("Day: " + day); 
    System.out.println("\nWhat will you do today?\n(1)Fight boss\n(2)Fight random monster\n(3)Train\n(4)Show stats"); 
} 

public static void showStats(String playerName, int health, int attack, int defense){ 
    System.out.println("Name: " + playerName); 
    System.out.println("Health: " + health); 
    System.out.println("Attack: " + attack); 
    System.out.println("Defense: " + defense); 
} 

}

Antwort

0

Vielleicht lese ich falsch, aber es scheint, dass die Angriffsmethode das Gesundheitsniveau nicht wirklich abnimmt.

0
while(bothAreAlive(playerHealth, enemyHealth)){ 
     int playerChance = rng.nextInt(5); 
     int enemyChance = rng.nextInt(5); 
     if(enemyChance > 1){ 
      attack(enemyName, playerName, enemyAttack, playerDefense, playerHealth); 
     } 
     else{ 
      System.out.println("\n" + enemyName + " missed!"); 
     } 
     if(playerChance > 1){ 
      attack(playerName, enemyName, playerAttack, enemyDefense, enemyHealth); 
     } 
     else{ 
      System.out.println("\n" + playerName + " missed!"); 
     } 
    } 

In Java können Sie keine int an eine Methode übergeben, um es einen neuen Wert in der Methode zuweisen und die Variable die Methode mit der Änderung übergeben sehen.
So playerHealth und enemyHealth werden nie in der fight() Methode aktualisiert.

Die attack() Methode, die Sie in der fight() Methode aufrufen:

public static int attack(String attacker, String defender, int aAttack, int dDefense, int dHealth){ 

gibt die linke Gesundheit des angegriffenen Person: Spieler oder Feind.
So können Sie den zurückgegebenen Wert PlayerHealth oder enemyHealth je nachdem, wer angegriffen wird zuweisen. Zum Beispiel:

while(bothAreAlive(playerHealth, enemyHealth)){ 
     int playerChance = rng.nextInt(5); 
     int enemyChance = rng.nextInt(5); 
     if(enemyChance > 1){ 
      playerHealth = attack(enemyName, playerName, enemyAttack, playerDefense, playerHealth); 
     } 
     else{ 
      System.out.println("\n" + enemyName + " missed!"); 
     } 
     if(playerChance > 1){ 
      enemyHealth = attack(playerName, enemyName, playerAttack, enemyDefense, enemyHealth); 
     } 
     else{ 
      System.out.println("\n" + playerName + " missed!"); 
     } 
    } 
0

Problem

Nun, genau das Problem hier ist, wie Sie bereits erwähnt, auf unbestimmte Zeit die while-Schleife innerhalb Läufe Kampf Methode.

Was verursacht dieses Problem?

Bedingung in Ihrer While-Schleife ist immer wahr, da playerHealth, enemyHealth Werte unverändert bleiben.

while(bothAreAlive(playerHealth, enemyHealth)) 

Im Fall, wenn Sie dachten, dass, playerHealth und enemyHealth als Parameter Methode um ihren Wert attackieren wird sich ändern, das falsch ist. Java ist streng pass-by-value und da int ein primitiver Typ ist, ist es lokal für eine Methode (Ein kopierter Wert wird an die Methode übergeben).

Lösung

Beachten Sie, dass die neuen Gesundheits Ihre Angriffsmethode dHealth und nicht, wo Sie verwenden es zurückgibt. Ordnen Sie einfach den zurückgegebenen Wert playerHealth und enemyHealth entsprechend zu, und das würde den Trick tun.

playerHealth = attack(enemyName, playerName, enemyAttack, playerDefense, playerHealth); 

und

enemyHealth = attack(playerName, enemyName, playerAttack, enemyDefense, enemyHealth); 
Verwandte Themen