cardgame.cpp
Go to the documentation of this file.
1 /* -*-mode:c++; c-file-style: "gnu";-*- */
2 /*
3  * $Id: cardgame.cpp,v 1.8 2014/03/28 20:37:02 sebdiaz Exp $
4  *
5  * Copyright (C) 2007 Sebastien DIAZ <sebastien.diaz@gmail.com>
6  * Part of the GNU cgicc library, http://www.gnu.org/software/cgicc
7  *
8  * This library is free software; you can redistribute it and/or
9  * modify it under the terms of the GNU Lesser General Public
10  * License as published by the Free Software Foundation; either
11  * version 3 of the License, or (at your option) any later version.
12  *
13  * This library is distributed in the hope that it will be useful,
14  * but WITHOUT ANY WARRANTY; without even the implied warranty of
15  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
16  * Lesser General Public License for more details.
17  *
18  * You should have received a copy of the GNU Lesser General Public
19  * License along with this library; if not, write to the Free Software
20  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110, USA
21  */
22 
30 #include <iostream>
31 #include <vector>
32 #include <iterator>
33 #include <string>
34 #include <cstdlib>
35 #include <ctime>
36 #include <sstream>
37 #include <fstream>
38 #include <queue>
39 #include <algorithm>
40 #include "cgicc/CgiDefs.h"
41 #include "cgicc/Cgicc.h"
42 #include "cgicc/HTTPHTMLHeader.h"
43 #include "cgicc/HTMLClasses.h"
44 #include "cgicc/HTTPCookie.h"
45 #define COOKIE_NAME "ELPIELOJUEGO"
46 #define COOKIE_FILE_NAME "sessions.tmp"
47 #define GAME_FILE_NAME "games.tmp"
48 #define MAX_GAME 10
49 
50 using namespace std;
51 using namespace cgicc;
52 
53 
54 
62 {
67  vector <string > *cardsList;
68 
72  string identifiant;
73 
77  bool isPlaying;
78 
82  int points;
83 
87  string actualCard;
88 };
89 
90 
96 struct datasgame
97 {
102  vector <datasplayer *> *playersList;
103 
107  vector<string> *playedCards;
108 
112  vector<string> *piocheCards;
113 
114 };
115 
120 namespace CardGameTools
121 {
135  {
136 
137  std::vector<string>::iterator itVectorData;
138  stringstream buffer;
139  buffer <<pPlayer->identifiant<<"::";
140  for(itVectorData = pPlayer->cardsList->begin(); itVectorData != pPlayer->cardsList->end(); itVectorData++)
141  {
142 
143  buffer << *itVectorData;
144  if (itVectorData != pPlayer->cardsList->end())
145  {
146  buffer <<"||";
147 
148  }
149  }
150 
151  //Global Separator
152 
153  return buffer.str();
154  }
155 
169  {
170  datasplayer *datas= new datasplayer;
171  char *carList=(char *)pPlayer.c_str();
172  int wordCounter=0;
173  string word;
174  stringstream actualWord;
175  for (unsigned int i=0;i<pPlayer.size();i++)
176  {
177  if (i+1<pPlayer.size())
178  {
179  if (carList[i]==':'&&carList[i+1]==':')
180  {
181  word=actualWord.str();
182  //first , the player name
183  if (wordCounter==0)
184  {
185  //first is no data word
186  }
187  else
188  if (wordCounter==1)
189  {
190  datas->identifiant=word;
191  }else
192  {
193  datas->cardsList->push_back(word);
194  }
195  wordCounter++;
196  actualWord.clear();
197  i++;
198  }else {
199  actualWord <<carList[i];
200  }
201  }
202  }
203 
204 
205  return datas;
206  }
207 
216  string getNUMCookie(std::vector< HTTPCookie > pCookieVector)
217  {
218 
219  if (pCookieVector.size()== 0)
220  {
221 
222  return "";
223  }
224  std::vector<HTTPCookie>::iterator itVectorData;
225  for(itVectorData = pCookieVector.begin(); itVectorData != pCookieVector.end(); itVectorData++)
226  {
227 
228  HTTPCookie theCookie = *(itVectorData);
229 
230  if (theCookie.getName ().compare(COOKIE_NAME)==0)
231  {
232  return theCookie.getValue ();
233  }
234  }
235 
236 
237  return "";
238  }
239 
247  string getValue(string pName)
248  {
249 
250  ifstream inFile;
251  inFile.open(COOKIE_FILE_NAME);
252  if (!inFile) {
253  ofstream outFile(COOKIE_FILE_NAME, ios::out);
254  outFile.put('\n');
255  outFile.close();
256  inFile.open(COOKIE_FILE_NAME);
257  }
258 
259  // Lecture ligne a ligne
260  while (inFile&&!inFile.eof ())
261  {
262  char ligne[32000];
263  std::string s;
264 
265  inFile.getline (ligne, sizeof (ligne));
266  s = ligne;
267 
268  if (s.find (pName)!= string::npos)
269  {
270 
271  s.replace(0,pName.size(),"");
272  inFile.close();
273  return s;
274  }
275  }
276  inFile.close();
277  return "";
278 
279  }
280 
288  string getFileGame(string pName)
289  {
290 
291  ifstream inFile;
292  inFile.open(GAME_FILE_NAME);
293  if (!inFile) {
294  ofstream outFile(GAME_FILE_NAME, ios::out);
295  outFile.put('\n');
296  outFile.close();
297  inFile.open(GAME_FILE_NAME);
298  }
299  // Lecture ligne a ligne
300  while (inFile&&!inFile.eof ())
301  {
302  char ligne[32000];
303  std::string s;
304 
305  inFile.getline (ligne, sizeof (ligne));
306  s = ligne;
307 
308  if (s.find (pName)!= string::npos)
309  {
310 
311  inFile.close();
312  return s;
313  }
314  }
315  inFile.close();
316  return "";
317 
318  }
319 
326  datasgame *getGame(string pName)
327  {
328 
329  datasgame *dgame= new datasgame;
330  dgame->playersList=new vector<datasplayer*>;
331 
332 
333  string vGame=getFileGame(pName);
334  if (vGame.compare("")==0)
335  {
336  return NULL;
337  }
338 
339 
340 
341  char *carList=(char *)vGame.c_str();
342  int wordCounter=0;
343  string word;
344  stringstream actualWord;
345  int vNBPLayers=0;
346  int playerCounter=0;
347  int playerCounterElement=0;
348  int vNBCards=0;
349  int vCardsCounter=0;
350  vector <string > *cardsList= new vector<string>;
351  string identifiant;
352  string actualCard;
353  bool isPlaying=false;
354  int points=0;
355 
356  int vNBCardsQueue1=0;
357  int vCardsCounterQ1=0;
358  int vNBCardsQueue2=0;
359  int vCardsCounterQ2=0;
360  bool vCountedCardsQ1;
361  bool vCountedCardsQ2;
362  vCountedCardsQ1=false;
363  vCountedCardsQ2=false;
364  vector <string > *queue1= new vector<string>;
365  dgame->playedCards=queue1;
366 
367  vector <string > *queue2= new vector<string>;
368  dgame->piocheCards=queue2;
369 
370  for (unsigned int i=0;i<vGame.size();i++)
371  {
372  if (i+1<vGame.size())
373  {
374  if (carList[i]==':'&&carList[i+1]==':')
375  {
376 
377  word=actualWord.str();
378 
379 
380 
381  //first , NB Players Value
382  if (wordCounter==0)
383  {
384 
385  vNBPLayers=atoi(word.c_str());
386  }else
387  {
388  //Add of a player
389  if (playerCounter<vNBPLayers)
390  {
391 
392  //In first the name
393  if (playerCounterElement==0)
394  {
395 
396  identifiant=word;
397  }
398  if (playerCounterElement==1)
399  {
400 
401  isPlaying=(word.compare("1")==0)?true:false;
402  }
403  if (playerCounterElement==2)
404  {
405 
406  points=atoi(word.c_str());
407  }
408  if (playerCounterElement==3)
409  {
410 
411  actualCard=word;
412  }
413  if (playerCounterElement==4)
414  {
415 
416  vNBCards=atoi(word.c_str());
417  }
418  if (playerCounterElement>=5&&vCardsCounter<vNBCards)
419  {
420 
421  cardsList->push_back(word);
422  vCardsCounter++;
423  }
424  if (vCardsCounter==vNBCards&&playerCounterElement>=5)
425  {
426 
427  datasplayer *vPlay= new datasplayer;
428 
429  vPlay->identifiant=identifiant;
430  vPlay->points=points;
431  vPlay->isPlaying=isPlaying;
432  vPlay->cardsList=cardsList;
433  vPlay->actualCard=actualCard;
434  dgame->playersList->push_back(vPlay );
435  playerCounter++;
436  vCardsCounter=0;
437  playerCounterElement=0;
438 
439  cardsList=new vector <string >;
440 
441 
442  }else{playerCounterElement++; }
443 
444 
445  }
446  else
447  {//Saved queue
448 
449  if (vNBCardsQueue1==0&&!vCountedCardsQ1)
450  {
451  vNBCardsQueue1=atoi(word.c_str());
452  vCountedCardsQ1=true;
453 
454 
455  }else
456  {
457 
458  if (vCardsCounterQ1<vNBCardsQueue1)
459  {
460 
461  queue1->push_back(word);
462 
463  vCardsCounterQ1++;
464  }else
465  if (!vCountedCardsQ2&&vNBCardsQueue2==0&&vCardsCounterQ1==vNBCardsQueue1)
466  {
467 
468  vNBCardsQueue2=atoi(word.c_str());
469  vCountedCardsQ2=true;
470  //dgame->playedCards=queue1;
471 
472 
473  }else
474  if (vCardsCounterQ2<vNBCardsQueue2)
475  {
476 
477  queue2->push_back(word);
478 
479  vCardsCounterQ2++;
480  }
481  if (vCardsCounterQ2==vNBCardsQueue2&&vCardsCounterQ2!=0)
482  {
483 
484  //dgame->piocheCards=queue2;
485 
486  }
487 
488  }
489  }
490  }
491  }
492 
493 
494  wordCounter++;
495  actualWord.str("");
496  actualWord.clear();
497  actualWord.flush();
498 
499 
500  i++;
501  }else {
502 
503  actualWord <<carList[i];
504  }
505  }
506  return dgame;
507 
508  }
509 
516  void writeValue(string pName,string pValue)
517  {
518 
519  ofstream outFile(COOKIE_FILE_NAME, ios::out|ios::app);
520 
521  outFile << pName<<"::"<<pValue<<"\n";
522 
523  outFile.close();
524 
525  }
526 
533  void writeFileGame(string pName,string pValue)
534  {
535 
536  ifstream inFile;
537 
538  //Find Index of the game
539  inFile.open(GAME_FILE_NAME,ios::in);
540  if (!inFile) {
541 
542  ofstream outFile(GAME_FILE_NAME, ios::out|ios::app);
543 
544 
545  outFile << "\n";
546 
547  outFile.close();
548  inFile.open(GAME_FILE_NAME,ios::in);
549  }
550  //read of the file
551  if (inFile) {
552  stringstream buffer;
553  bool haveWrited;
554  haveWrited=false;
555  while (inFile&&!inFile.eof ())
556  {
557  char ligne[32000];
558  std::string s;
559  inFile.getline (ligne, sizeof (ligne));
560  s = ligne;
561 
562  if (s.find (pName)!= string::npos)
563  {
564 
565  buffer << pValue;
566 
567  haveWrited=true;
568 
569  }
570  else
571  {
572  buffer << s ;
573  }
574 
575  }
576  inFile.close();
577  ofstream outFile(GAME_FILE_NAME, ios::out|ios::trunc);
578 
579 
580  outFile << buffer.str();
581  if (!haveWrited)
582  {
583  outFile << pValue<<"\n";
584  }
585 
586  outFile.close();
587 
588 
589  }
590 
591 
592 
593  }
594 
595 
602  void writeGame(datasplayer *pPlayer,datasgame *pGame)
603  {
604 
605  stringstream buffer;
606 
607  datasplayer * itVectorData;
608  buffer <<pGame->playersList->size()<<"::";
609  for(unsigned int i=0;i<pGame->playersList->size(); i++)
610  {
611 
612  itVectorData=pGame->playersList->at(i);
613 
614 
615  std::vector<string>::iterator itVectorData2;
616  buffer <<itVectorData->identifiant<<"::"<<((itVectorData->isPlaying)?"1":"0")<<"::"<<itVectorData->points<<"::"<<itVectorData->actualCard<<"::";
617  //NBCards
618  buffer <<itVectorData->cardsList->size()<<"::";
619  for(itVectorData2 = itVectorData->cardsList->begin(); itVectorData2 != itVectorData->cardsList->end(); itVectorData2++)
620  {
621  buffer <<*itVectorData2<<"::";
622 
623  }
624 
625  }
626 
627  //NBCards played
628  buffer <<pGame->playedCards->size()<<"::";
629  for (unsigned int i=0;i<pGame->playedCards->size();i++)
630  {
631  buffer <<pGame->playedCards->at(i)<<"::";
632 
633  }
634 
635 
636 
637  //NBCards in queue
638 
639  buffer <<pGame->piocheCards->size()<<"::";
640 
641  for (unsigned int i=0;i<pGame->piocheCards->size();i++)
642  {
643  buffer <<pGame->piocheCards->at(i)<<"::";
644 
645 
646  }
647 
648 
649 
650  writeFileGame(pPlayer->identifiant,buffer.str());
651 
652  }
653 
660  {
661 
662  srand ( time(NULL) );
663  int nb_aleatoire;
664  nb_aleatoire=(rand()%100)+1;
665 
666 
667  stringstream buffer;
668  buffer << nb_aleatoire<<"_"<<time(NULL);
669 
670  string vNum=buffer.str() ;
671 
672  return vNum;
673  }
674 
680  int countGame()
681  {
682 
683  ifstream inFile;
684  inFile.open(GAME_FILE_NAME);
685  if (!inFile) {
686  return 0;
687  }
688  int vNBLigne=0;
689 
690  // Lecture ligne a ligne
691  while (inFile&&!inFile.eof ())
692  {
693 
694  string tempo;
695  inFile >> tempo;
696 
697  vNBLigne++;
698  }
699 
700  inFile.close();
701 
702 
703  return vNBLigne;
704 
705  }
706 
712  vector<string> *loadAndMixCards()
713  {
714  vector<string> UnorderedPioche;
715  UnorderedPioche.push_back("TA");
716  UnorderedPioche.push_back("TZ");
717  UnorderedPioche.push_back("T2");
718  UnorderedPioche.push_back("T3");
719  UnorderedPioche.push_back("T4");
720  UnorderedPioche.push_back("T5");
721  UnorderedPioche.push_back("T6");
722  UnorderedPioche.push_back("T7");
723  UnorderedPioche.push_back("T8");
724  UnorderedPioche.push_back("T9");
725  UnorderedPioche.push_back("TD");
726  UnorderedPioche.push_back("TR");
727  UnorderedPioche.push_back("TB");
728  UnorderedPioche.push_back("CA");
729  UnorderedPioche.push_back("CZ");
730  UnorderedPioche.push_back("C2");
731  UnorderedPioche.push_back("C3");
732  UnorderedPioche.push_back("C4");
733  UnorderedPioche.push_back("C5");
734  UnorderedPioche.push_back("C6");
735  UnorderedPioche.push_back("C7");
736  UnorderedPioche.push_back("C8");
737  UnorderedPioche.push_back("C9");
738  UnorderedPioche.push_back("CD");
739  UnorderedPioche.push_back("CR");
740  UnorderedPioche.push_back("CB");
741  UnorderedPioche.push_back("PA");
742  UnorderedPioche.push_back("PZ");
743  UnorderedPioche.push_back("P2");
744  UnorderedPioche.push_back("P3");
745  UnorderedPioche.push_back("P4");
746  UnorderedPioche.push_back("P5");
747  UnorderedPioche.push_back("P6");
748  UnorderedPioche.push_back("P7");
749  UnorderedPioche.push_back("P8");
750  UnorderedPioche.push_back("P9");
751  UnorderedPioche.push_back("PD");
752  UnorderedPioche.push_back("PR");
753  UnorderedPioche.push_back("PB");
754  UnorderedPioche.push_back("HA");
755  UnorderedPioche.push_back("HZ");
756  UnorderedPioche.push_back("H2");
757  UnorderedPioche.push_back("H3");
758  UnorderedPioche.push_back("H4");
759  UnorderedPioche.push_back("H5");
760  UnorderedPioche.push_back("H6");
761  UnorderedPioche.push_back("H7");
762  UnorderedPioche.push_back("H8");
763  UnorderedPioche.push_back("H9");
764  UnorderedPioche.push_back("HD");
765  UnorderedPioche.push_back("HR");
766  UnorderedPioche.push_back("HB");
767  srand ( time(NULL) );
768  int nb_aleatoire;
769 
770  vector<string> *vRet= new vector<string>;
771  while(UnorderedPioche.size()>0)
772  {
773 
774  nb_aleatoire=(rand()%UnorderedPioche.size());
775  vRet->push_back(UnorderedPioche[nb_aleatoire]);
776  UnorderedPioche.erase((UnorderedPioche.begin())+nb_aleatoire);
777  }
778  return vRet;
779 
780  }
781 
788  int calculateCard(string pCard)
789  {
790 
791  if (pCard.compare("TA")==0) return 10;
792  if (pCard.compare("TZ")==0) return 14;
793  if (pCard.compare("T2")==0) return 2;
794  if (pCard.compare("T3")==0) return 3;
795  if (pCard.compare("T4")==0) return 4;
796  if (pCard.compare("T5")==0) return 5;
797  if (pCard.compare("T6")==0) return 6;
798  if (pCard.compare("T7")==0) return 7;
799  if (pCard.compare("T8")==0) return 8;
800  if (pCard.compare("T9")==0) return 9;
801  if (pCard.compare("TD")==0) return 12;
802  if (pCard.compare("TR")==0) return 13;
803  if (pCard.compare("TB")==0) return 11;
804  if (pCard.compare("CA")==0) return 10;
805  if (pCard.compare("CZ")==0) return 14;
806  if (pCard.compare("C2")==0) return 2;
807  if (pCard.compare("C3")==0) return 3;
808  if (pCard.compare("C4")==0) return 4;
809  if (pCard.compare("C5")==0) return 5;
810  if (pCard.compare("C6")==0) return 6;
811  if (pCard.compare("C7")==0) return 7;
812  if (pCard.compare("C8")==0) return 8;
813  if (pCard.compare("C9")==0) return 9;
814  if (pCard.compare("CD")==0) return 12;
815  if (pCard.compare("CR")==0) return 13;
816  if (pCard.compare("CB")==0) return 11;
817  if (pCard.compare("PA")==0) return 10;
818  if (pCard.compare("PZ")==0) return 14;
819  if (pCard.compare("P2")==0) return 2;
820  if (pCard.compare("P3")==0) return 3;
821  if (pCard.compare("P4")==0) return 4;
822  if (pCard.compare("P5")==0) return 5;
823  if (pCard.compare("P6")==0) return 6;
824  if (pCard.compare("P7")==0) return 7;
825  if (pCard.compare("P8")==0) return 8;
826  if (pCard.compare("P9")==0) return 9;
827  if (pCard.compare("PD")==0) return 12;
828  if (pCard.compare("PR")==0) return 13;
829  if (pCard.compare("PB")==0) return 11;
830  if (pCard.compare("HA")==0) return 10;
831  if (pCard.compare("HZ")==0) return 14;
832  if (pCard.compare("H2")==0) return 2;
833  if (pCard.compare("H3")==0) return 3;
834  if (pCard.compare("H4")==0) return 4;
835  if (pCard.compare("H5")==0) return 5;
836  if (pCard.compare("H6")==0) return 6;
837  if (pCard.compare("H7")==0) return 7;
838  if (pCard.compare("H8")==0) return 8;
839  if (pCard.compare("H9")==0) return 9;
840  if (pCard.compare("HD")==0) return 12;
841  if (pCard.compare("HR")==0) return 13;
842  if (pCard.compare("HB")==0) return 11;
843  return 0;
844 
845  }
846 
856  {
857 
858  datasplayer *p1=new datasplayer;
859  datasplayer *p2=new datasplayer;
860  datasplayer *p3=new datasplayer;
861  datasplayer *p4=new datasplayer;
862  p1->identifiant=vPlayer->identifiant;
863  p1->actualCard="";
864  p1->isPlaying=true;
865  p1->points=0;
866  p2->identifiant="FREE1";
867  p2->actualCard="";
868  p2->isPlaying=false;
869  p2->points=0;
870  p3->identifiant="FREE2";
871  p3->actualCard="";
872  p3->isPlaying=false;
873  p3->points=0;
874  p4->identifiant="FREE3";
875  p4->actualCard="";
876  p4->isPlaying=false;
877  p4->points=0;
878 
879  datasgame *myGame= new datasgame;
880  myGame->playersList=new vector <datasplayer *>;
881  myGame->playersList->push_back(p1);
882  myGame->playersList->push_back(p2);
883  myGame->playersList->push_back(p3);
884  myGame->playersList->push_back(p4);
885  myGame->playedCards=new vector<string>;
886 
887  myGame->piocheCards=loadAndMixCards();
888 
889  int vNbCards=myGame->piocheCards->size();
890  //distribution des cartes
891  for (unsigned int i=0;i<myGame->playersList->size();i++)
892  {
893 
894  myGame->playersList->at(i)->cardsList=new vector<string>;
895  for (unsigned int j=0;j<vNbCards/myGame->playersList->size();j++)
896  {
897 
898  myGame->playersList->at(i)->cardsList->push_back(myGame->piocheCards->front());
899  myGame->piocheCards->erase(myGame->piocheCards->begin());
900  }
901 
902  }
903 
904 
905  writeGame(p1,myGame);
906  return myGame;
907  }
908 
914  void drawCards(vector <string> *cardList)
915  {
916 
917 
918  for (unsigned int i=0;i<cardList->size();i++)
919  {
920  cout <<"<div style=\"position:absolute;top:50;left:"<<i*150+150<<"\" >";
921  cout <<"<img border=\"0\" width=\"100\" src=\"images/"<<cardList->at(i)<<".png\" alt=\"Carte ["<<i<<"]="<<cardList->at(i)<<"\" />"<<endl;
922  cout <<"</div>";
923  }
924  cout <<"<br />";
925  }
926 
935  void writeWinner(datasplayer *vPlayer,datasgame *pGame)
936  {
937  unsigned int winner=0;
938  int scoreOfTheWinner=0;
939  unsigned int playerId=0;
940  for (unsigned int i=0;i<pGame->playersList->size();i++)
941  {
942  if (vPlayer->identifiant.compare(pGame->playersList->at(i)->identifiant)==0)
943  {
944  playerId=i;
945  }
946  if (scoreOfTheWinner<pGame->playersList->at(i)->points)
947  {
948  winner=i;
949  scoreOfTheWinner=pGame->playersList->at(i)->points;
950  }
951  }
952 
953  cout <<"<div style=\"position:absolute;top:50;left:"<<150<<"\" >";
954  if (playerId==winner)
955  {
956  cout <<"<h2>YOU WIN !</h2>"<<endl;
957  cout <<"<b>Your score is : "<<scoreOfTheWinner<<"</b>"<<endl;
958  }else
959  {
960  cout <<"<h2>YOU LOSS !</h2>"<<endl;
961  cout <<"<b>The winner is : "<<pGame->playersList->at(winner)->identifiant<<"</b>"<<endl;
962  cout <<"<b>The score is : "<<scoreOfTheWinner<<"</b>"<<endl;
963  }
964  cout <<"</div>";
965 
966  cout <<"<br />";
967  }
968 
975  void drawInfos(datasplayer *vPlayer)
976  {
977  cout <<"<div style=\"position:absolute;width:140;top:50;left:"<<0<<"\" >";
978  cout <<"The latest Played Cards ";
979  cout <<"</div>";
980  cout <<"<div style=\"width:140;position:absolute;top:180;left:"<<0<<"\" >";
981  cout <<"Actual Cards in the Game<br>You are the player :"<<vPlayer->identifiant;
982  cout <<"</div>";
983  cout <<"<div style=\"width:140;position:absolute;top:375;left:"<<0<<"\" >";
984  cout <<"Your Cards, you can choose one card.";
985  cout <<"</div>";
986  }
987 
995  void drawPlayers(datasgame *pGame)
996  {
997 
998  bool vFirst=false;
999  for (unsigned int i=0;i<pGame->playersList->size();i++)
1000  {
1001  bool afficheFirst=false;
1002  if (vFirst==false&&pGame->playersList->at(i)->actualCard.compare("")!=0)
1003  {
1004  vFirst=true;
1005  afficheFirst=true;
1006  }
1007  cout <<"<div style=\"outline-color:"<<((afficheFirst==false)?"black":"red")<<";outline-style:solid;outline-width:"<<((afficheFirst==false)?"1":"2")<<"px;position:absolute;top:180;left:"<<i*200+150<<"\" >";
1008  cout <<"Name :"<<pGame->playersList->at(i)->identifiant<<"<br>";
1009  cout <<"Score :"<<pGame->playersList->at(i)->points<<"<br>";
1010 
1011  cout <<"<img border=\"0\" width=\"100\" src=\"images/"<<pGame->playersList->at(i)->actualCard<<".png\" alt=\" \" />"<<endl;
1012  if (afficheFirst==true)
1013  {
1014  cout <<"<br>The color to play";
1015  }
1016  cout <<"</div>";
1017  }
1018  cout <<"<br />";
1019  }
1020 
1029  {
1030 
1031 
1032  for (unsigned int i=0;i<pGame->playedCards->size();i++)
1033  {
1034  cout <<"<div style=\"position:absolute;top:100;left:"<<i*110<<"\" >";
1035  cout <<"<img border=\"0\" width=\"100\" src=\"images/"<<pGame->playedCards->at(i)<<".png\" alt=\"Carte ["<<i<<"]="<<pGame->playedCards->at(i)<<"\" />"<<endl;
1036  cout <<"</div>";
1037  }
1038  cout <<"<br />";
1039  }
1040 
1049  {
1050  std::sort (vPlayer->cardsList->begin(),vPlayer->cardsList->end());
1051  cout <<"<form name=\"cards\">";
1052  cout <<"<input type=\"hidden\" name=\"actionner\" value=\"\">";
1053  cout <<"<input type=\"hidden\" name=\"card\" value=\"\">";
1054  //affiche les cartes du joueurs
1055  for (unsigned int i=0;i<vPlayer->cardsList->size();i++)
1056  {
1057  cout <<"<div style=\"position:absolute;top:375;left:"<<i*20+150<<"\" >";
1058  if (vPlayer->isPlaying==true)
1059  {
1060  cout <<"<a href=\"javascript:document.forms.cards.actionner.value='playcard';document.forms.cards.card.value='"<<vPlayer->cardsList->at(i)<<"';document.forms.cards.submit();\">";
1061  }
1062  cout <<"<img border=\"0\" width=\"100\" src=\"images/"<<vPlayer->cardsList->at(i)<<".png\" alt=\"Carte ["<<i<<"]="<<vPlayer->cardsList->at(i)<<"\" />"<<endl;
1063  if (vPlayer->isPlaying)
1064  {
1065  cout <<"</a>";
1066  }
1067  cout <<"</div>";
1068  }
1069  cout <<"</form>";
1070  }
1071 
1084  void playACard(datasplayer *vPlayer,datasgame *readedGame,string *card)
1085  {
1086 
1087 
1088  for (unsigned int i=0;i<readedGame->playersList->size();i++)
1089  {
1090 
1091 
1092  if (readedGame->playersList->at(i)->identifiant.compare(vPlayer->identifiant)==0)
1093  {
1094 
1095  //vPlayer->
1096 
1097  for (unsigned int j=0;j<readedGame->playersList->at(i)->cardsList->size();j++)
1098  {
1099 
1100 
1101  if(readedGame->playersList->at(i)->cardsList->at(j).compare(*card)==0)
1102  {
1103  if (readedGame->piocheCards==NULL)
1104  {
1105  readedGame->piocheCards=new vector<string>;
1106  }
1107  //string carde=*card;
1108  //readedGame->piocheCards->push(carde);
1109  readedGame->playedCards->push_back(*card);
1110  readedGame->playersList->at(i)->actualCard=*card;
1111  readedGame->playersList->at(i)->cardsList->erase(readedGame->playersList->at(i)->cardsList->begin()+j);
1112 
1113  break;
1114 
1115  }
1116  }
1117 
1118  break;
1119  }
1120  }
1121 
1122  }
1123 
1133  void turnPlayers(datasplayer *vPlayer,datasgame *readedGame)
1134  {
1135  unsigned int IdTurn=0;
1136  vPlayer->isPlaying=false;
1137  //Find the player
1138  for (unsigned int i=0;i<readedGame->playersList->size();i++)
1139  {
1140 
1141  if (readedGame->playersList->at(i)->identifiant.compare(vPlayer->identifiant)==0)
1142  {
1143  readedGame->playersList->at(i)->isPlaying=false;
1144  IdTurn=i;
1145  break;
1146  }
1147  }
1148  IdTurn++;
1149  if (IdTurn==readedGame->playersList->size())
1150  {
1151  IdTurn=0;
1152  }
1153 
1154  readedGame->playersList->at(IdTurn)->isPlaying=true;
1155 
1156  }
1157 
1168  bool testCard(datasplayer *vPlayer,datasgame *readedGame,string *card)
1169  {
1170 
1171  //If first Card in the Bloxk
1172  if (readedGame->playedCards->size()==0)
1173  {
1174  return true;
1175  }
1176  //take the color of the first Card
1177  string color=readedGame->playedCards->front().substr(0,1);
1178  //Test if it's the same color
1179  if (color.compare(card->substr(0,1))==0)
1180  {
1181  return true;
1182  }
1183 
1184  //Test if the player has a good colored card in his game
1185  vPlayer->isPlaying=false;
1186  //Find the player
1187  for (unsigned int i=0;i<readedGame->playersList->size();i++)
1188  {
1189 
1190  if (readedGame->playersList->at(i)->identifiant.compare(vPlayer->identifiant)==0)
1191  {
1192 
1193  for (unsigned int j=0;j<readedGame->playersList->at(i)->cardsList->size();j++)
1194  {
1195  if (color.compare(readedGame->playersList->at(i)->cardsList->at(j).substr(0,1))==0)
1196  return false;
1197  }
1198  return true;
1199 
1200  }
1201  }
1202 
1203  return true;
1204 
1205  }
1206 
1219  void IAPlay(datasgame *readedGame,int pId)
1220  {
1221 
1222  if (readedGame->playersList->at(pId)->cardsList->size()==0)
1223  {
1224  return;
1225  }
1226  //If first Card in the Block
1227  if (readedGame->playedCards->size()==0)
1228  {
1229  playACard(readedGame->playersList->at(pId),readedGame,&readedGame->playersList->at(pId)->cardsList->front());
1230  turnPlayers(readedGame->playersList->at(pId),readedGame);
1231  return ;
1232  }
1233  //If not take the color of the first Card
1234  string color=readedGame->playedCards->front().substr(0,1);
1235 
1236  std::sort(readedGame->playersList->at(pId)->cardsList->begin(),readedGame->playersList->at(pId)->cardsList->end());
1237 
1238  //color Finded
1239  bool vColorOk=false;
1240  int vId=0;
1241  for (unsigned int i=0;i<readedGame->playersList->at(pId)->cardsList->size();i++)
1242  {
1243  unsigned int actualColor=color.compare(readedGame->playersList->at(pId)->cardsList->at(i).substr(0,1));
1244 
1245 
1246  //If the next color is not the same the card is the max
1247  if (actualColor==0&&vColorOk==true)
1248  {
1249 
1250  vId=i;
1251  }
1252  if (actualColor!=0&&vColorOk==true)
1253  {
1254 
1255  break;
1256  }
1257 
1258  //If Color Finded
1259  if (actualColor==0&&vColorOk==false)
1260  {
1261 
1262  vColorOk=true;
1263  vId=i;
1264  }
1265  }
1266 
1267  playACard(readedGame->playersList->at(pId),readedGame,&readedGame->playersList->at(pId)->cardsList->at(vId));
1268  turnPlayers(readedGame->playersList->at(pId),readedGame);
1269  }
1270 
1279  void gameRules(datasplayer *vPlayer, string *action, string * card)
1280  {
1281 
1282  //search the player in a game
1283 
1284  datasgame *readedGame=getGame(vPlayer->identifiant);
1285 
1286  if (readedGame==NULL)
1287  {
1288 
1289  //It' isn't in game
1290  //Count the number of games
1291  if (countGame()>MAX_GAME)
1292  {
1293  cout <<"THE PLAY TABLES ARE FULL!"<<endl;
1294  return;
1295  }
1296  //Create a new Game for Four Player
1297  readedGame=createGame(vPlayer);
1298 
1299  }
1300 
1301  unsigned int thePlayer=0;
1302  //Find the player
1303  for (unsigned int i=0;i<readedGame->playersList->size();i++)
1304  {
1305 
1306  if (readedGame->playersList->at(i)->identifiant.compare(vPlayer->identifiant)==0)
1307  {
1308  //vPlayer->
1309  vPlayer->cardsList=readedGame->playersList->at(i)->cardsList;
1310  vPlayer->isPlaying=readedGame->playersList->at(i)->isPlaying;
1311  vPlayer->points=readedGame->playersList->at(i)->points;
1312  thePlayer=i;
1313  break;
1314 
1315  }
1316  }
1317 
1318 
1319  //Gestion des actions de l'utilisateur
1320  int vResComp=action->compare("playcard");
1321 
1322  if ( vResComp==0 && vPlayer->isPlaying==true)
1323  {
1324  if (testCard(vPlayer,readedGame,card)==true)
1325  {
1326  playACard(vPlayer,readedGame,card);
1327  turnPlayers(vPlayer,readedGame);
1328  writeGame(vPlayer,readedGame);
1329  }
1330  else
1331  {
1332  cout <<"<div style=\"position:absolute;top:50;left:"<<150<<"\" >";
1333  cout <<"<b>You can not Play this card!</b><br>\n";
1334  cout <<"</div>";
1335  }
1336 
1337  }
1338 
1339  //Tant que l'utilisateur n'a pas encore le droit de jouer on fait tourner l'IA
1340  unsigned int vNbTurns=0;
1341  while (vNbTurns<=readedGame->playersList->size()+1&&readedGame->playersList->at(thePlayer)->isPlaying==false)
1342  {
1343  vNbTurns++;
1344  for (unsigned int i=0;i<readedGame->playersList->size();i++)
1345  {
1346  if (readedGame->playersList->size()<=readedGame->playedCards->size())
1347  {
1348 
1349  break;
1350  }
1351  if (i==thePlayer)
1352  {
1353  if (readedGame->playersList->at(thePlayer)->isPlaying==true)
1354  {
1355 
1356  break;
1357  }
1358  }
1359  else
1360  {
1361  if (readedGame->playersList->at(i)->isPlaying==true)
1362  {
1363 
1364  IAPlay(readedGame,i);
1365 
1366  }
1367  }
1368  }
1369 
1370  }
1371 
1372  vector <string> *lastPlayedCard= new vector<string>;
1373  //A end is finish??
1374  if (readedGame->playersList->size()<=readedGame->playedCards->size())
1375  {
1376  //Find the winner
1377  //The Winner is
1378  int vWiner=0;
1379  int theMax=0;
1380  int total=0;
1381  for(unsigned int i=0;i<readedGame->playersList->size();i++)
1382  {
1383  string plCard=readedGame->playersList->at(i)->actualCard;
1384  readedGame->playersList->at(i)->isPlaying=false;
1385  int cardValue=calculateCard(plCard);
1386  readedGame->playersList->at(i)->actualCard="";
1387  int compCard=plCard.substr(0,1).compare(readedGame->playedCards->front().substr(0,1));
1388 
1389 
1390  if (theMax<cardValue&&compCard==0)
1391  {
1392  theMax=cardValue;
1393  vWiner=i;
1394 
1395  }
1396 
1397  if (compCard==0)
1398  {
1399  total+=cardValue;
1400  }
1401  }
1402 
1403  readedGame->playersList->at(vWiner)->isPlaying=true;
1404  readedGame->playersList->at(vWiner)->points+=total;
1405 
1406  //clear and add In Pioche
1407 
1408  while (!readedGame->playedCards->empty())
1409  {
1410  readedGame->piocheCards->push_back(readedGame->playedCards->front());
1411  lastPlayedCard->push_back(readedGame->playedCards->front());
1412  readedGame->playedCards->erase(readedGame->playedCards->begin());
1413  }
1414  }
1415  if (readedGame->playersList->at(thePlayer)->isPlaying==true)
1416  {
1417  vPlayer->isPlaying=true;
1418  }
1419  if (readedGame->playersList->at(thePlayer)->cardsList->size()!=0)
1420  {
1421  //Tant que l'utilisateur n'a pas encore le droit de jouer on fait tourner l'IA
1422  vNbTurns=0;
1423 
1424  while (readedGame->playersList->at(thePlayer)->isPlaying==false)
1425  {
1426  vNbTurns++;
1427  for (unsigned int i=0;i<readedGame->playersList->size();i++)
1428  {
1429  if (i==thePlayer)
1430  {
1431  if (readedGame->playersList->at(thePlayer)->isPlaying==true)
1432 
1433  break;
1434  }
1435  else
1436  {
1437  if (readedGame->playersList->at(i)->isPlaying==true)
1438  {
1439  IAPlay(readedGame,i);
1440  }
1441  }
1442  }
1443 
1444  }
1445  }
1446  if (readedGame->playersList->at(thePlayer)->isPlaying==true)
1447  {
1448  vPlayer->isPlaying=true;
1449  }
1450  try{
1451  writeGame(vPlayer,readedGame);
1452  if (readedGame->playersList->at(thePlayer)->cardsList->size()!=0)
1453  {
1454  drawCards(lastPlayedCard);
1455  }
1456  else
1457  {
1458  writeWinner(vPlayer,readedGame);
1459  }
1460  drawPlayers(readedGame);
1461  //drawCardInPlay(readedGame);
1462  drawPlayerCards(vPlayer);
1463  drawInfos(vPlayer);
1464  }
1465  catch(std::exception &error)
1466  {
1467  cout <<"Erreur:"<<error.what()<<"<br>\n";
1468  }
1469 
1470  }
1471 }
1472 
1473 using namespace CardGameTools;
1474 
1482 int
1483 main(int argc,
1484  char **argv)
1485 {
1486  try {
1487  Cgicc cgi;
1488 
1489  // Get the name and value of the cookie to set
1490 
1491  const_form_iterator actionIn = cgi.getElement("actionner");
1492  const_form_iterator playedCard = cgi.getElement("card");
1493  string action;
1494  string card;
1495 
1496 
1497  if (actionIn!= cgi.getElements().end() &&actionIn->getValue().empty() == false)
1498  {
1499  action=actionIn->getValue();
1500 
1501  }
1502  if (playedCard!= cgi.getElements().end() &&playedCard->getValue().empty() == false)
1503  {
1504  card=playedCard->getValue();
1505 
1506  }
1507  string staticSession="";
1508 
1509  //get a static session
1510  if (argc>1)
1511  {
1512 
1513  staticSession =argv[1];
1514 
1515  }
1516 
1517 
1518  // Send HTTP header
1519 
1520  string vRet=getNUMCookie(cgi.getEnvironment().getCookieList());
1521 
1522 
1523  if (vRet.compare("")==0&&staticSession.compare("")!=0)
1524  {
1525 
1526  vRet=staticSession;
1527  }
1528 
1529  if (vRet.compare("")==0&&getValue(vRet).compare("")==0)
1530  {
1531 
1532  vRet=generateUnicCookie();
1533 
1534  cout << HTTPHTMLHeader()
1535  .setCookie(HTTPCookie(COOKIE_NAME, vRet));
1536  }
1537  else
1538  cout << HTTPHTMLHeader(); // Set up the HTML document
1539 
1540  cout << html() << head(title("Cgicc CardGame example")) << endl;
1541  cout << body() << endl;
1542 
1543  cout <<"<H1>Card Game</H1>";
1544  cout <<"<div style=\"position:absolute;top:5;left:"<<250<<"\"><form name=\"start\"><input type=\"hidden\" name=\"actionner\" value=\"start\"><a href=\"javascript:document.forms.start.submit();\">Start a new Game</a></form></div>";
1545  //if the are a cookie in the stock we parse data
1546  datasplayer *vPlayer;
1547  if (getValue(vRet).compare("")!=0)
1548  {
1549 
1550  vPlayer=convertStringToStuct(getValue(vRet));
1551 
1552  }else
1553  {
1554 
1555  vPlayer= new datasplayer;
1556  srand ( time(NULL) );
1557 
1558 
1559  stringstream buffer;
1560  buffer << "P"<<(rand()%1000)+1<<"_"<<(rand()%1000)+1;
1561  vPlayer->identifiant=buffer.str();
1562 
1563  //We write a new empty value
1564 
1565  writeValue(vRet,convertStructToString(vPlayer));
1566 
1567  }
1568  if (action.compare("start")==0)
1569  {
1570  writeFileGame(vPlayer->identifiant,"");
1571  }
1572 
1573  gameRules(vPlayer,&action,&card);
1574 
1575  // Close the HTML document
1576  cout << body() << html();
1577 
1578  }
1579  catch(exception& e) {
1580  // handle any errors - omitted for brevity
1581  }
1582 }
1583 
1584 
std::vector< FormEntry >::const_iterator const_form_iterator
A vector of const FormEntry objects.
Definition: Cgicc.h:68
std::string getName() const
Get the name of this cookie.
Definition: HTTPCookie.h:211
string generateUnicCookie()
generate an unique id
Definition: cardgame.cpp:659
void writeGame(datasplayer *pPlayer, datasgame *pGame)
Write datasgame struct in the game file.
Definition: cardgame.cpp:602
void drawPlayers(datasgame *pGame)
Draw players game informations.
Definition: cardgame.cpp:995
vector< string > * loadAndMixCards()
Generate a mixed cards list.
Definition: cardgame.cpp:712
int countGame()
Read the game file and count the number of games.
Definition: cardgame.cpp:680
void turnPlayers(datasplayer *vPlayer, datasgame *readedGame)
Change the hand in the game.
Definition: cardgame.cpp:1133
datasgame * createGame(datasplayer *vPlayer)
Create a game from the data of the player.
Definition: cardgame.cpp:855
string convertStructToString(datasplayer *pPlayer)
Generate a data in a single line from the data of the player.
Definition: cardgame.cpp:134
void drawInfos(datasplayer *vPlayer)
Draw player informations.
Definition: cardgame.cpp:975
const std::vector< FormEntry > & getElements() const
Get all the submitted form elements, excluding files.
Definition: Cgicc.h:348
int points
the score of the player
Definition: cardgame.cpp:82
HTTPHeader & setCookie(const HTTPCookie &cookie)
Set a cookie to go out with this HTTPResponseHeader.
Definition: HTTPHeader.h:88
std::string getValue() const
Get the value of this cookie.
Definition: HTTPCookie.h:220
Shortcut to HTTPContentHeader for text/html.
Platform and operating system specific macro definitions.
bool isPlaying
If the player is playing the value is at true.
Definition: cardgame.cpp:77
A data model for the games.
Definition: cardgame.cpp:96
void drawCardInPlay(datasgame *pGame)
Draw the cards in the table.
Definition: cardgame.cpp:1028
string identifiant
the identifiant of the player
Definition: cardgame.cpp:72
datasgame * getGame(string pName)
Convert the data to the datasgame struct.
Definition: cardgame.cpp:326
string getNUMCookie(std::vector< HTTPCookie > pCookieVector)
Get the cookie of the game from the list of the cookies.
Definition: cardgame.cpp:216
bool testCard(datasplayer *vPlayer, datasgame *readedGame, string *card)
Test if the card is playable.
Definition: cardgame.cpp:1168
An HTTP Cookie.
void writeWinner(datasplayer *vPlayer, datasgame *pGame)
Draw the winner informations.
Definition: cardgame.cpp:935
datasplayer * convertStringToStuct(string pPlayer)
Generate a datasgame struct from a single line.
Definition: cardgame.cpp:168
int main(int argc, char **argv)
The main function.
Definition: cardgame.cpp:1483
const std::vector< HTTPCookie > & getCookieList() const
Get a vector containing the HTTP cookies associated with this query.
void IAPlay(datasgame *readedGame, int pId)
AI algorithme for one AI player.
Definition: cardgame.cpp:1219
vector< string > * playedCards
The actual cards in the game.
Definition: cardgame.cpp:107
void writeValue(string pName, string pValue)
Write data in the cookie file.
Definition: cardgame.cpp:516
form_iterator getElement(const std::string &name)
Find a radio button in a radio group, or a selected list item.
vector< datasplayer * > * playersList
The players List.
Definition: cardgame.cpp:102
int calculateCard(string pCard)
Return the value of the card.
Definition: cardgame.cpp:788
The main header file for the GNU cgicc library.
Contain all the functions to the coding game.
string getFileGame(string pName)
Get all game information from the name of the player.
Definition: cardgame.cpp:288
void writeFileGame(string pName, string pValue)
Write data in the game file.
Definition: cardgame.cpp:533
vector< string > * cardsList
A list of the cards.
Definition: cardgame.cpp:67
void gameRules(datasplayer *vPlayer, string *action, string *card)
The rules Algorithm.
Definition: cardgame.cpp:1279
The main class of the GNU cgicc library.
Definition: Cgicc.h:103
string actualCard
The actual played card.
Definition: cardgame.cpp:87
vector< string > * piocheCards
The rest of the cards.
Definition: cardgame.cpp:112
Shortcut to HTTPContentHeader for text/html.
A data model for the player.
Definition: cardgame.cpp:61
const CgiEnvironment & getEnvironment() const
Definition: Cgicc.h:394
void playACard(datasplayer *vPlayer, datasgame *readedGame, string *card)
The algorithm when a card is played.
Definition: cardgame.cpp:1084
An HTTP cookie.
Definition: HTTPCookie.h:58
void drawPlayerCards(datasplayer *vPlayer)
Draw the cards of the player.
Definition: cardgame.cpp:1048
The namespace containing the cgicc library.
Definition: Cgicc.h:52
The header file containing HTML output classes.
void drawCards(vector< string > *cardList)
Draw the cards list.
Definition: cardgame.cpp:914
string getValue(string pName)
Get all personnal information from the cookie&#39;s Id.
Definition: cardgame.cpp:247

GNU cgicc - A C++ class library for writing CGI applications
Copyright © 1996 - 2004 Stephen F. Booth
Permission is granted to copy, distribute and/or modify this document under the terms of the GNU Free Documentation License, Version 1.1 or any later version published by the Free Software Foundation; with no Invariant Sections, with no Front Cover Texts, and with no Back-Cover Texts.
Documentation generated Sun Oct 16 2016 16:14:42 for cgicc by doxygen 1.8.12