/// <summary> /// Interès d'aquest home 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 resultat = 0; if (!pos.Buida) { if (((Persona)pos).EsConvidat()) { if (!((Convidat)pos).EsHome()) { resultat += ((Dona)pos).PlusSexe; } if (Simpaties.Keys.Contains(((Persona)pos).Nom)) { resultat += Simpaties[((Persona)pos).Nom]; } } else { resultat += 1; } } return(resultat); }
private Posicio CalculaPosicioNova(int fil, int col, Direccio direccio) { Posicio pos = new Posicio(); switch (direccio) { case Direccio.Amunt: pos.Fila = fil - 1; pos.Columna = col; break; case Direccio.Avall: pos.Fila = fil + 1; pos.Columna = col; break; case Direccio.Dreta: pos.Fila = fil; pos.Columna = col + 1; break; case Direccio.Esquerra: pos.Fila = fil; pos.Columna = col - 1; break; default: pos.Fila = fil; pos.Columna = col; break; } return(pos); }
/// <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 (escenari[fil, col] is Persona) { Persona p = (Persona)escenari[fil, col]; escenari[fil, col] = new Posicio(); persones.Eliminar(p.Nom); } }
/// <summary> /// Funció que ens emplena l'escenari de posicions buides, /// </summary> private void EmplenarEscenari() { for (int i = 0; i < files; i++) { for (int j = 0; j < columnes; j++) { escenari[i, j] = new Posicio(i, j); } } }
/// <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; double distBase = 0; double distAlt = 0; if (!(pos1.fila == pos2.fila && pos1.columna == pos2.columna)) { distAlt = Math.Abs(pos2.fila - pos1.fila); distBase = Math.Abs(pos2.columna - pos1.columna); distancia = Pitagoras(distAlt, distBase); } return(distancia); }
private void persona_Drop(object sender, DragEventArgs e) { StackPanel desti = (StackPanel)sender; StackPanel origen = e.Data.GetData("bloc") as StackPanel; if (desti.Children.Count > 0) { MessageBox.Show("Aquesta posició està ocupada"); } else if (origen.Children.Count > 0) { // Fem el canvi GRAFIC // Obtenim el que necessitem de la posicio antiga TextBlock tbOrigen = (TextBlock)origen.Children[0]; Brush backgroundOrigen = (Brush)origen.Background; // Afegim el nom i el borrem de l'origen origen.Children.RemoveAt(0); desti.Children.Add(tbOrigen); // Afegim la imatge i l'esborrem de l'origen desti.Background = backgroundOrigen; desti.Opacity = 1; origen.Background = new SolidColorBrush(Colors.Red); origen.Opacity = 0; // Fem el canvi lògic de posició de la persona // Obtenim la persona que hem de modificar Persona personaMoguda = esc.Tp[tbOrigen.Text]; personaMoguda.Fila = Grid.GetRow(desti); personaMoguda.Columna = Grid.GetColumn(desti); // Modifiquem l'escenari esc.posar(personaMoguda); Posicio casellaBuida = new Posicio(Grid.GetRow(origen), Grid.GetColumn(origen)); esc[Grid.GetRow(origen), Grid.GetColumn(origen)] = casellaBuida; } }
/// <summary> /// [DEPRECATED] /// Mètode atracció sobre taula de persones. Calcula l'atracció per cada persona decidint la que té més possibilitats d'acostar-se. /// </summary> /// <param name="fil"></param> /// <param name="col"></param> /// <param name="tp"></param> /// <returns></returns> private double Atraccio(int fil, int col, TaulaPersones tp) { /************************************** * DEPRECATED */ double resultat = 0; double distancia = 0; Posicio referencia = new Posicio(fil, col); int interes; foreach (Persona p in tp) { if (p != this) { distancia = Posicio.Distancia(referencia, p); interes = Interes(p); resultat += interes / distancia; } } return(resultat); }
/// <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 resultat = 0; Persona p; if (!pos.Buida) { p = (Persona)pos; if (p.EsConvidat()) { resultat = 1; } else { resultat = -1; } } return(resultat); }
/// <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) { Posicio aux = this[filDesti, colDesti]; if (DestiValid(filDesti, colDesti)) { //llença l'esdeveniment amb la posicio anterior i la nova Moguda(escenari[filOrig, colOrig], escenari[filDesti, colDesti]); int filaAux = escenari[filDesti, colDesti].Fila; int colAux = escenari[filDesti, colDesti].Columna; escenari[filDesti, colDesti].Fila = filOrig; escenari[filDesti, colDesti].Columna = colOrig; escenari[filOrig, colOrig].Fila = filaAux; escenari[filOrig, colOrig].Columna = colAux; escenari[filDesti, colDesti] = escenari[filOrig, colOrig]; escenari[filOrig, colOrig] = aux; } }
/// <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);