public bool quitarFlor(Nodo n, Usuario u) { bool ret = false; Flor f = u.getFlor(n.id); if (f == null) { throw new Exception("El usuario no tiene esa flor para quitar"); } //libero la flor al usuario n.flores -= 1; f.id = 0; f.born = DateTime.Now; //borro la parte de la rama que no tenga flores ret = verifyNodoSinFlores(n.id); //actualizo negados actualizarNegados(); //veo si algun nodo alcanza el consenso //comprobarConsenso(); se comprueba al crear el arbolpersonal return(ret); }
public void simDiscrepar(Grupo g, Usuario u, Nodo tema) { //creo hermano o hijo List <Nodo> nodes = g.arbol.toList2(tema, new List <Nodo>()); //si tengo flor en este tema entonces nada bool hayFlor = false; foreach (Nodo n2 in nodes) { if (u.getFlor(n2.id) != null) { hayFlor = true; } } if (!hayFlor) { //seleccion nodo al azar dentro del subarbol de n Nodo selected = g.arbol.rndElement(nodes); if (!selected.consensoAlcanzado) { int generacion = int.Parse(selected.nombre); if (u.floresDisponibles().Count > 0) { if (simRND.NextDouble() <= 0.3) { //hijo if (selected.nivel < 5) { simAgregarNodo(g, u, selected, generacion + 1); } else if (selected != tema) { //hermano List <Nodo> path = g.arbol.getPath(selected.id); if (path.Count > 2) { Nodo padre = path[1]; simAgregarNodo(g, u, padre, generacion + 1); } else if (selected.nivel < 5) { //hijo simAgregarNodo(g, u, selected, generacion + 1); } } } } } } }
public void asignarflor(Usuario u, Nodo n) { //si tiene una flor en nivel anterior la subo, si no uso una de las disponibles //si hay flor en pathn entonces la subo bool subida = false; if (n.consensoAlcanzado) { throw new appException("Este debate ya ha alcanzado el consenso"); } foreach (Nodo padre in getPath(n.id)) { Flor usada = u.getFlor(padre.id); if (usada != null && padre != n) { //hay flor en un nodo anterior la subo padre.flores -= 1; usada.id = n.id; usada.born = DateTime.Now; n.flores += 1; subida = true; break; } } if (!subida) { //uso una flor disponible List <Flor> disponibles = u.floresDisponibles(); if (disponibles.Count > 0) { disponibles[0].id = n.id; disponibles[0].born = DateTime.Now; n.flores += 1; } else { throw new appException("No tienes flores disponibles"); } } //compruebo consenso alcanzado //comprobarConsenso(); se comprueba al crear el arbolpersonal //actualizo negados actualizarNegados(); }
public void simConsentir(Grupo g, Usuario u, Nodo tema) { //muevo una flor a un nodo con generacion mayor List <Nodo> nodes = g.arbol.toList2(tema, new List <Nodo>()); //si tengo flor en este tema la quito int generacion = 1; Nodo nViejo = null; foreach (Nodo n2 in nodes) { if (u.getFlor(n2.id) != null) { generacion = int.Parse(n2.nombre); nViejo = n2; break; } } //busco nodo para apoyar Nodo nNuevo = null; int nivel = 1; foreach (Nodo n2 in nodes) { //if (int.Parse(n2.nombre) > generacion && n2.nivel > 1 && !n2.consensoAlcanzado) if (n2.nivel > nivel && !n2.consensoAlcanzado) { //generacion = int.Parse(n2.nombre); nivel = n2.nivel; nNuevo = n2; } } if (nNuevo != null) { if (nViejo != null) { g.arbol.quitarFlor(nViejo, u); //quito la flor solo si hay nuevo candidato } if (u.floresDisponibles().Count != 0) { g.arbol.asignarflor(u, nNuevo); } } }
string doToggleFlor(string email, int id, float x, string grupo) { string ret = ""; Grupo g = app.getGrupo(grupo); lock (g) { //verifico que el usuario tiene una flor en ese nodo Arbol a = g.arbol; g.ts = DateTime.Now; Usuario u = g.getUsuarioHabilitado(email); Flor f = u.getFlor(id); List <Nodo> pathn = a.getPath(id); if (pathn == null) { throw new appException(Tools.tr("Seleccione un nodo", g.idioma)); } else { Nodo n = pathn[0]; if (f == null) { n.x = x; //no tiene flor en el nodo, la agrego a.asignarflor(u, n); //devuelvo el arbolPersonal ret = Tools.toJson(a.getArbolPersonal(email)); } else { //tiene flor, la quito a.quitarFlor(n, u); //devuelvo el arbolPersonal ret = Tools.toJson(a.getArbolPersonal(email)); } } } return(ret); }
public bool quitarFlor(Nodo n, Usuario u) { bool ret = false; Flor f = u.getFlor(n.id); if (f == null) throw new Exception("El usuario no tiene esa flor para quitar"); //libero la flor al usuario n.flores -= 1; f.id = 0; f.born = DateTime.Now; //borro la parte de la rama que no tenga flores ret = verifyNodoSinFlores(n.id); //actualizo negados actualizarNegados(); //veo si algun nodo alcanza el consenso comprobarConsenso(); return ret; }
public void asignarflor(Usuario u, Nodo n) { //si tiene una flor en nivel anterior la subo, si no uso una de las disponibles //si hay flor en pathn entonces la subo bool subida = false; if (n.consensoAlcanzado) throw new appException("Este debate ya ha alcanzado el consenso"); foreach (Nodo padre in getPath(n.id)) { Flor usada = u.getFlor(padre.id); if (usada != null) { //hay flor en un nodo anterior la subo padre.flores -= 1; usada.id = n.id; usada.born = DateTime.Now; n.flores += 1; subida = true; break; } } if (!subida) { //uso una flor disponible List<Flor> disponibles = u.floresDisponibles(); if (disponibles.Count > 0) { disponibles[0].id = n.id; disponibles[0].born = DateTime.Now; n.flores += 1; } else throw new appException("No tienes flores disponibles"); } //compruebo consenso alcanzado comprobarConsenso(n); //actualizo negados actualizarNegados(); }