繁体   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