void AsignarAccionesDefault(Lista<TipoLista> & lstAliados,Lista<TipoLista> & lstEnemigos, int TurnoActual, int MaximoTurno, int EnergiaInicial) { int SumaEnergiaAliados=SumaEnergia(lstAliados); int SumaEnergiaEnemigos=SumaEnergia(lstEnemigos); double FactorEnergia=(double)SumaEnergiaAliados/SumaEnergiaEnemigos; Nodo<TipoLista> *NodoAux=lstAliados.ObtenerComienzoLista(); while(NodoAux) { int Energia=(NodoAux->ObtenerDato()).ObtenerEnergia(); if(Energia>FACTOR_VIDA_MAX*(EnergiaInicial)) (NodoAux->ObtenerDato()).AsignarAccion(DEFENSA); else if(Energia<FACTOR_VIDA_MIN*(EnergiaInicial)) (NodoAux->ObtenerDato()).AsignarAccion(ATAQUE); else { double FactorTurno=(double)(TurnoActual)/MaximoTurno; if((FactorTurno>=FACTOR_TURNO_DEFECTO)&&(FactorEnergia<1)) (NodoAux->ObtenerDato()).AsignarAccion(ATAQUE); else if((FactorTurno>=FACTOR_TURNO_DEFECTO)&&(FactorEnergia>1)) (NodoAux->ObtenerDato()).AsignarAccion(DEFENSA); else { if(FactorEnergia>FACTOR_ENERGIA_DEFECTO) (NodoAux->ObtenerDato()).AsignarAccion(DEFENSA); else if(FactorEnergia<(double)1/FACTOR_ENERGIA_DEFECTO) (NodoAux->ObtenerDato()).AsignarAccion(ATAQUE); else { srand(time(NULL)); int AuxRandom=rand()%LIMITE_RANDOM; if(!AuxRandom) (NodoAux->ObtenerDato()).AsignarAccion(DEFENSA); else (NodoAux->ObtenerDato()).AsignarAccion(ATAQUE); } } } NodoAux=NodoAux->ObtenerSiguiente(); } NodoAux=lstAliados.ObtenerComienzoLista(); }
int SumaEnergia(Lista<TipoLista> lst) { int Suma=0; Nodo<TipoLista> *aux=lst.ObtenerComienzoLista(); while(aux) { Suma+=(aux->ObtenerDato()).ObtenerEnergia(); aux=aux->ObtenerSiguiente(); } return Suma; }
void Estrategia<TipoLista>::BuscarCercanos(int InfGranadaX, int InfGranadaY, int PosX, int PosY, int InfX, int InfY, Lista<TipoLista> lst, Lista<TipoLista> & lstCercanos, int Precision,bool Aliado) /*BuscarCercanos(InfGranadaX,InfGranadaY,PosX,PosY,InfX,InfY, lstEnemigos,lstEnemigosCercanos,PRECISION_DEFENSA,false); */ { /*[PosX,PosY] es la posicion de nuestro soldado, y se recibe la lista de soldados enemigos para devolver una lista donde quedan seleccionados nada mas los soldados enemigos que pueden afectar a este soldado. */ Nodo<TipoLista> *aux=lst.ObtenerComienzoLista(); while(aux) { TipoLista Dato= aux->ObtenerDato(); if(EstaCerca(InfGranadaX,InfGranadaY,PosX,PosY,InfX,InfY,Dato,Aliado,Precision)) lstCercanos.Insertar(Dato); aux=aux->ObtenerSiguiente(); } }