2016-12-28 8 views
1

私は現在、somekindテキストベースの 'RPG'ゲームに取り組んでいます。私は2つのクラスを作った。最初はある町から別の町への道をシミュレートすることになっているので、プレイヤーが敵に遭遇する可能性がある。ファイティング・ロジックは別のクラスに置かれ、プレイヤーが死んだときに前回のセーブからゲームをロードするか、新しいキャラクターを作成するメソッドが呼び出され、完璧に機能しますが、ループを破る代わりにプレイヤーが死亡した場合でも、 LeaveTownクラスは次のようになります。あなたが見ることができるように別のクラスからのブレイクループ

public class WorldMap { 
boolean running=true; 
public void leaveTown(Character character){ 
    EnemyFactory factory = new EnemyFactory(); 
    PerformAtack atack = new PerformAtack(); 
    StringBuilder sb = new StringBuilder(); 
    Random random = new Random(); 
    int progress = 0; 
    while(running && progress!=100){ 
     try { 
      System.out.print(sb.append("#")); 
      System.out.println(progress+"%"); 
      if (random.nextDouble() * 10 < 2) { 
       atack.performFight(character,factory.generateRandomEnemy()); 
      } 
      Thread.sleep(500); 
     }catch(Exception ex){} 
     progress = progress+5; 
    } 
} 
} 

実行されている変数がfalseや道路に設定されている場合破ることになっているループが終了している間、私が使用しています。文字は、私はメソッドを呼び出すbattleLost死亡した場合:

private void battleLost(Character character){ 
    WorldMap map = new WorldMap(); 
    System.out.println("You are dead.\nWould you like to try AGAIN or LOAD your last save"); 
    System.out.println("Please type AGAIN or LOAD"); 
    while(true) { 
     String choice = sc.nextLine().toUpperCase(); 
     if (choice.equals("AGAIN")) { 
      map.running = false; 
      System.out.println("Create new character?"); 
      break; 
     } else if (choice.equals("LOAD")) { 
      map.running = false; 
      save.readFromFile(); 
      break; 
     } else 
      System.out.println("Try again."); 

    } 
} 

この方法設定をfalseにクラス世界地図内の変数を実行しているが、whileループではなく、破壊の継続しました。私が気づいている問題は、おそらくmap.running = false;を間違った方法で使用することに関連していることに気付いています。 誰かがこの問題をどのように解決すべきか説明できたらうれしいです。

答えて

1
boolean running=true; 

にこの変数はCharacterクラスの一部でなければなりません。死んだとき、あなたはfalseにそれを更新することができperformFight内、

while(character.isRunning() && progress!=100) 

と:

そして、あなたのwhileはただのようになります。まあ

+0

ありがとうございました。とても有難い。 – BednarQ

1

battleLost()PerformAtackクラスに属していますね。したがって、ローカル変数mapbattleLost()の中にあり、道路を制御しているオブジェクトには影響しません。

あなたは二つのことを行うことができます。

  1. running静的(およびパブリック)を作成し、その後、あなたはこのWolrdMap.runnning = falseのようなクラス名でどこからでも参照することができますが、あなたは物事を行うことにした場合、この解決策は、問題を抱えています並行して(例えば、複数のスレッド)。 Remmeber:スタティックデータは、マルチスレッド設計の場合、ほとんど常に落とし穴です!

  2. より良い解決策はatack.performFightにするブール値を返し、running VARにその値を割り当てることです:running = atack.performFight(...これは、スレッドの安全性の面でより良いデザインですが、あなたはbattleLost()からブール値を伝播する必要があります(それあまりにも) `performFight(へ)ブール値を返す必要があります」とそう

+0

Characterクラスに 'boolean running'を置くことにしましたが、それにもかかわらず、あなたの助けと説明に感謝しますn。 – BednarQ

1

、あなたはその

private void battleLost(Character character){ 
WorldMap map = new WorldMap(); 
System.out.println("You are dead.\nWould you like to try AGAIN or LOAD your last save"); 
System.out.println("Please type AGAIN or LOAD"); 
while(WorldMap.running) { 
    String choice = sc.nextLine().toUpperCase(); 
    if (choice.equals("AGAIN")) { 
     map.running = false; 
     System.out.println("Create new character?"); 
     break; 
    } else if (choice.equals("LOAD")) { 
     map.running = false; 
     save.readFromFile(); 
     break; 
    } else 
     System.out.println("Try again."); 

} 
public void breakTheLoop(){ 
WorldMap.running=false; 
} 
ような何かを、ループを断ち切るためにインスタンスを作成せずにこの変数をfalseに変更することができなかった後、変数 boolean running=true; public static boolean running=true;

のアクセス修飾子を変更

staticのためにクラス変数ですので、値はすべてのクラス間で共有されます