2017-02-16 12 views
2

ポケモンの人口の大規模な戦闘のシミュレーションを作成しようとしています。例を提供するために、私はpokemon1とpokemon2の2つのポケモンを使用します。私は、プログラムは次のように仕事をしたい:プログラムの実行中に突然停止する

  • pokemon1とpokemon2は、などの速度、攻撃、守備、としての基本属性、
  • のオフに基づいてスコアで自分のcombatScore、に基づいて比較されます
  • pokemon1とpokemon2がランダムにペアになり、比較されます。
  • pokemon1がpokemon2よりもcombatScoreの方が高い場合、pokemon1が次のラウンドに進んで(一般集団から除外され、「勝利」の集団に配置される)、pokemon2が一般集団から削除され、征服された "人口。
  • pokemon1は、pokemon2の特性に基づいていくつかの属性を取得します。
  • pokemon2(敗北)が伝説的である場合、最終的に正当な人口に追加される前に合計3回失う必要があります。
  • ポケモン1(勝利)が伝説的ではないが3回優勝した場合、それは伝説的なものになるので、正当な人口に追加される前に3回失う必要があります。

勝利者が1人しかいなくなるまで、勝利集団が少なくても少なくても、ラウンドが繰り返されます。

  1. 伝説のpokemon2伝説pokemon1
  2. を打つ:私はランダムにあれば、他の枝を使用異なる条件の数を集団から2ポケモンを取得し、それらをオフに基づいて比較されますがdo-whileループを作成している

    伝説のpokemon1を打つpokemon2
  3. 伝説のpokemon2ビートがpokemon1
