/// <summary> /// Guarda una puntuación entre las más altas /// </summary> /// <param name="dificultad">Dificultad en la que se ha jugado (3 para ganadores)</param> /// <param name="puntos">Puntos conseguidos</param> /// <param name="nombre">Nombre del jugador</param> public void guardarPuntuacion(int dificultad, int puntos, string nombre) { // Se recupera la lista de puntuaciones List <Puntuacion> lista = getPuntuaciones(dificultad); // Se añade la nueva puntuación y se ordenan todas Puntuacion nuevo = new Puntuacion(); nuevo.Puntos = puntos; nuevo.Nombre = nombre; lista.Add(nuevo); lista.Sort((p, q) => q.Puntos.CompareTo(p.Puntos)); XmlDataDocument doc = getXML(rutaPuntos); // Se busca el tag de modo que coincida con esta dificultad XmlNodeList modo = doc.GetElementsByTagName("modo"); XmlNode esteModo = null; foreach (XmlNode n in modo) { if (n.Attributes.GetNamedItem("dif").InnerText.Equals($"{dificultad}")) { esteModo = n; break; } } // Si no existe, se lanza error if (esteModo == null) { throw new XmlException(); } // Se borran todas las etiquetas hijas while (esteModo.FirstChild != null) { esteModo.RemoveChild(esteModo.FirstChild); } // Se limitan las puntuaciones guardadas a 5 int numDatos = lista.Count < 5 ? lista.Count : 5; // Se vuelven a rellenar con los nuevos datos for (int i = 0; i < numDatos; i++) { XmlNode n = esteModo.OwnerDocument.CreateElement("puntuacion"); esteModo.AppendChild(n); XmlNode nodoPuntos = n.OwnerDocument.CreateElement("puntos"); nodoPuntos.InnerText = lista[i].Puntos.ToString(); XmlNode nodoNombre = n.OwnerDocument.CreateElement("nombre"); nodoNombre.InnerText = lista[i].Nombre; n.AppendChild(nodoPuntos); n.AppendChild(nodoNombre); } doc.Save(rutaPuntos); }
/// <summary> /// Devuelve las puntuaciones guardadas /// </summary> /// <param name="dificultad">Dificultad de la cual consultar las puntuaciones (0-2) o 3 para ganadores</param> /// <returns>Lista de puntuaciones de esa dificultad</returns> public List <Puntuacion> getPuntuaciones(int dificultad) { XmlDataDocument doc = getXML(rutaPuntos); XmlNodeList listXmlModo; // Guarda el índice que buscamos de la lista de nodos int accedido = -1; listXmlModo = doc.GetElementsByTagName("modo"); for (int i = 0; i < listXmlModo.Count; i++) { if (listXmlModo[i].Attributes.GetNamedItem("dif").InnerText.Equals($"{dificultad}")) { accedido = i; break; } } // Si el índice que buscamos no está, lanza excepción if (accedido == -1) { throw new XmlException(); } List <Puntuacion> retorna = new List <Puntuacion>(); try { // Parsea todos los resultados for (int i = 0; i < listXmlModo[accedido].ChildNodes.Count; i++) { Puntuacion p = new Puntuacion(); p.Puntos = int.Parse(listXmlModo[accedido].ChildNodes[i].ChildNodes[0].InnerText); p.Nombre = listXmlModo[accedido].ChildNodes[i].ChildNodes[1].InnerText; retorna.Add(p); } // Se devuelven los resultados (truncados hasta 5 y ordenados) retorna.Sort((p, q) => q.Puntos.CompareTo(p.Puntos)); if (retorna.Count > 5) { return(retorna.GetRange(0, 5)); } return(retorna); } catch (FormatException) { throw new XmlException(); } }