Sto facendo un progetto in java che riguarda un Game Adventure, con Eclipse, ho un personaggio mosso dall'utente e dei nemici che agiscono mossi dal computer contro di lui.
In questa classe si devono gestire le azioni dei nemici e in particolare vorrei fare questa cosa:

io ho un tot di nemici e voglio che almeno 3 (o tutti se sono meno di 3) siano vicini al personaggio: e per vicini si intende che la loro distanza sia <=1, distanza data dal metodo getDistanza che somma la distanza tra le coordinate x e y del personaggio e del nemico preso in considerazione.
Voglio scorrere la lista e fare attaccare tutti i nemici, con un attacco ravvicinato se la loro distanza è <=1 o con un attacco a distanza altrimenti.
E nel mentre voglio contare il numero dei nemici vicini, quindi che usano l'attacco ravvicinato, se sono più di 3 tutto bene..altrimenti voglio far spostare qualche nemico verso il personaggio finchè la condizione non viene rispettata.
Ho provato a realizzare questo algoritmo nella classe qui sotto, che ho chiamato Arena, ma il problema è che gli spostamenti si susseguono senza mai avere fine: o almeno dalle stampe che ho fatto sembra essere così.
I metodi per lo spostamento dei nemici sono questi:

codice:
 public void destra(int j) throws Exception {
		// TODO Auto-generated method stub
		if(x+j>100 || j>(int)((forza/100)*5)){
			throw new Exception();
		}
		x=x+j;

	}

	@Override
	public void sinistra(int j) throws Exception {
		// TODO Auto-generated method stub
		if(x+j>100 || j>(int)((forza/100)*5)){
			throw new Exception();
		}
		x=x-j;

	}

	@Override
	public void alto(int j) throws Exception {
		// TODO Auto-generated method stub
		if(y+j>100 || j>(int)((forza/100)*5)){
			throw new Exception();
		}
		y=y+j;
	}

	@Override
	public void basso(int j) throws Exception {
		// TODO Auto-generated method stub
		if(y+j>100 || j>(int)((forza/100)*5)){
			throw new Exception();
		}
		y=y-j;

	}
come si può vedere viene generata un'eccezione se non si rispettano i vincoli, quindi bisogna prestarvi attenzione: 100 si riferisce ad un campo che ho inteso essere la grandezza massima del "terreno di gioco".

Di seguito c'è la classe Arena per intero:


codice:
 import java.util.ArrayList;

public class Arena {
	double j=Math.random();
	private int numNemici=(int)(20*j);
	private int numTrappole;
	ArrayList<Nemico> nemici=new ArrayList<Nemico>();
	ArrayList<ITrappola> trappole;

	
	public Arena(){
		double z=Math.random();
		numTrappole=(int)(20*z);
		trappole= new ArrayList<ITrappola>();
	}
	//Qui c'è l'algoritmo dei nemici
	public void enter(PersonaggioEsteso hero) // a template method
	   {
		int cont=0;
		for (Nemico n: nemici)
	      {
			
			n.selezionaPersonaggio(hero);
	      	if(n.getDistanza(hero)<=1){
	      		try {
					n.attaccoRavvicinato();
					System.out.println("Attacco ravvicinato");
				} catch (Exception e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
									}
	      		
	      	cont++; //Conto quanti nemici sono "vicini" al personaggio
	      	}
	      	try {
				n.attaccoDistanza();
				System.out.println("Attacco a distanza");
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	      	
			
	      }
	     		
		//Il problema è che fa una serie di spostamenti che non ha mai termine sostanzialmente
		//Bisogna rivedere questa parte dell'algoritmo
		
	      int val=3-cont;
	      int c=0;
	      int a= nemici.get(c).getDistanzaX(hero);
		  int b= nemici.get(c).getDistanzaY(hero);
		  if(a<=1 && b<=1 && c<numNemici){  //Se per caso prendo un nemico già vicino al personaggio allora cambio nemico
		    	 c++;
		  }
	      while(val>0){ 
	    //Bisogna sistemare gli spostamenti in modo che non dia eccezioni
	     if(a<=1 && b<=1){  
	    	 val++; //In questo caso un nemico è stato portato a distanza ravvicinata dal personaggio, quindi incremento il valore identificativo del conteggio
	     }
	      if((nemici.get(c).getX()>hero.getX()) && a>1){
	    	  try {
	    		  if(a<(int)(nemici.get(c).getForza()/100)*5){
				nemici.get(c).sinistra(a-1);
				System.out.println("spostamento a sinistra");
	    		  }
	    		  nemici.get(c).sinistra((int)(nemici.get(c).getForza()/100)*5);
	    		  System.out.println("spostamento a sinistra");
	    		  
	    		  
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	      }
	      if((nemici.get(c).getX()<hero.getX() && a>1)){
	    	  try {
	    		  if(a<(int)(nemici.get(c).getForza()/100)*5){
				nemici.get(c).destra(a-1);
				System.out.println("spostamento a destra");
	    		  }
	    		  nemici.get(c).destra((int)(nemici.get(c).getForza()/100)*5);
	    		  System.out.println("spostamento a destra");
	    		  

	    		  
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	      }
	      if((nemici.get(c).getY()>hero.getY() && b>1)){
	    	  try {
	    		  if(b<(int)(nemici.get(c).getForza()/100)*5){
				nemici.get(c).basso(b-1);
				System.out.println("spostamento in basso");
	    		  }
	    		  nemici.get(c).basso((int)(nemici.get(c).getForza()/100)*5);
	    		  System.out.println("spostamento in basso");
	    		  
	    		  
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	      }
	      if((nemici.get(c).getY()<hero.getY() && b>1)){
	    	  try {
	    		  if(b<(int)(nemici.get(c).getForza()/100)*5){
				nemici.get(c).alto(b-1);
				System.out.println("spostamento in alto");
	    		  }
	    		  nemici.get(c).alto((int)(nemici.get(c).getForza()/100)*5);
	    		  System.out.println("spostamento in alto");
	    		  
	    		  
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
	      }
	      
	     
      
	      }
	      
	   }
	/*
	  QUI DI SEGUITO DEVO CREARE DEI METODI PER AGGIUNGERE NEMICI, RIMUOVERE NEMICI, 
	  AGGIUNGERE TRAPPOLE E RIMUOVERE TRAPPOLE DAL CAMPO DI GIOCO.
	    
	    */
	public void aggiungiNemico(Nemico n){
		int enemies=0;
		if(enemies<numNemici){
		nemici.add(n);
		enemies++;
		}else{
			
		System.out.println("Non si possono aggiungere ulteriori nemici");
		}
	}
	public void rimuoviNemico(Nemico n)throws Exception{
		if(nemici.size()!=0){
			nemici.remove(n);
		}
		throw new Exception();
	}
	public void aggiungiTrappola(ITrappola t){
		int trap=0;
		if(trap<numTrappole){
		trappole.add(t);
		trap++;
		}
		System.out.println("Non si possono aggiungere ulteriori trappole");
	}
	public void rimuoviTrappola(ITrappola t)throws Exception{
		if(trappole.size()!=0){
			trappole.remove(t);
		}
		throw new Exception();
	}
	
}
Ringrazio in anticipo chiunque sappia fornirmi un qualsivoglia aiuto.