2017-02-12 5 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 к способу, присвоить ему новое значение в методе и увидеть переменную, передаваемую методу с изменением.
Таким образом, playerHealth и enemyHealth никогда не обновляются в методе fight().

attack() метод вы звоните в методе fight():

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

возвращает левое здоровье атакуемого человека: игрок или враждебного.
Таким образом, вы можете присвоить возвращаемое значение игроку или здоровью врага в зависимости от того, на кого нападают. Например:

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

В случае, если вы думали, что, проходя playerHealth и enemyHealth в качестве параметра для атаки метод изменит свое значение, то это неправильно. Java строго передается по значению и поскольку int является примитивным типом, он локален для метода (скопированное значение передается методу).

Решение

Обратите внимание, что ваш метод атаки возвращает новое здоровье dHealth и не где вы используете его. Просто присвойте возвращаемое значение playerHealth и enemyHealth соответственно, и это будет делать трюк.

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

и

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