簡體   English   中英

循環不會停止

[英]A loop won't stop

我正在嘗試為學校項目制作RPG。 擊敗老板后游戲結束。您可以在挑戰老板之前訓練和打亂隨機的怪物。 我現在遇到的問題是,fight方法中的循環不會停止。

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

}

也許我讀錯了,但似乎攻擊方法並沒有真正降低健康水平。

  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或敵人Health。 例如 :

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

問題

好吧,這里的確切問題是,正如您提到的,斗爭方法中的while循環會無限期地運行。

是什么導致此問題?

您while循環條件始終是真實的為playerHealthenemyHealth值保持不變。

while(bothAreAlive(playerHealth, enemyHealth))

在情況下,如果你認為,經過playerHealthenemyHealth作為參數來攻擊方法會改變自己的價值,這是錯誤的。 Java嚴格按值傳遞,並且因為int是原始類型,所以它在方法本地(將復制的值傳遞給該方法)。

請注意,您的攻擊方法將返回新的健康狀況dHealth而不會返回您使用它的位置。 只需將返回的值playerHealthenemyHealth適當的,而且會做的伎倆。

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM