[英]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
傳遞給方法,不能在方法中為其分配新值,也無法查看更改后傳遞給方法的變量。
所以playerHealth
和enemyHealth
永遠不會在更新的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循環條件始終是真實的為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);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.