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:
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".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; }
Di seguito c'è la classe Arena per intero:
Ringrazio in anticipo chiunque sappia fornirmi un qualsivoglia aiuto.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(); } }

Rispondi quotando