を打つpokemon2
  • pokemon

    そしてその逆。私が実行している問題はこれです:ほとんどの場合、プログラムは正常に動作し、ラウンド1は完了です。すべての戦闘は、誰が勝ったかを明確に示すpokemon.txtファイルに書き込まれます。ただし、プログラムが実行されて実行状態になることがあります。 .txtファイルをチェックすると、同じ場所(275行目)を中心に文章の途中で書かれなくなります。

    今のところ、最初のラウンドを実行したいだけです。ここでは、このシミュレータを実行するコードは次のようになります。それは「永遠に」実行されている場合

    do { 
         Pokemon pokemon1; 
         Pokemon pokemon2; 
         pokemon1 = population.get((int) (Math.random() * population.size())); 
         do { 
          pokemon2 = population.get((int) (Math.random() * population.size())); 
         } while (pokemon1.getId() == pokemon2.getId()); 
    
    
         if (pokemon2.getCombatScore() > pokemon1.getCombatScore() 
           && pokemon2.isLegendary() && pokemon1.isLegendary()) { 
          bufferedWriter.write("The legendary " + pokemon2.getName() + " defeats the legendary " + 
            pokemon1.getName() + " with a combat score of " + pokemon2.getCombatScore() + "!"); 
          bufferedWriter.newLine(); 
    
          /* pokemon2 gains xp from winning */ 
          pokemon2.incAttack(pokemon1.getCombatScore()); 
          pokemon2.incDefense(pokemon1.getCombatScore()); 
          pokemon2.addVict(); 
    
          victorious.add(pokemon2); 
          population.remove(pokemon2); 
    
          pokemon1.addLoss(); 
    
          if (pokemon1.numLoss == 3) { 
           defeated.add(pokemon1); 
           population.remove(pokemon1); 
          } 
         } 
    
         else if (pokemon2.getCombatScore() > pokemon1.getCombatScore() 
           && pokemon1.isLegendary()) { 
          bufferedWriter.write(pokemon2.getName() + " defeats the legendary " + 
            pokemon1.getName() + " with a combat score of " + pokemon2.getCombatScore() + "!"); 
          bufferedWriter.newLine(); 
    
          /* pokemon2 gains xp from winning */ 
          pokemon2.incAttack(pokemon1.getCombatScore()); 
          pokemon2.incDefense(pokemon1.getCombatScore()); 
    
          pokemon2.addVict(); 
          if (pokemon2.numVict == 3) { 
           bufferedWriter.write(pokemon2.getName() + " has become legendary!"); 
          } 
    
          victorious.add(pokemon2); 
          population.remove(pokemon2); 
    
          pokemon1.addLoss(); 
          if (pokemon1.numLoss == 3) { 
           defeated.add(pokemon1); 
           population.remove(pokemon1); 
          } 
         } 
    
         else if (pokemon2.getCombatScore() > pokemon1.getCombatScore() 
           && pokemon2.isLegendary()) { 
          bufferedWriter.write("The legendary " + pokemon2.getName() + " defeats " + 
            pokemon1.getName() + " with a combat score of " + pokemon2.getCombatScore() + "!"); 
          bufferedWriter.newLine(); 
    
          /* pokemon2 gains xp from winning */ 
          pokemon2.incAttack(pokemon1.getCombatScore()); 
          pokemon2.incDefense(pokemon1.getCombatScore()); 
          pokemon2.addVict(); 
    
          victorious.add(pokemon2); 
          population.remove(pokemon2); 
    
          pokemon1.addLoss(); 
    
          defeated.add(pokemon1); 
          population.remove(pokemon1); 
         } 
         else if (pokemon2.getCombatScore() > pokemon1.getCombatScore()) { 
          bufferedWriter.write(pokemon2.getName() + " defeats " + 
            pokemon1.getName() + " with a combat score of " + pokemon2.getCombatScore() + "!"); 
          bufferedWriter.newLine(); 
    
          /* pokemon2 gains xp from winning */ 
          pokemon2.incAttack(pokemon1.getCombatScore()); 
          pokemon2.incDefense(pokemon1.getCombatScore()); 
    
          pokemon2.addVict(); 
          if (pokemon2.numVict == 3) { 
           bufferedWriter.write(pokemon2.getName() + " has become legendary!"); 
          } 
    
          victorious.add(pokemon2); 
          population.remove(pokemon2); 
    
          pokemon1.addLoss(); 
    
          defeated.add(pokemon1); 
          population.remove(pokemon1); 
         } 
         else if (pokemon1.getCombatScore() > pokemon2.getCombatScore() 
           && pokemon2.isLegendary() && pokemon1.isLegendary()) { 
          bufferedWriter.write("The legendary " + pokemon1.getName() + " defeats the legendary " + 
            pokemon2.getName() + " with a combat score of " + pokemon1.getCombatScore() + "!"); 
          bufferedWriter.newLine(); 
    
          /* pokemon2 gains xp from winning */ 
          pokemon1.incAttack(pokemon2.getCombatScore()); 
          pokemon1.incDefense(pokemon2.getCombatScore()); 
          pokemon1.addVict(); 
    
          victorious.add(pokemon1); 
          population.remove(pokemon1); 
    
          pokemon2.addLoss(); 
    
          if (pokemon2.numLoss == 3) { 
           defeated.add(pokemon2); 
           population.remove(pokemon2); 
          } 
         } 
    
         else if (pokemon1.getCombatScore() > pokemon2.getCombatScore() 
           && pokemon2.isLegendary()) { 
          bufferedWriter.write(pokemon1.getName() + " defeats the legendary " + 
            pokemon2.getName() + " with a combat score of " + pokemon1.getCombatScore() + "!"); 
          bufferedWriter.newLine(); 
    
          /* pokemon2 gains xp from winning */ 
          pokemon1.incAttack(pokemon2.getCombatScore()); 
          pokemon1.incDefense(pokemon2.getCombatScore()); 
    
          pokemon1.addVict(); 
          if (pokemon1.numVict == 3) { 
           bufferedWriter.write(pokemon1.getName() + " has become legendary!"); 
          } 
    
          victorious.add(pokemon1); 
          population.remove(pokemon1); 
    
          pokemon2.addLoss(); 
          if (pokemon2.numLoss == 3) { 
           defeated.add(pokemon2); 
           population.remove(pokemon2); 
          } 
         } 
    
         else if (pokemon1.getCombatScore() > pokemon2.getCombatScore() 
           && pokemon1.isLegendary()) { 
          bufferedWriter.write("The legendary " + pokemon1.getName() + " defeats " + 
            pokemon2.getName() + " with a combat score of " + pokemon1.getCombatScore() + "!"); 
          bufferedWriter.newLine(); 
    
          /* pokemon2 gains xp from winning */ 
          pokemon1.incAttack(pokemon2.getCombatScore()); 
          pokemon1.incDefense(pokemon2.getCombatScore()); 
          pokemon1.addVict(); 
    
          victorious.add(pokemon1); 
          population.remove(pokemon1); 
    
          pokemon2.addLoss(); 
    
          defeated.add(pokemon2); 
          population.remove(pokemon2); 
         } 
         else { 
          bufferedWriter.write(pokemon1.getName() + " defeats " + 
            pokemon2.getName() + " with a combat score of " + pokemon1.getCombatScore() + "!"); 
          bufferedWriter.newLine(); 
    
          /* pokemon2 gains xp from winning */ 
          pokemon1.incAttack(pokemon2.getCombatScore()); 
          pokemon1.incDefense(pokemon2.getCombatScore()); 
    
          pokemon1.addVict(); 
          if (pokemon1.numVict == 3) { 
           bufferedWriter.write(pokemon1.getName() + " has become legendary!"); 
          } 
    
          victorious.add(pokemon1); 
          population.remove(pokemon1); 
    
          pokemon2.addLoss(); 
    
          defeated.add(pokemon2); 
          population.remove(pokemon2); 
         } 
    
        }while (population.size() != 0); 
    

    そしてここでは、.txtファイルのサンプルのスクリーンショットです:

    272 Stoutland defeats Loudred with a combat score of 5415! 
    273 Croconaw defeats Electrike with a combat score of 3272! 
    274 Rapidash defeats Meditite with a combat score of 7390! 
    275 Jynx defeat 
    

    私はデバッグを試してみましたが、ステップスルーしました彼らが働くことを確認するための各条件。彼らがすべて自信を持っています。問題は他の場所にあるのでしょうか?人口に奇数のポケモンがある場合、それが問題になりますか?どんな提案も大歓迎です。

  • +0

    デバッグを支援するために、書き込むたびにbufferedWriter.flush()を追加することをお勧めします。これは洞察につながるかもしれません。現在、まだバッファリングされているライターにはテキストが残っているため、状況がどこにあるのかを確認することは困難です。 –

    +1

    また、私はmath.randomに関するあなたの見た目を疑うでしょう。たぶんそこに何かデバッグ印刷を入れて、止まっているかどうか確認してください。 –

    +0

    whileループにdebugステートメントを追加しました。問題はそこにあると思います。さて、プログラムが永久に動いているように見えるときは、whileループ内のロジックと何か関係があるように見えます。たぶん問題は、一般の人口に1つしか残っていないときに別のポケモンを探していることでしょうか? –

    答えて

    2

    問題は戦いのために、両方の候補を選択するとき、あなたは決して終了しないループに入る、ということである:

    pokemon1 = population.get((int) (Math.random() * population.size())); 
    do { 
        pokemon2 = population.get((int) (Math.random() * population.size())); 
    } while (pokemon1.getId() == pokemon2.getId()); 
    

    これは細かいようだが、人口が唯一のポケモンを持っている場合はどうなりますか?それは決して2番目のものを選ぶことはなく、決してループを終了しません。

    なぜ中間文の書き込みを停止するのかについては、バッファライターを使用していますが、必ずしもその内容をファイルに即座にフラッシュするとは限りません。あなたがループに詰め込まれている間、作家はもっと多くの情報を書くのを待っていて、残りの部分をバッファに保存しています。 flush()を呼び出すと、この特定の問題を解決するのに役立ちますが、戦いに十分なポケモンがあることを確認することがより大きな問題です。

    +0

    あなたの返事が届いているので、私はこの問題を発見していました。私は当初、その問題に取り組まなかった。フィードバックいただきありがとうございます。 –

    +0

    いつもお世話になります! – kdoomsday

    関連する問題