/// <summary> /// Atraccio de persona sobre una determinada posicio /// </summary> /// <param name="fil">Fila de la posició</param> /// <param name="col">Columan de la posició</param> /// <param name="esc">Escenari on estan situats</param> /// <returns>Atracció quantificada</returns> private double Atraccio(int fil, int col, Escenari esc) { double atraccio = 0; Posicio posicio = new Posicio(fil, col); // Creem la posició a on és possible que vagi la persona foreach (Persona p in esc.Tp) { if (p.Nom != this.Nom) // Controlem que no calculi a la persona que estem tractant { atraccio += Interes(p) / Posicio.Distancia(posicio, p); } } return(atraccio); }
/// <summary> /// Decideix quin serà el següent moviment que farà la persona /// </summary> /// <param name="esc">Escenari on esta situada la persona</param> /// <returns>Una de les 5 possibles direccions (Quiet, Amunt, Avall, Dreta, Esquerra</returns> public Direccio OnVaig(Escenari esc) { List <double> atraccions = new List <double>(); List <Direccio> d = new List <Direccio>(); // inicialitzar direcció = quiet //Direccio direccio = Direccio.Quiet; double amunt = 0; double dreta = 0; double esquerra = 0; double avall = 0; double quiet = 0; double resultat; // Calculem totes les atraccions if (esc.DestiValid(this.Fila - 1, this.Columna)) { amunt = Atraccio(this.Fila - 1, this.Columna, esc); atraccions.Add(amunt); } if (esc.DestiValid(this.Fila, this.Columna + 1)) { dreta = Atraccio(this.Fila, this.Columna + 1, esc); atraccions.Add(dreta); } if (esc.DestiValid(this.Fila + 1, this.Columna)) { avall = Atraccio(this.Fila + 1, this.Columna, esc); atraccions.Add(avall); } if (esc.DestiValid(this.Fila, this.Columna - 1)) { esquerra = Atraccio(this.Fila, this.Columna - 1, esc); atraccions.Add(esquerra); } quiet = Atraccio(this.Fila, this.Columna, esc); atraccions.Add(quiet); resultat = atraccions.Max(); if (resultat == amunt) { d.Add(Direccio.Amunt); } if (resultat == avall) { d.Add(Direccio.Avall); } if (resultat == dreta) { d.Add(Direccio.Dreta); } if (resultat == esquerra) { d.Add(Direccio.Esquerra); } if (resultat == quiet) { d.Add(Direccio.Quiet); } int direccio = r.Next(0, d.Count); return(d[direccio]); }