void Sistema::volarYSensar(const Drone & d) { unsigned int i = 0; int indiceDrone; /*Hay que buscar un dron equivalente al que nos dieron en el enjambre del sistema. Por invariante y requiere deberia siempre encontrarlo y ser unico. */ while (i < enjambreDrones().size()){ if (enjambreDrones()[i].id() == d.id()){ /*Como queremos modificarlo tenemos que usar _enjambre, no enjambreDeDrones() porque enajambreDeDrones() devuelve un const. Asignamos por referencia para poder modificar el drone en cuestion*/ indiceDrone = i; } i++; } Drone& drone = _enjambre[indiceDrone]; int posX = drone.posicionActual().x; int posY = drone.posicionActual().y; bool seMovio = false; Posicion targetPos; if (drone.bateria() >0 && enRangoCultivableLibre(posX + 1, posY)){ targetPos.x = posX + 1; targetPos.y = posY; drone.moverA(targetPos); drone.setBateria(drone.bateria() - 1); seMovio = true; } else if (drone.bateria() >0 && enRangoCultivableLibre(posX - 1, posY)){ targetPos.x = posX - 1; targetPos.y = posY; drone.moverA(targetPos); drone.setBateria(drone.bateria() - 1); seMovio = true; } else if (drone.bateria() >0 && enRangoCultivableLibre(posX, posY + 1)){ targetPos.x = posX; targetPos.y = posY + 1; drone.moverA(targetPos); drone.setBateria(drone.bateria() - 1); seMovio = true; } else if (drone.bateria() >0 && enRangoCultivableLibre(posX, posY - 1)){ targetPos.x = posX; targetPos.y = posY - 1; drone.moverA(targetPos); drone.setBateria(d.bateria() - 1); seMovio = true; } /*Si la parcela esta noSensada se le puede poner cualquier verdura (eh, entienden? Cualquier verdura para cultivar!)*/ if(seMovio == true){ modificarCultivoYDrone(targetPos, drone); } }
bool Drone::operator==(const Drone & otroDrone) const { if (id() != otroDrone.id()) return false; if (bateria() != otroDrone.bateria()) return false; if (enVuelo() != otroDrone.enVuelo()) return false; if (vueloRealizado() != otroDrone.vueloRealizado()) return false; if (!mismosProductos(productosDisponibles(), otroDrone.productosDisponibles())) return false; if (!(posicionActual() == otroDrone.posicionActual())) return false; return true; }
void Sistema::modificarCultivoYDrone(Posicion pos, Drone &d){ EstadoCultivo estado = estadoDelCultivo(pos); if (estado == NoSensado){ _estado.parcelas[pos.x][pos.y] = RecienSembrado; } else if ((estado == RecienSembrado || estado == EnCrecimiento) && tieneUnProducto(d.productosDisponibles(), Fertilizante)) { _estado.parcelas[pos.x][pos.y] = ListoParaCosechar; d.sacarProducto(Fertilizante); //Verificar si fertilizar gasta bateria. //Verificar si queda listo para cosechar cuando esta EnCrecimiento y RecienSembrado } else if (estado == ConPlaga){ if (d.bateria() >=10 && tieneUnProducto(d.productosDisponibles(), Plaguicida)){ _estado.parcelas[pos.x][pos.y] = RecienSembrado; d.sacarProducto(Plaguicida); d.setBateria(d.bateria() - 10); } else if (d.bateria() >=5 && tieneUnProducto(d.productosDisponibles(), PlaguicidaBajoConsumo)){ _estado.parcelas[pos.x][pos.y] = RecienSembrado; d.sacarProducto(PlaguicidaBajoConsumo); d.setBateria(d.bateria() - 5); } } else if (estado == ConMaleza){ if (d.bateria() >=5 && tieneUnProducto(d.productosDisponibles(), Herbicida)){ _estado.parcelas[pos.x][pos.y] = RecienSembrado; d.sacarProducto(Herbicida); d.setBateria(d.bateria() - 5); } else if (d.bateria() >=5 && tieneUnProducto(d.productosDisponibles(), HerbicidaLargoAlcance)){ _estado.parcelas[pos.x][pos.y] = RecienSembrado; d.sacarProducto(HerbicidaLargoAlcance); d.setBateria(d.bateria() - 5); } } }
int Sistema::pasosIzquierdaPosibles(int y){ Drone d; //Buscamos el drone int i = 0; while (i < enjambreDrones().size()){ if (enjambreDrones()[i].posicionActual().y == y){ d = enjambreDrones()[i]; } i++; } /*La cantidad de pasos posibles pueden depender de la cantidad de fertilizante, de bateria, a que distancia se encuentra del limite del campo o de una casa o granero. Evaluamos cada caso por separado y luego los comparamos.*/ int posX = d.posicionActual().x; //Empezamos a buscar en posX y nos movemos hacia la izquierda (restamos) i = posX; /*Los inicializamos en -1 para que en caso que no haya ni G ni C en la fila se pueda usar como limite*/ int xGranero = -1; int xCasa = -1; while (i >= 0){ Posicion pos; pos.x = i; pos.y = y; if(campo().contenido(pos) == Casa){ xCasa = i; } if(campo().contenido(pos) == Granero){ xGranero = i; } i--; } //Vemos cuanto fertilizante tenemos disponible int fertilizante = 0; i = 0; while(i < d.productosDisponibles().size()){ if(d.productosDisponibles()[i] == Fertilizante){ fertilizante++; } i++; } //Vemos cuantos pasos se pueden dar con la cantidad disponible de fertilizante i = posX; int pasosFert = 0; while(i > mayor(xCasa, xGranero)){ Posicion pos; pos.x = i; pos.y = y; if((estadoDelCultivo(pos) != EnCrecimiento && estadoDelCultivo(pos) != RecienSembrado) && fertilizante > 0){ pasosFert++; } if((estadoDelCultivo(pos) == EnCrecimiento || estadoDelCultivo(pos) == RecienSembrado) && fertilizante > 0){ pasosFert++; fertilizante--; } i--; } return menor(pasosFert, menor(d.bateria(), menor(posX - xGranero, posX - xCasa))); }