/// <summary> /// Retorna la distància entre dues posicions /// </summary> /// <param name="pos1">Primera posició</param> /// <param name="pos2">Segona posició</param> /// <returns>Distància entre les dues posicions</returns> public static double Distancia(Posicio pos1, Posicio pos2) { double distancia = 0; distancia = Math.Sqrt((Math.Pow((pos1.Fila - pos2.Fila), 2)) + (Math.Pow((pos1.Columna - pos2.Columna), 2))); return(distancia); }
/// <summary> /// Mou una persona de (filOrig, colOrig) fins a la posicio adjacent(filDesti,colDesti) /// Es suposa que les coordenades són vàlides, que hi ha una persona a l'origen i que el destí està buit. /// </summary> /// <param name="filOrig">Fila de la coordenada d'origen</param> /// <param name="colOrig">Columna de la coordenada d'origen</param> /// <param name="filDesti">Fila de la coordenada de destí</param> /// <param name="colDesti">Columna de la coordenada de destí</param> private void Moure(int filOrig, int colOrig, int filDesti, int colDesti) { if (DestiValid(filDesti, colDesti) && esc[filDesti, colDesti].Buida) { esc[filDesti, colDesti] = esc[filOrig, colOrig]; esc[filDesti, colDesti].Fila = filDesti; esc[filDesti, colDesti].Columna = colDesti; esc[filOrig, colOrig] = new Posicio(filOrig, colOrig); } }
/// <summary> /// Crea un escenari donades unes mides /// </summary> /// <param name="files">Número de files de l'escenari</param> /// <param name="columnes">Número de columnes de l'escenari</param> public Escenari(int files, int columnes) { esc = new Posicio[files, columnes]; for (int fila = 0; fila < files; fila++) { for (int columna = 0; columna < columnes; columna++) { esc[fila, columna] = new Posicio(fila, columna); } } nHomes = 0; nDones = 0; nCambrers = 0; tp = new TaulaPersones(); }
/// <summary> /// Interès del cambrer per una posició /// </summary> /// <param name="pos">posició per la que s'interessa</param>/// <returns>Retorna 0 si no hi ha ningú, 1 si hi ha un convidat i -1 si un cambrer</returns> public override int Interes(Posicio pos) { int interes = 0; if (pos is Cambrer) { interes= -1; } else if (pos is Convidat) { interes = 1; } return interes; }
/// <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> /// Elimina una persona de l'escenari i de la taula de persones /// </summary> /// <param name="fil">Fila on està la persona</param> /// <param name="col">Columna on està la persona</param> public void buidar(int fil, int col) { if (esc[fil, col] is Cambrer) { nCambrers--; } else { if (esc[fil, col] is Home) { nHomes--; } else { nDones--; } } tp.Eliminar((Persona)esc[fil, col]); esc[fil, col] = new Posicio(fil, col); }
/// <summary> /// Interès d'aquesta dona per una posició /// </summary> /// <param name="pos">Posició per la qual s'interessa</param> /// <returns>Interès quantificat</returns> public override int Interes(Posicio pos) { int interes = 0; if (!pos.Buida) { if (pos is Convidat) { if (pos is Home) { interes = base[((Convidat)pos).Nom] + PlusSexe; } else if (pos is Dona) { interes = base[((Convidat)pos).Nom]; } } } return(interes); }
/// <summary> /// Interès de la persona sobre una determinada posició /// </summary> /// <param name="pos">Posició</param> /// <returns>Interès quantificat</returns> public abstract int Interes(Posicio pos);