2017-02-12 118 views
0

我正在尝试为学校项目制作RPG。游戏结束,当你击败老板。你可以训练和挑战老板之前随机怪物。我现在面临的问题是,战斗方法中的循环不会停止。循环不会停止

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); 
} 

}

回答

0

也许我读被错误,但它似乎是攻击方法是不是真的降低了健康水平。

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!"); 
     } 
    } 

在Java中,你不能传递一个int的方法,分配给它的方法一个新的价值,看到通过与变化的方法变量。
因此playerHealthenemyHealth永远不会在fight()方法中更新。

attack()方法,你在fight()方法调用:

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

返回袭击人的健康左:玩家或敌人。
因此,您可以根据受到攻击的人员将返回的值分配给playerHealth或enemyHealth。 例如:

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

问题

那么,在这里,正如你提到的,战斗方法运行里面的,而无限循环确切的问题。

导致此问题的原因是什么?

您的while循环中的条件始终为真,因为playerHealth,enemyHealth值保持不变。

while(bothAreAlive(playerHealth, enemyHealth)) 

在情况下,如果你认为,经过playerHealthenemyHealth作为参数来攻击方法会改变自己的价值,这是错误的。 Java严格按值传递,并且由于int是原始类型,它对于方法是本地的(将复制的值传递给方法)。

解决方案

需要注意的是,你的攻击方法返回新的健康dHealth没有你在哪里使用它。 只需简单地将返回值分配给playerHealthenemyHealth,那就可以了。

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

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