2016-05-23 10 views
1

これは私が尋ねた以前の質問との続きですが、私はAP Javaクラスの最終プロジェクトとして作っているこの小さなアドベンチャーゲームの一部で助けが必要です。
私の冒険では、特定の場所にいる場合、さまざまなモンスターと戦うことができる機能があります。私の問題は、プログラム内でこの位置に到達すると、プログラムが応答を停止することです。
デバッグをした後、だとわかりましたが、の方法では、doBattle()メソッドのすべてを実行していましたが、player.isAliveenemy.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

+1

私はそれがゲームプレイのログを取得するのに役立つと思います。何が期待され、何を得たのか。 – UDKOX

+1

私は疑問を持っています:あなたはループを入力し、**あなたの "ゲームプレイ"を実行するために入力のイベントハンドラを設定します。これは、停止したUIのように見える非常に小さな実行ループにつながります。 – Fildor

+0

@Fildor @UDKOXプレイヤーとモンスターの合意と '.toString();'は、進行中に変数を設定します。このコードは読みにくく、かなり混乱します。小さなwhileループと複数のハンドリング方法でなければならないように感じる。もし彼がそれを再構成してそれを掃除すれば、彼は自然に誤りを見つけるかもしれない。 ... Fildor良いキャッチ!どこでループがブロックされているのか、待っているのか、ラッチしているのか分からないのですか?イベントコードをwhileループの外に移動すべきである(SHOULD)。イベント登録はそのように何度も繰り返す必要はない。 – Underbalanced

答えて

関連する問題