我在这里提出另一个我遇到但无法解决的逻辑问题!
我这里有这门课:
package data;
import gui.GUIJuego;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
import dominio.Adorno;
import dominio.EdificioNoPublico;
import dominio.EdificioPublico;
import dominio.Item;
public class Administrador {
private Ciudad ciudad;
private int contadorExplosion;
private boolean endofgame;
private Dificultad dificultad;
private Constructora constructora;
public Administrador(Ciudad ciudad, int contadorExplosion, boolean endofgame, Dificultad dificultad, Constructora constructora) {
this.ciudad = ciudad;
this.contadorExplosion = contadorExplosion;
this.endofgame = endofgame;
this.dificultad = dificultad;
this.constructora = constructora;
}
public Administrador(){
this.setCiudad(new Ciudad());
this.setContadorExplosion(0);
this.setEndofgame(false);
this.setDificultad(new Dificultad(1));
this.setConstructora(new Constructora());
}
public void administrar(final GUIJuego juego){
Timer timer = new Timer("Juego");
this.setEndofgame(false);
while(endofgame == false){
timer.scheduleAtFixedRate(new TimerTask(){
public void run() {
juego.getArcaLabel().setText("Arca: " + getCiudad().getArca());
juego.getPuntosBellezaLabel().setText("Puntos de Belleza: " + getCiudad().getPuntosBelleza());
juego.getHabitantesLabel().setText("Habitantes: " + getCiudad().getCantidadHabitantes() + " / " + getCiudad().getCantidadHabitantesDisponibles());
getEgresosIngresos();
tryExplotar();
}
}, 0, 1000);
}
}
private void getEgresosIngresos(){
for(Item i : this.getCiudad().getItems()){
if(i.getContadorTiempo() == 89){
i.setContadorTiempo(0);
if(i instanceof EdificioNoPublico)
this.getCiudad().setArca(this.getCiudad().getArca() + ((EdificioNoPublico) i).getRenta());
else
this.getCiudad().setArca(this.getCiudad().getArca() - getCostosAdornosEdificiosPublicos(i));
} else { i.setContadorTiempo(i.getContadorTiempo() + 1); }
}
}
private int getCostosAdornosEdificiosPublicos(Item i){
if(i instanceof EdificioPublico)
return ((EdificioPublico) i).getCostoMantenimiento();
else if(i instanceof Adorno)
return ((Adorno) i).getCostoMantenimiento();
return 0;
}
private void tryExplotar(){
if(this.getContadorExplosion() == 299 && this.getCiudad().getItems() != null){
Random rnd = new Random();
if(rnd.nextInt(100) < this.getCiudad().getProbabilidadExplosion() && this.getCiudad().getItems().size() > 0){
this.getCiudad().getItems().remove( rnd.nextInt ( this.getCiudad().getItems().size() ) );
this.setContadorExplosion(0);
}
rnd = null;
}else{ this.setContadorExplosion(this.getContadorExplosion() + 1); }
}
// ### Getters y Setters ###
public Ciudad getCiudad() {
return ciudad;
}
public void setCiudad(Ciudad ciudad) {
this.ciudad = ciudad;
}
public int getContadorExplosion() {
return contadorExplosion;
}
public void setContadorExplosion(int contadorExplosion) {
this.contadorExplosion = contadorExplosion;
}
public boolean isEndofgame() {
return endofgame;
}
public void setEndofgame(boolean endofgame) {
this.endofgame = endofgame;
}
public Dificultad getDificultad() {
return dificultad;
}
public void setDificultad(Dificultad dificultad) {
this.dificultad = dificultad;
}
public Constructora getConstructora() {
return constructora;
}
public void setConstructora(Constructora constructora) {
this.constructora = constructora;
}
// ### Fin Getters y Setters ##
}
但是你们会感兴趣的是这种特殊的方法:
public void administrar(final GUIJuego juego){
Timer timer = new Timer("Juego");
this.setEndofgame(false);
while(endofgame == false){
timer.scheduleAtFixedRate(new TimerTask(){
public void run() {
juego.getArcaLabel().setText("Arca: " + getCiudad().getArca());
juego.getPuntosBellezaLabel().setText("Puntos de Belleza: " + getCiudad().getPuntosBelleza());
juego.getHabitantesLabel().setText("Habitantes: " + getCiudad().getCantidadHabitantes() + " / " + getCiudad().getCantidadHabitantesDisponibles());
getEgresosIngresos();
tryExplotar();
}
}, 0, 1000);
}
}
现在,据我在调试器中看到的,计时器正在循环,我不完全确定它甚至试图运行其中的函数,我所知道的是框架(参数 GUIJuego 是一个摆动框架)工作正常,但是计时器让程序全部卡住,我是否犯了任何逻辑错误,或者认为计时器错误?
预先感谢您阅读本文。