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.