1
これは私が尋ねた以前の質問との続きですが、私はAP Javaクラスの最終プロジェクトとして作っているこの小さなアドベンチャーゲームの一部で助けが必要です。
私の冒険では、特定の場所にいる場合、さまざまなモンスターと戦うことができる機能があります。私の問題は、プログラム内でこの位置に到達すると、プログラムが応答を停止することです。
デバッグをした後、だとわかりましたが、の方法では、doBattle()
メソッドのすべてを実行していましたが、player.isAlive
とenemy.isAlive
のループはありません。唯一の問題は、ループの間にを削除すると、プログラムはモンスターが死んでいるか、プレイヤーが死んでいる間に右にジャンプしますが、モンスターを攻撃するかどうかを繰り返し選択する必要がありますいずれかのエンティティが死んでいる。この無限ループをどのように修正できますか?
public void doBattle(Monster enemy)
{
//boolean fled = false;
//Greets player into battle by telling what monster they are fighting
text.appendText("\n" + "A wild " + enemy.getName() + " has appeared!" + "\n");
mobImagePane.setImage(enemy.getImage());
//System.out.print("THIS RAN"); //debug
while (p.getHealth() > 0 && enemy.getHealth() > 0) //while enemy and player are alive
{
//Prompts user to attack or run
text.appendText("Attack " + enemy.getName() + "? (Y/N) " + "\n");
inputText.setOnAction(event ->
{
String fightChoice = inputText.getText();
fightChoice = fightChoice.toUpperCase();
//String fightChoice = this.choice;
if (fightChoice.equals("Y"))//if they want to fight
{
//Player turn
enemy.setHealth(enemy.getHealth() - p.getDamage()); //Sets the monsters health as their current health minus the players damage
text.appendText("You attack " + enemy.getName() + " for " + p.getDamage() + " damage!" + "\n" + "Enemy health is " + enemy.getHealth() + "\n");
//Monster turn
p.setHealth(p.getHealth() - enemy.getDamage()); //Sets the players health as their current health minus the monsters damage
text.appendText("The " + enemy.getName() + " hit you for " + enemy.getDamage() + " damage!" + "\n" + "Your health is " + p.getHealth() + "\n"); //prints how much damage the monster does to the player
if (p.health < 20.0) {
text.appendText("Your health is low, you should return home and restore health!" + "\n");
}
//checks if the player or monster is dead
this.checkLife();
enemy.checkLife();
} else {
if (fightChoice.equals("N")) // if they don't want to fight
{
mobImagePane.setImage(null);
text.appendText("You fled from the fight!" + "\n");
this.setNewLoc("TOWN"); // brings you back to town
fled = true;
//JOptionPane.showMessageDialog(null, "You are now in " + this.currentLoc.getName() + "\n" + this.currentLoc.getDescription());
//String move2 = JOptionPane.showInputDialog(null,"Which way do you want to go? (N, E, S, W)");
//makeMove(move2);
//break;
} else // they don't make any sense
{
text.appendText("Unrecognized command" + "\n");
}
}
//}
//when someone dies
if (!fled) {
if (p.alive) // if you are still standing
{
//print results (money earned, health remaining)
mobImagePane.setImage(null);
p.wallet += enemy.getLoot();
playerInfo.setText(p.getPlayerName() + "\n" + "Health: " + p.getHealth() + "\n" + "Wallet: " + p.getWallet() + "\n");
text.setText("You shrekt the " + enemy.getName() + "\n" + "You got $" + enemy.getLoot() + " for winning!" + "\n" + "You now have $" + p.wallet + "\nYour health is " + p.getHealth() + "\n");
} else //if you died
{
mobImagePane.setImage(null);
text.setText("You have been shrekt by the " + enemy.getName() + "\n" + "GAME OVER" + "\n");
text.appendText("\nPlay again? (Y/N)" + "\n");
inputText.setOnAction(event2 -> {
String answer = inputText.getText();
answer.toUpperCase();
//String answer = this.choice;
if (answer.equals("Y")) //if they want to play again
{
text.appendText("Alright! Let's go!" + "\n");
this.reset();
} else //if they want to quit
{
text.appendText("Wow. What a skrub, okay bye." + "\n");
System.out.close();
}
});
}
}
});
}
} //end doBattle
ので、あなたがより多くの情報か何かが必要な場合は私に知らせてください、私はこのサイトに新しい、およびJavaに幾分新しいです覚えておいてください:ここで
はdoBattle()メソッドのコードです他に良い提案を得るのを助けるために、すべての助けに感謝します。
また、なぜ私に言っても、この種のことをより良くしたいと思うことなく、downvoteをしないでください。
私も、私はこのためにJavaFXのを使用していますことを言及すべきである、とテキストはTextArea
とのinputTextあなたはあなたのコードが実行される方法を誤解しているように見えるTextField
私はそれがゲームプレイのログを取得するのに役立つと思います。何が期待され、何を得たのか。 – UDKOX
私は疑問を持っています:あなたはループを入力し、**あなたの "ゲームプレイ"を実行するために入力のイベントハンドラを設定します。これは、停止したUIのように見える非常に小さな実行ループにつながります。 – Fildor
@Fildor @UDKOXプレイヤーとモンスターの合意と '.toString();'は、進行中に変数を設定します。このコードは読みにくく、かなり混乱します。小さなwhileループと複数のハンドリング方法でなければならないように感じる。もし彼がそれを再構成してそれを掃除すれば、彼は自然に誤りを見つけるかもしれない。 ... Fildor良いキャッチ!どこでループがブロックされているのか、待っているのか、ラッチしているのか分からないのですか?イベントコードをwhileループの外に移動すべきである(SHOULD)。イベント登録はそのように何度も繰り返す必要はない。 – Underbalanced