/// <summary> /// Melange et envoie un panel de musique à chaque joueur, avec /// plus ou moins de chansons par joueur. /// </summary> public void envoiMusique() { //On stocke la chanson qui était à trouver pour pouvoir chansonPrecedente = gm.getChanson(); //On remélange les chansons gm.melange(); List <Joueur> listJoueursPartis = new List <Joueur>(); foreach (Joueur j in listJoueurs) { //Et on les envoie à tous les joueurs try { List <String> chansons = gm.listeChansons(j.getNbChoix()); envoi(Requete.infoChanson(gm.getUrlChanson()), j.getStream()); envoi(Requete.musique(chansons), j.getStream()); } catch { //Si le joueur n'est plus en lien avec le serveur, on l'enléve de la liste listJoueursPartis.Add(j); } } foreach (Joueur j in listJoueursPartis) { listJoueurs.Remove(j); } }
/// <summary> /// Ajoute un joueur à la liste et commence une partie si c'est le premier joueur /// </summary> /// <param name="j">joueur à ajouter</param> public void addJoueur(Joueur j) { listJoueurs.Add(j); //Si le serveur était vide et que un premier utilisateur se connecte if (listJoueurs.Count == 1) { //Si c'est le premier joueur, la manche doit être remise à 0 cptManche = 0; partieFinie = false; //on peux lancer la diffusion des chansons Thread th = new Thread(runGame); th.Start(); } else // Si il y'a des joueurs, on lui envoi les chansons en cours { if (partieFinie) { envoiATous(Requete.infoPartieFinie(listJoueurs)); } else { envoi(Requete.musique(gm.listeChansons(j.getNbChoix())), j.getStream()); envoi(Requete.infoChanson(gm.getUrlChanson()), j.getStream()); } } //Dans tous les cas on initialise les scores envoiScores(); }
/// <summary> /// Traite les requêtes de type information /// </summary> /// <param name="tabMessage">les éléments de la requête</param> private void traiteInfo(String[] tabMessage) { if (tabMessage[1].Equals("START")) { //Le joueur est pret il peut donc jouer //On lui envoie le nombre de réponse à afficher send(Requete.options(joueur.getNbChoix()), joueur.getStream()); //On l'ajoute à la partie serv.getPartie(joueur.getStyle()).addJoueur(joueur); partie = serv.getPartie(joueur.getStyle()); } else if (tabMessage[1].Equals("STYLE")) { joueur.setStyle(tabMessage[2]); } else if (tabMessage[1].Equals("DIFFICULTE")) { joueur.setDifficulte(tabMessage[2]); } else if (tabMessage[1].Equals("NAME")) { if (serv.existePseudo(tabMessage[2])) { send(Requete.infoPseudoIncorrect(), joueur.getStream()); } else { joueur.setName(tabMessage[2]); } } }
/// <summary> /// Traite les requêtes de choix de réponse du client /// </summary> /// <param name="tabMessage">les éléments de la requête</param> private void traiteChanson(String[] tabMessage) { if (tabMessage[1].Equals(partie.getChanson().Replace('_', ' ').Split('.').ElementAt(0))) { send(Requete.infoBonneChanson(partie.getChanson()), joueur.getStream()); joueur.incrScore(); } else //mauvaise chanson { send(Requete.infoMauvaiseChanson(partie.getChanson()), joueur.getStream()); } //On envoie les socres à tout le monde dès qu'il y'a un changement partie.envoiScores(); }
/// <summary> /// Toutes les requêtes reçues par le serveur sont traitées ici /// On les parse en fonction de la norme choisie /// </summary> /// <param name="message">Requête reçu</param> private void traite(String message) { Console.WriteLine("Recoit : " + message); String[] tabMessage = message.Split('?'); if (tabMessage[0].Equals("")) { send(Requete.erreur("Message mal forme"), joueur.getStream()); } else { if (tabMessage[0].Equals("CHANSON")) { traiteChanson(tabMessage); } else if (tabMessage[0].Equals("INFO")) { traiteInfo(tabMessage); } else if (tabMessage[0].Equals("CHOIXSTYLE")) { GestionMusique gm = serv.getGM(); List <String> listeStyle = gm.choixStyle(); if (listeStyle == null) { send(Requete.erreur("Pas de style de musique defini"), joueur.getStream()); } else { send(Requete.choixStyle(listeStyle), joueur.getStream()); } } else if (tabMessage[0].Equals("DECONNEXION")) { Console.WriteLine("Le joueur " + joueur.getName() + " est retiré du serveur"); if (partie != null) //Si le joueur n'a pas encore été ajouté à une partie { partie.removeJoueur(joueur); } } else if (tabMessage[0].Equals("BESTSCORE")) { //Si on a mis un style en paramètre send(Requete.bestScores(serv), joueur.getStream()); } } }
/// <summary> /// A la fin d'une partie, affiche pendant 5 secondes les scores et réinitialise tout /// </summary> public void finDePartie() { chansonPrecedente = gm.getChanson(); envoiATous(Requete.finDePartie()); partieFinie = true; //On attend de recevoir tous les scores Thread.Sleep(5000); //On envoi le récapitulatif des scores envoiATous(Requete.infoPartieFinie(listJoueurs)); //On écrit éventuellement les meilleurs scores dans le fichier xml correspondant ecritScore(); resetScores(); Thread.Sleep(7500); //Après avoir attendu 7.5 secondes, on recommence une partie cptManche = 0; partieFinie = false; envoiATous(Requete.nouvellePartie()); envoiScores(); runGame(); }
/// <summary> /// Envoi à tous les joueurs, tous les scores /// </summary> public void envoiScores() { envoiATous(Requete.infoScores(listJoueurs)); }