TraitementJoueur.cpp

Go to the documentation of this file.
00001 /***************************************************************************
00002  *   Copyright (C) 2007 by Pierre Schmitt, Ludovic Giacomello, Nhi Ly      *
00003  *                                                                         *
00004  *                                                                         *
00005  *   This program is free software; you can redistribute it and/or modify  *
00006  *   it under the terms of the GNU General Public License as published by  *
00007  *   the Free Software Foundation; either version 2 of the License, or     *
00008  *   (at your option) any later version.                                   *
00009  *                                                                         *
00010  *   This program is distributed in the hope that it will be useful,       *
00011  *   but WITHOUT ANY WARRANTY; without even the implied warranty of        *
00012  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         *
00013  *   GNU General Public License for more details.                          *
00014  *                                                                         *
00015  *   You should have received a copy of the GNU General Public License     *
00016  *   along with this program; if not, write to the                         *
00017  *   Free Software Foundation, Inc.,                                       *
00018  *   59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.             *
00019  ***************************************************************************/
00020 
00021 #include "TraitementJoueur.h"
00022 
00023 TraitementJoueur::TraitementJoueur(Socket *s, bool hotplug) : Thread(){
00024         mHotPlug=hotplug;
00025         if(s==NULL){
00026                 if(!mHotPlug){
00027                         cout<<"      SJ TraitementJoueur::Création d'un thread pour gérer un fantome automatique"<<endl;
00028                         mLogin="auto";
00029                 } else {
00030                         cout<<"      SJ TraitementJoueur::Création d'un thread pour remplacer un joueur déconnecté"<<endl;
00031                         mLogin="hotplug";
00032                 }
00033 
00034         } else {
00035                 cout<<"      SJ TraitementJoueur::Création d'un thread pour traiter le client"<<endl;
00036                 mLogin="";
00037         }
00038         mJeu=Jeu::GetInstance();
00039         mSocket=s;
00040         mZombie=false;
00041         mIdJoueur=-1;
00042 }
00043 
00044 TraitementJoueur::~TraitementJoueur(){
00045         cout<<"      SJ TraitementJoueur::Destruction du thread de traitement du joueur "<<mLogin<<endl;
00046         if(mSocket!=NULL) delete mSocket;
00047 }
00048 
00049 void *TraitementJoueur::Traitement(){
00050         if(mSocket!=NULL){
00051                 //On traite un joueur distant
00052                 if(!WaitForHello()) return NULL;
00053                 mLogin=WaitForLogin();
00054                 if(mLogin=="ERROR") return NULL;
00055                 if(!WaitForRole()) return NULL;
00056                 if(!WaitForPlayers()) return NULL;
00057                 if(!TraitementDeplacement()) return NULL;
00058                 cout<<"      SJ TraitementJoueur::Fin du traitement de "<<mLogin<<endl;
00059         } else {        
00060                 mVerrou.Lock();
00061                 string place=mJeu->JoueurConnectes();
00062                 if(!mHotPlug){
00063                         //On simule un fantome 
00064                         for(unsigned int i=0; i<3; i++){
00065                                 if(place[i]=='0'){
00066                                         mJeu->SetJoueur(i,"auto");
00067                                         mIdJoueur=i;
00068                                         break;
00069                                 }
00070                         }
00071                         mVerrou.Unlock();
00072                         WaitForPlayers();
00073                         DeplacementAuto();
00074                         cout<<"      SJ TraitementJoueur::Fin du traitement du fantome automatique "<<mIdJoueur<<endl;
00075                 } else {
00076                         //On remplace un joueur à chaud
00077                         for(unsigned int i=0; i<4; i++){
00078                                 if(place[i]=='0'){
00079                                         mJeu->SetJoueur(i,"hotplug");
00080                                         mIdJoueur=i;
00081                                         break;
00082                                 }
00083                         }
00084                         mVerrou.Unlock();
00085                         DeplacementAuto();
00086                         cout<<"      SJ TraitementJoueur::Fin du traitement du joueur automatique de remplacement "<<mIdJoueur<<endl;           
00087                 }
00088         }
00089         return NULL;
00090 }
00091 
00092 void TraitementJoueur::ModeZombie(){
00093         cout<<"      SJ TraitementJoueur::Passé en mode "; printf( "\e[31mZombie\e[m\n" );
00094         if(mIdJoueur!=-1) mJeu->UnSetJoueur(mIdJoueur);
00095         mZombie=true;
00096         while(1) sleep(1);
00097 }
00098 bool TraitementJoueur::WaitForHello(){
00099         //1 On attent que le client nous dise bonjour 
00100         cout<<"      SJ TraitementJoueur::Attente de l'initiation du protocole de la part du client";
00101         try{
00102                 while(mSocket->Ecouter()!="HELLO"){
00103                         mSocket->Envoyer("ERROR HELLO");
00104                 }
00105                 mSocket->Envoyer("HELLO");
00106                 //cout<<"  SJ Protocole initialisé"<<endl;
00107                 printf("\e[32m [OK]\e[m\n");
00108         } catch(SocketException s){
00109                 cout<<"      SJ TraitementJoueur::"; printf( "\e[31m[Erreur] \e[m"); cout<<"Déconnexion du client: le thread passe en mode "; printf( "\e[31mZombie\e[m\n" );
00110                 ModeZombie();
00111                 return false;
00112         }
00113         return true;
00114 }
00115 
00116 
00117 string TraitementJoueur::WaitForLogin(){
00118         //2 Le client doit se logger 
00119         string line,cmd;
00120         do{
00121                 try{
00122                         line=mSocket->Ecouter();
00123                         string login;
00124                         istringstream iss(line);
00125                         getline(iss,cmd,' '); 
00126                         if(cmd=="LOGIN"){
00127                                 getline(iss,login,' ');
00128                                 cout<<"      SJ TraitementJoueur::Connexion de "<<login<<endl;
00129                                 mSocket->Envoyer("LOGIN OK");
00130                                 return login;
00131                         } else mSocket->Envoyer("ERROR LOGIN");
00132                 } catch(SocketException s){
00133                         cout<<"      SJ TraitementJoueur::"; printf( "\e[31m[Erreur] \e[m"); cout<<"Déconnexion du client: le thread passe en mode "; printf( "\e[31mZombie\e[m\n" );
00134                         ModeZombie();
00135                         return false;
00136                 }
00137         } while(1);
00138 }
00139 
00140 bool TraitementJoueur::WaitForRole(){
00141         mVerrou.Lock();
00142         cout<<"      SJ TraitementJoueur::Envoi des places restantes"<<endl;
00143         //3 On recherche les places encore libres et on les envoie au client
00144         string place=mJeu->JoueurConnectes();
00145         string reponse="BUSY ";
00146         reponse+=place;
00147         try{
00148                 mSocket->Envoyer(reponse);
00149                 cout<<"      SJ TraitementJoueur::Attente du rôle"<<endl;
00150                 bool stop=false;
00151                 //4 On attend que le client nous envoie le rôle qu'il veut jouer
00152                 do{
00153                         string line=mSocket->Ecouter();
00154                         string cmd,role;
00155                         istringstream iss(line);
00156                         getline(iss,cmd,' '); 
00157                         if(cmd=="GET"){
00158                                 getline(iss,role,' ');
00159                                 reponse="SET "; reponse+=mLogin; reponse+=" "; reponse+=role;
00160                                 if(role=="PACMAN"){
00161                                         if(place[3]=='0'){
00162                                                 stop=true;
00163                                                 mIdJoueur=3;
00164                                                 mJeu->SetJoueur(mIdJoueur,mLogin);
00165                                                 mSocket->Envoyer(reponse);
00166                                                 cout<<"      SJ TraitementJoueur::Attente du rôle"; printf("\e[32m [OK]\e[m\n");
00167                                         } else  mSocket->Envoyer("ERROR GET ROLE");
00168                                 } else if(role=="F1"){
00169                                         if(place[0]=='0'){
00170                                                 stop=true;
00171                                                 mIdJoueur=0;
00172                                                 mJeu->SetJoueur(mIdJoueur,mLogin);
00173                                                 mSocket->Envoyer(reponse);
00174                                                 cout<<"      SJ TraitementJoueur::Attente du rôle"; printf("\e[32m [OK]\e[m\n");
00175                                         } else  mSocket->Envoyer("ERROR GET ROLE");
00176                                 } else if(role=="F2"){
00177                                         if(place[1]=='0'){
00178                                                 stop=true;
00179                                                 mIdJoueur=1;
00180                                                 mJeu->SetJoueur(mIdJoueur,mLogin);
00181                                                 mSocket->Envoyer(reponse);
00182                                                 cout<<"      SJ TraitementJoueur::Attente du rôle"; printf("\e[32m [OK]\e[m\n");
00183                                         } else  mSocket->Envoyer("ERROR GET ROLE");
00184                                 } else if(role=="F3"){
00185                                         if(place[2]=='0'){
00186                                                 stop=true;
00187                                                 mIdJoueur=2;
00188                                                 mJeu->SetJoueur(mIdJoueur,mLogin);
00189                                                 mSocket->Envoyer(reponse);
00190                                                 cout<<"      SJ TraitementJoueur::Attente du rôle"; printf("\e[32m [OK]\e[m\n");
00191                                         } else  mSocket->Envoyer("ERROR GET ROLE");
00192                                 } else mSocket->Envoyer("ERROR GET ROLE");
00193                         } else mSocket->Envoyer("ERROR GET ROLE");
00194                 } while(!stop);
00195                 mVerrou.Unlock();
00196         } catch(SocketException s){
00197                 cout<<"      SJ TraitementJoueur::"; printf( "\e[31m[Erreur] \e[m"); cout<<"Déconnexion du client: le thread passe en mode "; printf( "\e[31mZombie\e[m\n" );
00198                 ModeZombie();
00199                 return false;
00200         }
00201         return true;
00202 }
00203 
00204 bool TraitementJoueur::WaitForPlayers(){
00205         cout<<"      SJ TraitementJoueur::Attente des autres joueurs..."<<endl;
00206         while(!(mJeu->JeuPret())){
00207                 sleep(1);//pour le petit processeur...
00208         }
00209         cout<<"      SJ TraitementJoueur::"<<mLogin<<" "<<mIdJoueur<<" dit: Le jeu est prêt!!!"<<endl;
00210         try{
00211                 if(mSocket!=NULL) mSocket->Envoyer("READY");
00212         } catch(SocketException s){
00213                 cout<<"      SJ TraitementJoueur::"; printf( "\e[31m[Erreur] \e[m"); cout<<"Déconnexion du client: le thread passe en mode "; printf( "\e[31mZombie\e[m\n" );
00214                 ModeZombie();
00215         }
00216         return true;
00217 }
00218 
00219 bool TraitementJoueur::TraitementDeplacement(){
00220         while(!mJeu->GameOver()){
00221                 try{
00222                         string line=mSocket->Ecouter();
00223                         //On envoie la grille 
00224                         if(line=="GRID") {
00225                                 string res=mJeu->EtatPartie(); res+=" ";
00226                                 res+=mJeu->toString(); res+=" ";
00227                                 mSocket->Envoyer(res);
00228                         }
00229                         //On attend le déplacement 
00230                         if((line=="HAUT")||(line=="BAS")||(line=="GAUCHE")||(line=="DROITE")){
00231                                 if(mJeu->DeplacerPersonnage(mIdJoueur,line[0])) mSocket->Envoyer("MOVE OK");
00232                                 else mSocket->Envoyer("MOVE BAD");
00233                         } else mSocket->Envoyer("MOVE BAD");
00234                 } catch(SocketException s){
00235                         cout<<"      SJ TraitementJoueur::"; printf( "\e[31m[Erreur] \e[m"); cout<<"Déconnexion du client: le thread passe en mode "; printf( "\e[31mZombie\e[m\n" );
00236                         ModeZombie();
00237                 }
00238         }
00239         return true;
00240 }
00241 
00242 void TraitementJoueur::DeplacementAuto(){
00243         cout<<"      SJ TraitementJoueur::Démarrage du déplacement automatique du personnage "<<mIdJoueur<<endl;
00244         bool deplacementOk=false;
00245         char c;
00246         while(!mJeu->GameOver()){
00247                 if(deplacementOk){
00248                         //On continue dans la même direction 
00249                         deplacementOk=mJeu->DeplacerPersonnage(mIdJoueur,c);
00250                 } else {
00251                         switch(mJeu->UintAleat(1,4)){
00252                                 case 1 : {
00253                                         deplacementOk=mJeu->DeplacerPersonnage(mIdJoueur,'H'); c='H';
00254                                         break;
00255                                 }
00256                                 case 2 : {
00257                                         deplacementOk=mJeu->DeplacerPersonnage(mIdJoueur,'B'); c='B';
00258                                         break;
00259                                 }
00260                                 case 3 : {
00261                                         deplacementOk=mJeu->DeplacerPersonnage(mIdJoueur,'G'); c='G';
00262                                         break;
00263                                 }
00264                                 case 4 : {
00265                                         deplacementOk=mJeu->DeplacerPersonnage(mIdJoueur,'D'); c='D';
00266                                         break;
00267                                 }
00268                         }
00269                 }
00270                 sleep(1);
00271         }
00272 }

Generated on Wed Jan 2 14:01:42 2008 for Pacman by  doxygen 1.5.1