2017-02-16 8 views
2

포켓몬 인구가 많은 대규모 전투 시뮬레이션을 만들려고합니다. 예제를 제공하기 위해 pokemon1과 pokemon2라는 두 개의 Pokemon을 사용하겠습니다. 나는 프로그램처럼 작동 할 다음프로그램을 실행하는 동안 갑작스런 정지가 발생했습니다.

  • pokemon1 및 pokemon2는 등 속도, 공격, 방어 등의 기본적인 속성의 기반으로 점수 그들의 combatScore을 기반으로 비교합니다
  • pokemon1과 pokemon2가 서로 짝을 이루어 비교됩니다.
  • pokemon1이 pokemon2보다 combatScore가 높으면 pokemon1이 다음 라운드로 진행하고 (일반 인구 집단에서 제거되어 "승리"집단에 배치됩니다.), pokemon2가 일반 인구 집단에서 제거되고 " 정복당한 "인구.
  • 그런 다음 pokemon1은 pokemon2의 특성을 기반으로 일부 특성을 얻습니다.
  • pokemon2 (전멸)가 전설이지만, 최종적으로 정복 된 인구에 합계되기 전에 총 3 회 패배해야합니다.
  • pokemon1 (승리) 전설이 아니었지만 3 번 수상한 경우 전설이되어 정복당한 인구에 추가되기 전에 3 번 잃어야합니다.

승리자가 한 명 남을 때까지 승리 횟수가 줄어들면서 반복됩니다.

  1. 전설 pokemon2 전설 pokemon1
  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 
    

    다음은이 시뮬레이터를 실행하는 코드는 그들이 작동하는지 확인하기위한 각 조건. 나는 그들이 모두 자신감을 가지고 있습니다. 문제는 다른 곳에 있습니까? 인구에 홀수 개의 포켓몬이있을 때 실행되는 문제입니까? 어떤 제안이라도 대단히 감사하겠습니다.

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

    이 잘 보이지만 인구가 하나의 포켓몬이있는 경우 어떤 일이 발생 :

  • +0

    디버깅을 돕기 위해, 쓸 때마다 bufferedWriter.flush()를 추가하는 것이 좋습니다. 이것은 통찰력으로 이어질 수 있습니다. 현재는 버퍼링 된 글쓴이에 여전히 텍스트가 남아 있기 때문에 상황이 어디에 있는지 파악하기가 어렵습니다. –

    +1

    또한 math.random과 관련된 당신의 모습이 의심 스럽습니다. 어쩌면 거기에 일부 디버그 인쇄를 넣어 붙어 있는지 확인할 수 있습니다. –

    +0

    while 루프에 debug 문을 추가했습니다. 문제가 있다고 생각합니다. 이제 프로그램이 영원히 돌아가고있는 것처럼 보일 때마다 while 루프 내의 논리와 관련이있는 것처럼 보입니다. 아마도 문제는 일반 인구 중 하나만 남았을 때 다른 포켓몬을 찾고 있다는 것입니까? –

    답변

    2

    문제는 싸움을 모두 경쟁자를 선택할 때, 당신이 종료 결코 루프를 입력하는 것이 무엇입니까? 그것은 두 번째 것을 결코 선택하지 않고 루프를 종료하지 않습니다.

    중간 문장 작성을 중지 한 이유는 버퍼링 된 작성기를 사용하기 때문에 파일 내용을 즉시 플러시하지 않아도됩니다. 당신이 루프에 갇혀있는 동안, 작가는 더 많은 정보를 쓸 때까지 기다리고 있으며 나머지는 버퍼에 보관하고 있습니다. flush()를 호출하면이 특정 문제에 도움이되지만 싸울만한 포켓몬이 충분한 지 확인하는 것이 더 큰 문제입니다.

    +0

    나는 당신의 대답이 통보를 받고있을 때이 문제를 발견하고있었습니다. 나는 그 문제를 처음에 언급하는 것을 게을리했다. 의견에 감사드립니다. –

    +0

    항상 도와 드리겠습니다! – kdoomsday