public Movimiento CalcularMovimiento(ArbolGeneral <Planeta> arbol) { List <Planeta> cami = new List <Planeta>(); CaminoPreOrden(arbol, cami); int Cant = cami.Count; if (Cant > 1) { Movimiento T = new Movimiento(cami[Cant - 1], cami[Cant - 2]); return(T); } CaminoJugador(arbol, cami); List <Planeta> jugador = CaminoJugador(arbol, cami); Movimiento kill = new Movimiento(cami[x], jugador[y]); if (x < 3 && cami[x].Poblacion() / 2 > jugador[y].Poblacion() || jugador[y].EsPlanetaDeLaIA()) // si origen es menor a tres y la mitad de la poblacion de origen es menor que la poblacion del destino (osea no lo va vencer) o que el destino sea planeta de la ia { // sube uno de origen y uno de destino, y se resetea el contador mov x++; y++; mov = 0; } //se incrementa mov en 1 si lo de arriba si no se cumple else { mov++; } // si el contador mov llega a 2 (Se hicieron 2 movimientos sin poder capturar el planeta) se resetea el origen y el destino para llamar más naves desde root para capturar if (mov == 2) { x = 0; y = 1; } return(kill); }
public Movimiento enviarMovimiento(ArbolGeneral <Planeta> arbol) { List <ArbolGeneral <Planeta> > ListaPreorden = arbol.ListaPreOrden(); List <ArbolGeneral <Planeta> > ListaDeNodosIA = new List <ArbolGeneral <Planeta> >(); List <ArbolGeneral <Planeta> > ListaDeNodosUsuario = new List <ArbolGeneral <Planeta> >(); foreach (ArbolGeneral <Planeta> nodo in ListaPreorden) { if (nodo.getDatoRaiz().EsPlanetaDeLaIA()) { ListaDeNodosIA.Add(nodo); } if (nodo.getDatoRaiz().EsPlanetaDelJugador()) { ListaDeNodosUsuario.Add(nodo); } } int menordistancia = -20; ArbolGeneral <Planeta> nodoIAaMover = arbol; foreach (ArbolGeneral <Planeta> nodoU in ListaDeNodosUsuario) { foreach (ArbolGeneral <Planeta> nodoIA in ListaDeNodosUsuario) { int distancia = Distancia_Nodo(arbol, nodoIA, nodoU); if (Math.Abs(distancia) < menordistancia) { nodoIAaMover = nodoIA; } } } Movimiento mover = obtengoCamino(arbol, nodoIAaMover, menordistancia); return(mover); }
public Movimiento obtengoCamino(ArbolGeneral <Planeta> arbol, ArbolGeneral <Planeta> ia, int sentido) { List <ArbolGeneral <Planeta> > ListaPreorden = arbol.ListaPreOrden(); Movimiento mover = null; Planeta origen; Planeta destino; int posicioIA = -1; for (int y = 0; y < ListaPreorden.Count; y++) { if (ListaPreorden[y].Equals(ia)) { posicioIA = y; } } if (sentido == -20) {//ir a raiz //Es hijo de la raiz if (posicioIA - 1 % 3 == 0 || posicioIA == 1) { //si posicion-1 es divisible por 3 se que es uno de los nodos hijos de la raiz origen = ListaPreorden[posicioIA].getDatoRaiz(); destino = ListaPreorden[0].getDatoRaiz(); mover = new Movimiento(origen, destino); } else { //no es hijo de la raiz origen = ListaPreorden[posicioIA].getDatoRaiz(); destino = ListaPreorden[posicioIA - 1].getDatoRaiz(); mover = new Movimiento(origen, destino); mover = OpcionMover2ARaiz(arbol); } } else if (sentido > 0) { //me muevo para arriba if (posicioIA - 1 % 3 == 0 || posicioIA == 1) { //si posicion-1 es divisible por 3 se que es uno de los nodos hijos de la raiz origen = ListaPreorden[posicioIA].getDatoRaiz(); destino = ListaPreorden[0].getDatoRaiz(); mover = new Movimiento(origen, destino); } else { //no es hijo de la raiz origen = ListaPreorden[posicioIA].getDatoRaiz(); destino = ListaPreorden[posicioIA - 1].getDatoRaiz(); mover = new Movimiento(origen, destino); } } else { //me muevo para abajo if (posicioIA - 1 % 3 == 0 || posicioIA == 1) { //si posicion-1 es divisible por 3 se que es uno de los nodos hijos de la raiz origen = ListaPreorden[posicioIA].getDatoRaiz(); destino = ListaPreorden[posicioIA + 3].getDatoRaiz(); mover = new Movimiento(origen, destino); } else { //no es hijo de la raiz origen = ListaPreorden[posicioIA].getDatoRaiz(); destino = ListaPreorden[posicioIA + 1].getDatoRaiz(); mover = new Movimiento(origen, destino); } } return(mover); }