포켓몬 인구가 많은 대규모 전투 시뮬레이션을 만들려고합니다. 예제를 제공하기 위해 pokemon1과 pokemon2라는 두 개의 Pokemon을 사용하겠습니다. 나는 프로그램처럼 작동 할 다음프로그램을 실행하는 동안 갑작스런 정지가 발생했습니다.
- pokemon1 및 pokemon2는 등 속도, 공격, 방어 등의 기본적인 속성의 기반으로 점수 그들의 combatScore을 기반으로 비교합니다
- pokemon1과 pokemon2가 서로 짝을 이루어 비교됩니다.
- pokemon1이 pokemon2보다 combatScore가 높으면 pokemon1이 다음 라운드로 진행하고 (일반 인구 집단에서 제거되어 "승리"집단에 배치됩니다.), pokemon2가 일반 인구 집단에서 제거되고 " 정복당한 "인구.
- 그런 다음 pokemon1은 pokemon2의 특성을 기반으로 일부 특성을 얻습니다.
- pokemon2 (전멸)가 전설이지만, 최종적으로 정복 된 인구에 합계되기 전에 총 3 회 패배해야합니다.
- pokemon1 (승리) 전설이 아니었지만 3 번 수상한 경우 전설이되어 정복당한 인구에 추가되기 전에 3 번 잃어야합니다.
승리자가 한 명 남을 때까지 승리 횟수가 줄어들면서 반복됩니다.
- 전설 pokemon2 전설 pokemon1 를 친다 : 나는 무작위 경우 - 다른 지점 사용하여 서로 다른 조건의 수를 인구에서 두 포켓몬을 검색하고이를 기반으로 비교하는 DO-while 루프를 만들었습니다 전설 pokemon1 뛰는 pokemon2
- 는
- 전설 pokemon2 비트는 pokemon1
그리고 그 반대의 경우도 마찬가지입니다. 내가 겪고있는 문제는 이것입니다. 대부분의 경우 프로그램이 깨끗하게 돌아가고 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());
이 잘 보이지만 인구가 하나의 포켓몬이있는 경우 어떤 일이 발생 :
디버깅을 돕기 위해, 쓸 때마다 bufferedWriter.flush()를 추가하는 것이 좋습니다. 이것은 통찰력으로 이어질 수 있습니다. 현재는 버퍼링 된 글쓴이에 여전히 텍스트가 남아 있기 때문에 상황이 어디에 있는지 파악하기가 어렵습니다. –
또한 math.random과 관련된 당신의 모습이 의심 스럽습니다. 어쩌면 거기에 일부 디버그 인쇄를 넣어 붙어 있는지 확인할 수 있습니다. –
while 루프에 debug 문을 추가했습니다. 문제가 있다고 생각합니다. 이제 프로그램이 영원히 돌아가고있는 것처럼 보일 때마다 while 루프 내의 논리와 관련이있는 것처럼 보입니다. 아마도 문제는 일반 인구 중 하나만 남았을 때 다른 포켓몬을 찾고 있다는 것입니까? –