package serveur;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import serveur.ServeurJeu;
import common.Joueur;
import common.Partie;
import common.Point;
/**
* Classe permettant la gestion des parties et des joueurs présents sur
* l'ensemble du serveur de jeu.
*
* A l'arrivée d'un joueur, ce dernier est automatiquement placé sur la première
* partie disponible. Si aucune partie n'est disponible, ce dernier reste en
* attente jusqu'à l'arrivée d'un adversaire.
*
*
* @author Aitelhaj brahim
*
*/
public class GestionnaireServeur {
private HashMap parties;
private ServeurJeu sj;
// private int nbJoueurs;
private Partie partieEnAttente;
private int nbParties;
private JxoServeur js;
private int nbCasesPartie;
/**
*
* @param js
*/
public GestionnaireServeur(JxoServeur js) {
this.js = js;
parties = new HashMap();
partieEnAttente = new Partie();
}
/**
*
* @param sj
* @param nbCasesPartie
*/
public GestionnaireServeur(ServeurJeu sj, int nbCasesPartie) {
this.nbCasesPartie = nbCasesPartie;
partieEnAttente = new Partie(nbCasesPartie);
new GestionnaireServeur(sj);
}
/**
*
* @param sj
*/
public GestionnaireServeur(ServeurJeu sj) {
this.sj = sj;
// parties = new ArrayList();
parties = new HashMap();
if (partieEnAttente == null)
partieEnAttente = new Partie();
}
/**
*
*
* @param p
*/
public synchronized void finPartie(Partie p) {
parties.remove(new Integer(p.getId()));
}
/**
* Un joueur a joué un point, on prévient son adversaire
*
* @param pseudoJoueur
* @param p
*/
public synchronized Partie aJouer(String pseudoJoueur, Point p) {
String adversaire = null;
Partie partie = getPartie(pseudoJoueur);
if (partie != null) {
adversaire = partie.getAdversaire(pseudoJoueur);
// System.out.println("GS("+pseudoJoueur+") aJouer, adversaire =>
// "+adversaire);
if (adversaire != null) {
return jouer(partie, p);
}
}
return partie;
}
/**
*
* @param partie
* @param p
* @return
*/
public synchronized Partie aJouer(Partie partie, Point p) {
if (partie == null) {
return null;
}
return jouer(partie, p);
}
private synchronized Partie jouer(Partie partie, Point p) {
Integer id = new Integer(partie.getId());
Partie partieDeLaMap = (Partie) parties.get(id);
partieDeLaMap.ajouterPoint(p);
parties.put(id, partieDeLaMap);
return partieDeLaMap;
}
public synchronized void putPartie(Partie p) {
parties.put(new Integer(p.getId()), p);
}
public synchronized Partie getPartie(Partie p) {
return (Partie) parties.get(new Integer(p.getId()));
}
/**
*
* @param pseudoJoueur
*/
public Partie getPartie(String pseudoJoueur) {
Iterator it = parties.values().iterator();
Partie partie = null;
while (it.hasNext()) {
partie = (Partie) it.next();
// Si la partie contient le joueur, on récupére le pseudo
if (partie.contientJoueur(pseudoJoueur)) {
return partie;
}
}
return null;
}
/**
*
* @param p
* @return
*/
public Partie remettreAZeroPartie(Partie p) {
p.remettreAZero();
parties.put(new Integer(p.getId()), p);
return p;
}
/**
*
* @param p
*/
public void arreterPartie(Partie p) {
parties.remove(new Integer(p.getId()));
//nbParties--;
}
public void retirerJoueurEnAttente() {
partieEnAttente.retirerJoueurs();
}
/**
* Ajoute un joueur à la première partie disponible ou le met en attente A
* l'arrivée du deuxième joueur, on créer la partie.
*
* @param j
*/
public synchronized Partie ajouterJoueur(String pseudo) {
partieEnAttente.ajouterJoueur(pseudo);
// nbJoueurs++;
// 2 Joueurs, on peut démarrer la partie
if (partieEnAttente.estComplete()) {
nbParties++;
//System.out.println("NbParties = " + nbParties);
Partie p = new Partie();
p.setId(nbParties);
p.ajouterJoueur(partieEnAttente.getJoueurCroixPseudo());
p.ajouterJoueur(partieEnAttente.getJoueurRondPseudo());
parties.put(new Integer(nbParties), p);
try {
// sj.partieCommence(partieEnAttente.getJoueurCroixPseudo(),
// partieEnAttente.getJoueurRondPseudo());
js.partieCommence(p.getJoueurCroixPseudo(), p
.getJoueurRondPseudo());
} catch (IOException ioe) {
ioe.printStackTrace();
}
// System.out.println("GS = croix =
// "+partieEnAttente.getJoueurCroixPseudo());
// System.out.println("GS = rond =
// "+partieEnAttente.getJoueurRondPseudo());
partieEnAttente.retirerJoueurs();
return p;
}
return null;
}
}