PageRenderTime 66ms CodeModel.GetById 23ms RepoModel.GetById 0ms app.codeStats 1ms

/Expertbot/regles/regles.cpp

http://machiabot.googlecode.com/
C++ | 1843 lines | 1328 code | 235 blank | 280 comment | 353 complexity | 341742a9d5ae18d035bffbe7d4f1bd72 MD5 | raw file
  1. #include <vector>
  2. #include <iostream>
  3. #include <cstdlib>
  4. #include <string>
  5. #include <math.h>
  6. #include <fstream>
  7. #include "../all2.h"
  8. #include "../dico/Dico2.h"
  9. #include "../Groupe.h"
  10. #include "../traceur.h"
  11. #include "predicat.cpp" //l'implémentation des fonctions utiles aux regles
  12. regles::regles(Goban * gb, Ia* mon_Ia, traceur * tr) {
  13. g=gb;
  14. monIa = mon_Ia;
  15. Poids.resize(gb->getTaille());
  16. for (int i=0;(int)i<(int)Poids.size();i++) {
  17. Poids[i].resize(gb->getTaille());
  18. }
  19. fichier = new ofstream ("traceRegles.txt", ios::out | ios::trunc); //déclaration du flux et ouverture du fichier
  20. fTrace = new ofstream ("traceReglesNG.txt", ios::out | ios::trunc); //déclaration du flux et ouverture du fichier
  21. //traceTemp.clear();
  22. t = tr;
  23. }
  24. void regles::initFait() { //vector<int> faitsInit
  25. if(fichier){
  26. fichier->close();
  27. }
  28. //delete fichier;
  29. fichier = new ofstream (t->nomComplet("ReglesTxt").c_str(), ios::out | ios::trunc);
  30. fTrace = new ofstream (t->nomComplet("ReglesA").c_str(), ios::out | ios::trunc);
  31. #include "faitsDeBase.cpp"
  32. }
  33. void regles::reinittable(vector<vector<int> > * table) {
  34. for (int i=0; i<(int)table->size(); i++)
  35. for (int j=0; j<(int)(*table)[0].size(); j++)
  36. (* table)[i][j]=0;
  37. }
  38. vector<vector <int> > * regles::getZone(int numZone) {
  39. // cout<<"getcoin : "<<coin<<" - ";
  40. switch (numZone) {
  41. case COINSUPDROIT:
  42. // cout<<(* g->getcoinSupDroit())[0].size()<< " - "<<(* g->getcoinSupDroit())[1].size()<<endl;
  43. return g->getcoinSupDroit();
  44. break;
  45. case COININFDROIT:
  46. // cout<<(* g->getcoinInfDroit())[0].size()<< " - "<<(* g->getcoinInfDroit())[1].size()<<endl;
  47. return g->getcoinInfDroit();
  48. break;
  49. case COININFGAUCHE:
  50. // cout<<(* g->getcoinInfGauche())[0].size()<< " - "<<(* g->getcoinInfGauche())[1].size()<<endl;
  51. return g->getcoinInfGauche();
  52. break;
  53. case COINSUPGAUCHE:
  54. // cout<<(* g->getcoinSupGauche())[0].size()<< " - "<<(* g->getcoinSupGauche())[1].size()<<endl;
  55. return g->getcoinSupGauche();
  56. break;
  57. case BORDDROIT :
  58. return g->getbordDroit();
  59. break;
  60. case BORDGAUCHE :
  61. return g->getbordGauche();
  62. break;
  63. case BORDSUP :
  64. return g->getbordSup();
  65. break;
  66. case BORDINF :
  67. return g->getbordInf();
  68. break;
  69. case CENTRE :
  70. return g->getCentre();
  71. break;
  72. default :
  73. return 0;
  74. break;
  75. }
  76. }
  77. vector<vector <int> > * regles::getcoinJoseki(int coin) {
  78. switch (coin) {
  79. case COININFDROIT:
  80. return g->getcoinJosekiInfDroit();
  81. break;
  82. case COINSUPDROIT:
  83. return g->getcoinJosekiSupDroit();
  84. break;
  85. case COININFGAUCHE:
  86. return g->getcoinJosekiInfGauche();
  87. break;
  88. case COINSUPGAUCHE:
  89. return g->getcoinJosekiSupGauche();
  90. break;
  91. default:
  92. cout<<"regles::getcoinJoseki(int coin) : "<<coin<<" n'est pas un parametre valide pour coin"<<endl;
  93. return NULL;
  94. break;
  95. }
  96. }
  97. Goban * regles::getGoban() {
  98. return g;
  99. }
  100. Groupe * regles::getGroupe(int numgrp) {
  101. if (numgrp < GROUPE_BLANC) // groupe noir
  102. return (*(g->getListeGroupeN()))[numgrp-GROUPE_NOIR];
  103. else // groupe blanc
  104. return (*(g->getListeGroupeN()))[numgrp-GROUPE_BLANC];
  105. }
  106. Ia * regles::getIa() {
  107. return monIa;
  108. }
  109. vector<vector<int> > * regles::getPoids() { // retourne un pointeur sur poids
  110. return &Poids;
  111. }
  112. int regles::abscisse(int numInter) {
  113. return floor(numInter / g->getTaille() );
  114. }
  115. int regles::ordonnee(int numInter) {
  116. return numInter % g->getTaille();
  117. }
  118. char regles::couleurOppose(char couleur) {
  119. if (couleur == NOIR)
  120. return BLANC;
  121. else
  122. return NOIR;
  123. }
  124. char regles::getCouleur(int grp) {
  125. return (grp<GROUPE_BLANC) ? NOIR : BLANC;
  126. }
  127. Intersection * regles::centreZone(int z) {
  128. int abscisse, ordonnee, tailleGoban = g->getTaille();
  129. if (z == COININFGAUCHE || z == BORDGAUCHE || z == COINSUPGAUCHE)
  130. abscisse = 3;
  131. else if (z == BORDINF || z == BORDSUP)
  132. abscisse = (tailleGoban-1)/2;
  133. else
  134. abscisse = tailleGoban-4;
  135. if (z == COININFGAUCHE || z == BORDINF || z == COININFDROIT)
  136. ordonnee = 3;
  137. else if (z == BORDGAUCHE || z == BORDDROIT)
  138. ordonnee = (tailleGoban-1)/2;
  139. else
  140. ordonnee = tailleGoban-4;
  141. return g->getIntersection(abscisse, ordonnee);
  142. }
  143. Intersection * regles::getIntersection(int numInter) {
  144. return g->getIntersection(abscisse(numInter), ordonnee(numInter));
  145. }
  146. void regles::trace(int i, int j) {
  147. //cout<<"On est dans la trace numéro "<<t<<endl;
  148. *fichier<<"("<<i*g->getTaille()+j<<")";
  149. //return true;
  150. }
  151. void regles::trace(string s) {
  152. //cout<<"On est dans la trace numéro "<<t<<endl;
  153. *fichier<<s;
  154. //return true;
  155. }
  156. int regles::inter(int abscisse, int ordonnee) {
  157. return abscisse*g->getTaille() + ordonnee;
  158. }
  159. bool regles::alternerNoirBlanc(vector<vector <int> > * liste_coups, vector<vector <int> > * liste_ordonnee) {
  160. bool pierreTrouve = true;
  161. char tour = NOIR;
  162. for(int i =0; i < (int) (*liste_coups)[0].size() && pierreTrouve==true; i++){
  163. if(g->getPierre((*liste_coups)[i][0],(*liste_coups)[i][1])->couleur()==tour){
  164. tour = couleurOppose(tour);
  165. } else if (g->getPierre((*liste_coups)[i][0],(*liste_coups)[i][1])->couleur()==couleurOppose(tour)) {
  166. (*liste_ordonnee)[0].push_back(-1);
  167. (*liste_ordonnee)[1].push_back(-1);
  168. } else { // il n'y a pas de pierres
  169. pierreTrouve= false;
  170. }
  171. (*liste_ordonnee)[0].push_back((*liste_coups)[i][0]);
  172. (*liste_ordonnee)[1].push_back((*liste_coups)[i][1]);
  173. }
  174. return pierreTrouve;
  175. }
  176. int regles::numInterTengen() {
  177. return (g->getTaille() * g->getTaille() - 1) / 2;
  178. }
  179. int regles::abscisseTengen() {
  180. return (g->getTaille() - 1) / 2;
  181. }
  182. int regles::nbPierresGroupe(Groupe* grp) {
  183. return grp->getListe()->size();
  184. }
  185. void afficherVecteurInt(vector<int> * liste) { // affiche les données d'un vecteur d'entier, sert pour tester
  186. for (int i=0; i<(int)liste->size(); i++)
  187. cout<<(*liste)[i]<<" - ";
  188. cout<<endl;
  189. }
  190. void regles::ajouterFait(int fait) {
  191. machiaFait mf;
  192. mf.id = fait;
  193. mf.args.resize(0);
  194. ajouterFait(mf);
  195. }
  196. void regles::ajouterFait(machiaFait fait) {
  197. if (!testerFait(fait)) {//test si on ne l'a pas déja ajouté
  198. faits.push_back(fait);
  199. }
  200. }
  201. void regles::retirerFait(machiaFait fait) {
  202. bool argEgaux= false;
  203. int i=0;
  204. while (i<(int)faits.size()&&!argEgaux) {
  205. if (fait.id==faits[i].id) {
  206. int j =0;
  207. //tant qu'on est pas ŕ la fin des arguments et que les arguments sont égaux
  208. while (j<(int)faits[i].args.size() && faits[i].args[j]==fait.args[j]) {
  209. j++;
  210. }
  211. if (j==(int)faits[i].args.size()) {
  212. argEgaux=true;
  213. }
  214. }
  215. i++;
  216. }
  217. if (argEgaux) {
  218. faits.erase(faits.begin()+i);
  219. } else {
  220. cout<<"tentative de suppression d'un fait qui n'existe pas."<<endl;
  221. }
  222. }
  223. bool regles::testerFait(machiaFait fait) {
  224. bool argEgaux= false;
  225. int i=0;
  226. while (i<(int)faits.size() && !argEgaux) {
  227. if (fait.id==faits[i].id) {
  228. int j =0;
  229. //tant qu'on est pas ŕ la fin des arguments et que les arguments sont égaux
  230. while (j<(int)faits[i].args.size() && faits[i].args[j]==fait.args[j]) {
  231. j++;
  232. }
  233. if (j==(int)faits[i].args.size()) {
  234. argEgaux=true;
  235. }
  236. }
  237. i++;
  238. }
  239. return argEgaux;
  240. }
  241. bool regles::initNon(vector<int> x, vector<int> y) {
  242. traceNon.clear();
  243. for (int i=0;i<(int)x.size(); i++)
  244. traceNon.push_back(x[i]);
  245. traceNon2.clear();
  246. for (int i=0;i<(int)y.size(); i++)
  247. traceNon2.push_back(y[i]);
  248. return 1;
  249. }
  250. bool regles::initNon() {
  251. return 1;
  252. }
  253. bool regles::initNon(vector<int> x) {
  254. traceNon.clear();
  255. for (int i=0;i<(int)x.size(); i++)
  256. traceNon.push_back(x[i]);
  257. return 1;
  258. }
  259. bool regles::inverser() {
  260. return 1;
  261. }
  262. //inversion d'arguments
  263. bool regles::inverser(vector<int> * x, vector<int> * y) {
  264. inverser(x);
  265. traceNon.clear();
  266. for (int i=0;i<(int)traceNon2.size(); i++)
  267. traceNon.push_back(traceNon2[i]);
  268. inverser(y);
  269. return x->size()>0 && y->size()>0;
  270. }
  271. bool regles::inverser(vector<int> * x) {
  272. if ((int)(*x).size()>0) {
  273. vector<int> temp;
  274. /*
  275. //test si c'est des coins:
  276. if ((*x)[0] >=400 && (*x)[0] <=403)
  277. {
  278. // temp.clear();
  279. */
  280. for (int i = 0; i < (int)traceNon.size(); i++) { //on met tous les coins SAUVEGARDES lors de la fonction appellée par le non, pour ne faire l'inversion que sur les éligibles
  281. temp.push_back(traceNon[i]);
  282. }
  283. for (int i=0; i<(int)(*x).size(); i++) { //on parcourt tous les coins qu'on veut inverser
  284. for (int j =0; j<(int)temp.size(); j++) {
  285. if (temp[j]==(*x)[i]) {
  286. temp.erase(temp.begin()+j); //on le vire si on le trouve
  287. }
  288. }
  289. }
  290. (*x).clear();
  291. for (int i=0; i<(int)temp.size(); i++) {
  292. (*x).push_back(temp[i]);
  293. }
  294. //si c'est des bords
  295. /*
  296. else if ((*x)[0] >=404 && (*x)[0] <=407)
  297. {
  298. // temp.clear();
  299. temp.push_back(404);temp.push_back(405);temp.push_back(406);temp.push_back(407); //on met tous les bords
  300. for (int i=0; i<(*x).size(); i++){ //on parcourt tous les bords qu'on veut inverser
  301. for (int j =0; j<temp.size(); j++){
  302. if (temp[j]==(*x)[i]) {temp.erase(temp.begin()+j);} //on le vire si on le trouve
  303. }
  304. }
  305. (*x).clear();
  306. for (int i=0; i<temp.size(); i++){
  307. (*x).push_back(temp[i]);
  308. }
  309. }*/
  310. }
  311. return x->size()>0;
  312. }
  313. //test fait sans argument
  314. bool regles::testerFait(int nom) {
  315. machiaFait fait;
  316. fait.id=nom;
  317. int i=0;
  318. while (i<(int)faits.size()) {
  319. if (fait.id==faits[i].id) {
  320. return true;
  321. }
  322. i++;
  323. }
  324. return false;
  325. }
  326. //prend un argument
  327. bool regles::testerFait(int nom, vector<int> * arg/*, ...*/) {
  328. machiaFait fait;
  329. fait.id=nom;
  330. //va_list ap;
  331. //va_start(ap, nom);
  332. if (arg!=NULL) {
  333. for (int i=0; i<(int)(*arg).size(); i++) {
  334. fait.args.push_back((*arg)[i]);
  335. }
  336. }
  337. /*
  338. vector<int> * parametre = va_arg(ap, vector<int> *);
  339. while(parametre != NULL){ // ...Tant qu'on ne trouve pas le paramčtre NULL
  340. {for (int i=0; i<(*parametre).size(); i++){
  341. fait.args.push_back((*parametre)[i]);}}
  342. vector<int> * parametre = va_arg(ap, vector<int> *); // on obtient le paramčtre actuel
  343. }
  344. va_end(ap);
  345. */
  346. bool argEgaux= false;
  347. int i=0;
  348. while (i<(int)faits.size()&&!argEgaux) {
  349. if (fait.id==faits[i].id) {
  350. int j =0;
  351. //tant qu'on est pas ŕ la fin des arguments et que les arguments sont égaux
  352. // IL FAUDRAIT TESTER QUE TOUS LES ELEMENTS DU VECTEUR CONTENU DANS UN ARGUMENT SONT EGAUX !!!!!!!!!!!!
  353. while (j<(int)faits[i].args.size() && faits[i].args[j]==fait.args[j]) {
  354. j++;
  355. }
  356. if (j==(int)faits[i].args.size()) {
  357. argEgaux=true;
  358. }
  359. }
  360. i++;
  361. }
  362. return argEgaux;
  363. }
  364. bool regles::ajoutLib(vector<int> * numinter,vector <int> * numgrp, int nblib) { // retire de inter les intersections n'ajoutant pas au moins nblib libertés ŕ un groupe. Tous les groupes doivent ętre de la męme couleur
  365. int i=0, j, k, l, indiceGrps, abscisseInter, ordonneeInter, abscisseAdj, ordonneeAdj, nbLibertesBonus;
  366. char coul;
  367. bool grpTrouve;
  368. vector<Groupe*> grps;
  369. Groupe * grpActuel;
  370. if ((*numgrp)[0]<GROUPE_BLANC)
  371. coul = NOIR;
  372. else
  373. coul = BLANC;
  374. while (i<(int)numinter->size()) {
  375. abscisseInter = abscisse((*numinter)[i]);
  376. ordonneeInter = ordonnee((*numinter)[i]);
  377. nbLibertesBonus = 0;
  378. grps.resize(0);
  379. for (j=-1; j<=1; j+=2) { // -1 et 1
  380. for (k=0; k<=1; k++) {
  381. if (k==0) {
  382. abscisseAdj = abscisseInter + j;
  383. ordonneeAdj = ordonneeInter;
  384. } else {
  385. abscisseAdj = abscisseInter;
  386. ordonneeAdj = ordonneeInter + j;
  387. }
  388. if (g->dansPlateau(abscisseAdj, ordonneeAdj)) { // si l'intersection est dans le goban
  389. if (g->getIntersection(abscisseAdj, ordonneeAdj)->couleur() == VIDE) // si l'intersection est vide
  390. nbLibertesBonus += 1;
  391. else if (g->getIntersection(abscisseAdj, ordonneeAdj)->couleur() == coul) { // meme couleur mais pas męme groupe
  392. indiceGrps = 0;
  393. grpActuel = g->getIntersection(abscisseAdj, ordonneeAdj)->getGroupe();
  394. while (indiceGrps<(int)grps.size() && grps[indiceGrps]!=grpActuel)
  395. indiceGrps++;
  396. if (indiceGrps>=(int)grps.size()) { // groupe pas encore étudié
  397. nbLibertesBonus += grpActuel->getNbLib()-1;
  398. grps.push_back(grpActuel);
  399. if (grpTrouve == false) { // on n'a pas encore trouvé de groupes de numgrp ŕ laquelle est rattachée cette intersection ... peut-ętre celui-lŕ
  400. l=0;
  401. while (l<(int)numgrp->size() && getGroupe((*numgrp)[l])!=grpActuel)
  402. l++;
  403. if (getGroupe((*numgrp)[l])==grpActuel)
  404. grpTrouve = true;
  405. }
  406. }
  407. }
  408. }
  409. }
  410. }
  411. if (nbLibertesBonus >= nblib && grpTrouve)
  412. i++;
  413. else
  414. numinter->erase(numinter->begin() + i);
  415. }
  416. return numinter->size()>0;
  417. }
  418. bool regles::Coin(vector<int> * listeCoins) { //réinitialise une liste de coins
  419. traceTemp+="Coin ";
  420. //on efface le contenu de la liste (quand on l'appelle c'est pour renvoyer tous les coins du goban)
  421. listeCoins->clear();
  422. //puis on rajoute chaque coin du goban.
  423. (*listeCoins).push_back(COININFGAUCHE);
  424. (*listeCoins).push_back(COINSUPGAUCHE);
  425. (*listeCoins).push_back(COININFDROIT);
  426. (*listeCoins).push_back(COINSUPDROIT);
  427. cout<<"liste des Coins :"<<endl;
  428. afficherVecteurInt(listeCoins);
  429. return true;
  430. }
  431. bool regles::Bord (vector<int> * listeBords) { //réinitialise une liste de bords
  432. traceTemp+="Bord ";
  433. //on efface le contenu de la liste (quand on l'appelle c'est pour renvoyer tous les bords du goban)
  434. listeBords->clear();
  435. //puis on rajoute chaque coin du goban.
  436. listeBords->push_back(BORDSUP);
  437. listeBords->push_back(BORDDROIT);
  438. listeBords->push_back(BORDINF);
  439. listeBords->push_back(BORDGAUCHE);
  440. cout<<"liste des Bords :"<<endl;
  441. afficherVecteurInt(listeBords);
  442. return true;
  443. }
  444. bool regles::intersection(vector<int> * listeI) {
  445. traceTemp+="Intersection ";
  446. int carre = g->getTaille() * g->getTaille();
  447. listeI->clear();
  448. listeI->resize(carre);
  449. //puis on rajoute chaque intersection du goban.
  450. for (int i =0; i <carre ; i++) {
  451. (*listeI)[i]=i;
  452. }
  453. cout<<"liste des Intersections :"<<endl;
  454. afficherVecteurInt(listeI);
  455. return true;
  456. }
  457. bool regles::BordLePlusVide(vector<int> * listeBords) { // retourne le ou les bords oů il y a le plus grand espace entre deux pierres
  458. traceTemp+="&& BordLePlusVide ";
  459. if (listeBords->size()==1)
  460. return true;
  461. int i=0, j, maxEspaceTotal=0, maxEspaceCeBord, espaceGauche, espaceDroite;
  462. vector<vector <int> > * pierresSurBord;
  463. Intersection* inter;
  464. cout<<"regles::BordLePlusVide(vector<int> * listeBords) : avant premier while"<<endl;
  465. while (i<(int)listeBords->size()) { // on parcourt les différents bords
  466. cout<<"regles::BordLePlusVide(vector<int> * listeBords) : premier while : i = "<<i<<" - listeBords->size() : " <<listeBords->size()<<endl;
  467. maxEspaceCeBord = 0;
  468. pierresSurBord = getZone((*listeBords)[i]);
  469. if ((int)(*pierresSurBord)[0].size() == 0) { // pas de pierres sur le bord
  470. inter = centreZone((*listeBords)[i]);
  471. if (inter->getPierreGauche() == NULL)
  472. espaceGauche = (g->getTaille()-1)/2;
  473. else
  474. espaceGauche = inter->getDistancePierreGauche();
  475. if (inter->getPierreDroite() == NULL)
  476. espaceDroite = (g->getTaille()-1)/2;
  477. else
  478. espaceDroite = inter->getDistancePierreDroite();
  479. maxEspaceCeBord = espaceGauche + espaceDroite + 1;
  480. } else {
  481. for (j=0; j<(int)(*pierresSurBord)[0].size(); j++) { // on étudie les différentes pierres du bord
  482. maxEspaceCeBord = 0;
  483. inter = g->getIntersection((*pierresSurBord)[0][j],(*pierresSurBord)[1][j]);
  484. if (inter->getDistancePierreGauche() == -1)
  485. espaceGauche = g->getDistanceBordGauche(inter->getX(), inter->getY());
  486. else
  487. espaceGauche = inter->getDistancePierreGauche();
  488. if (inter->getDistancePierreDroite() == -1)
  489. espaceDroite = g->getDistanceBordDroit(inter->getX(), inter->getY());
  490. else
  491. espaceDroite = inter->getDistancePierreDroite();
  492. maxEspaceCeBord = max(maxEspaceCeBord, max(inter->getDistancePierreGauche(), inter->getDistancePierreDroite()));
  493. }
  494. }
  495. if (maxEspaceCeBord<maxEspaceTotal) {
  496. cout<<"maxEspaceCeBord<maxEspaceTotal"<<endl;
  497. listeBords->erase(listeBords->begin()+i);
  498. } else if (maxEspaceCeBord == maxEspaceTotal) {
  499. cout<<"maxEspaceCeBord==maxEspaceTotal"<<endl;
  500. i++;
  501. } else { // maxEspaceCeBord > maxEspaceTotal
  502. cout<<"maxEspaceCeBord>maxEspaceTotal"<<endl;
  503. maxEspaceTotal = maxEspaceCeBord;
  504. for (j=0; j<i; j++) {
  505. listeBords->erase(listeBords->begin());
  506. }
  507. i = 1;
  508. cout<<"maxEspaceCeBord>maxEspaceTotal : i = "<<i<<" - listeBords->size() : " <<listeBords->size()<<endl;
  509. }
  510. }
  511. cout<<"liste des Bords les plus vides :"<<endl;
  512. afficherVecteurInt(listeBords);
  513. cout<<"fin de la liste des Bords les plus vides"<<endl;
  514. return ((int)listeBords->size()>0);
  515. }
  516. bool regles::CoinVide(vector<int> * listeCoins) {
  517. traceTemp+=" && CoinVide ";
  518. //cout<<"size : "<<listeCoins->size()<<endl;
  519. int i = 0;
  520. while (i<(int)listeCoins->size()) {
  521. cout<<"i : "<<i<<endl;
  522. cout<<"(*getZone((*listeCoins)[i]))[0].size() : "<<(int)(*getZone((*listeCoins)[i]))[0].size()<<endl;
  523. if ((int)(*getZone((*listeCoins)[i]))[0].size() > 0 ) { // nombre de pierres dans le coin
  524. cout<<"Hum, il y a une pierre en ("<<(*getZone((*listeCoins)[i]))[0][0]<<";"<<(*getZone((*listeCoins)[i]))[1][0]<<"), le coin "<<(*listeCoins)[i]<<" n'est donc pas vide"<<endl;
  525. listeCoins->erase(listeCoins->begin()+i);
  526. } else {
  527. cout<<"Le coin "<<(*listeCoins)[i]<<" est vide"<<endl;
  528. for (int j=0; j<(int)(*getZone((*listeCoins)[i]))[0].size(); j++) {
  529. cout<<(*getZone((*listeCoins)[i]))[0].size()<<endl;
  530. }
  531. i++;
  532. }
  533. }
  534. cout<<"liste des Coins vides :"<<endl;
  535. afficherVecteurInt(listeCoins);
  536. cout<<"fin de la liste des Coins vides"<<endl;
  537. return listeCoins->size()>0;
  538. }
  539. bool regles::appartientabord(vector<int> * listeCoins, vector<int> * listeBords) {
  540. traceTemp+=" && appartientabord ";
  541. // on considčre que la valeur des bords se trouve entre 0 et 9
  542. // on repčre les bords ŕ ajouter
  543. int i;
  544. vector<bool> bordAjoute;
  545. for (i=0; i<4; i++)
  546. bordAjoute.push_back(false); // sup : 0 , droite : 1, bas : 2, gauche : 3
  547. for (i=0; i<(int)listeCoins->size(); i++) {
  548. switch ((*listeCoins)[i]) {
  549. case COININFGAUCHE:
  550. bordAjoute[2] = true;
  551. bordAjoute[3] = true;
  552. break;
  553. case COINSUPGAUCHE:
  554. bordAjoute[0] = true;
  555. bordAjoute[3] = true;
  556. break;
  557. case COININFDROIT:
  558. bordAjoute[2] = true;
  559. bordAjoute[1] = true;
  560. break;
  561. case COINSUPDROIT:
  562. bordAjoute[0] = true;
  563. bordAjoute[1] = true;
  564. break;
  565. }
  566. }
  567. // on ajoute les bords dans la liste
  568. i=0;
  569. int case_tableau;
  570. while (i<(int)listeBords->size()) { // on parcourt la liste des bords
  571. switch ((*listeBords)[i]) {
  572. case BORDSUP :
  573. case_tableau = 0;
  574. break;
  575. case BORDDROIT :
  576. case_tableau = 1;
  577. break;
  578. case BORDINF :
  579. case_tableau = 2;
  580. break;
  581. case BORDGAUCHE :
  582. case_tableau = 3;
  583. break;
  584. default :
  585. case_tableau = 0;
  586. cout<<"erreur/error dans appartientAbord pour casetableau"<<endl;
  587. break;
  588. }
  589. if (bordAjoute[case_tableau]) // ce bord correspond
  590. i++;
  591. else
  592. listeBords->erase(listeBords->begin()+i);
  593. }
  594. cout<<"liste des Bords appartenants ŕ un des coins vides :"<<endl;
  595. afficherVecteurInt(listeBords);
  596. return i>0;
  597. }
  598. bool regles::joseki(vector<int> * listeCoins) { //renvoie vrai s'il existe un joseki dans un des coins, et enlčve les coins de c ne contenant pas de joseki
  599. traceTemp+=" && Joseki ";
  600. bool retour = false;
  601. int i;
  602. vector<vector <int> > * coups_coin;
  603. vector<vector <int> > liste_coups, tableauInutile;
  604. liste_coups.resize(2);
  605. tableauInutile.resize(TAILLE_JOSEKI);
  606. for (i=0; i<TAILLE_JOSEKI; i++)
  607. tableauInutile[i].resize(TAILLE_JOSEKI);
  608. i=0;
  609. while (!retour and i < (int)listeCoins->size()) {
  610. // cout<<"on va zyeuter listeCoins[i] qui vaut:"<<endl;
  611. cout<<(*listeCoins)[i]<<endl;
  612. coups_coin = getcoinJoseki((*listeCoins)[i]);
  613. if(alternerNoirBlanc(coups_coin,&liste_coups)){
  614. // on ordonne les coups pour les envoyer ŕ la fonction chercherPosition2 de DicoJoseki
  615. if (monIa->getDicoJoseki()->chercherPosition2(&liste_coups, &tableauInutile)) // il existe un joseki dans ce coin
  616. i++;
  617. else // pas de joseki dans ce coin
  618. listeCoins->erase(listeCoins->begin()+i);
  619. }
  620. }
  621. // cout<<"liste des Coins dans lesquels on peut jouer un joseki :"<<endl;
  622. afficherVecteurInt(listeCoins);
  623. return i>0;
  624. }
  625. bool regles::BordVide(vector<int> * listeBords) {
  626. traceTemp+=" && BordVide ";
  627. //cout<<"size : "<<listeBords->size()<<endl;
  628. int i = 0;
  629. while (i<(int)listeBords->size()) {
  630. if ((int)(*getZone((*listeBords)[i]))[0].size() > 0 ) { // nombre de pierres dans le coin
  631. //cout<<(*getZone((*listeBords)[i]))[0].size()<<endl;
  632. //cout<<"b : "<<i<<endl;
  633. listeBords->erase(listeBords->begin()+i);
  634. } else
  635. i++;
  636. }
  637. cout<<"liste des Bords vides :"<<endl;
  638. afficherVecteurInt(listeBords);
  639. cout<<"fin de la liste des Bords vides"<<endl;
  640. return ((int)listeBords->size()>0);
  641. }
  642. bool regles::groupe (vector<int> * listeGroupes) { // initialise la liste avec les groupes tout les groupes.
  643. traceTemp+="groupe ";
  644. //on efface le contenu de la liste (quand on l'appelle c'est pour renvoyer tous les groupes du goban)
  645. listeGroupes->clear();
  646. int tailleN = g->getListeGroupeN()->size(), tailleB = g->getListeGroupeB()->size(), i;
  647. listeGroupes->resize(tailleB + tailleN);
  648. /*cout<<"tailleN : "<<tailleN<<endl;
  649. cout<<"tailleB : "<<tailleB<<endl;
  650. cout<<"tailleN + tailleB : "<<tailleN + tailleB<<endl;*/
  651. for (i=0; i<tailleN; i++)
  652. (*listeGroupes)[i] = GROUPE_NOIR + i;
  653. for (i=tailleN; i<tailleN + tailleB; i++)
  654. (*listeGroupes)[i] = GROUPE_BLANC + i - tailleN;
  655. return i>0;
  656. }
  657. bool regles::GroupeN (vector<int> * listeGroupes) { // initialise la liste avec les groupes noirs si elle est vide, vire les groupes blancs sinon
  658. traceTemp+=" && GroupeN ";
  659. int i;
  660. int taille = listeGroupes->size();
  661. cout<<"GroupeN : taille : "<<taille<<endl;
  662. if (taille == 0) { // on remplit listeGroupe avec les groupes noirs
  663. taille = g->getListeGroupeN()->size();
  664. if (taille == 0)
  665. return false;
  666. else {
  667. listeGroupes->resize(taille);
  668. for (i=0 ; i<taille ; i++)
  669. (*listeGroupes)[i] = GROUPE_NOIR + i;
  670. }
  671. } else { // on vire les groupes blancs
  672. i=0;
  673. while (i<(int)listeGroupes->size()) {
  674. if ((*listeGroupes)[i]>=GROUPE_BLANC) // groupe blanc
  675. listeGroupes->erase(listeGroupes->begin()+i);
  676. else
  677. i++;
  678. }
  679. }
  680. cout<<"fin de groupe N : liste des groupes :"<<endl;
  681. afficherVecteurInt(listeGroupes);
  682. cout<<"fin de groupe N : fin"<<endl;
  683. return i>0;
  684. }
  685. bool regles::GroupeB (vector<int> * listeGroupes) { // initialise une liste des groupes
  686. traceTemp+=" && GroupeB ";
  687. int i;
  688. int taille = listeGroupes->size();
  689. if (taille == 0) { // on remplit listeGroupe avec les groupes blancs
  690. taille = g->getListeGroupeB()->size();
  691. if (taille == 0)
  692. return false;
  693. else {
  694. listeGroupes->resize(taille);
  695. for (i=0 ; i<taille ; i++)
  696. (*listeGroupes)[i] = GROUPE_BLANC + i;
  697. }
  698. } else { // on vire les groupes noirs
  699. i=0;
  700. while (i<(int)listeGroupes->size()) {
  701. if ((*listeGroupes)[i]<GROUPE_BLANC) // groupe noir
  702. listeGroupes->erase(listeGroupes->begin()+i);
  703. else
  704. i++;
  705. }
  706. }
  707. return i>0;
  708. }
  709. bool regles::PierreN(vector<int> * listeInter) { // vire les intersections ne contenant pas de pierres noires
  710. traceTemp+=" && PierreN ";
  711. cout<<"Début PierreN()"<<endl;
  712. int i=0;
  713. while (i<(int)listeInter->size()) {
  714. if (g->getIntersection(abscisse((*listeInter)[i]), ordonnee((*listeInter)[i]))->couleur() == NOIR) {
  715. i++;
  716. cout<<i<<endl;
  717. cout<<"L'intersection ("<<abscisse((*listeInter)[i])<<";"<<ordonnee((*listeInter)[i])<<") contient une pierre noire et est donc conservée"<<endl;
  718. } else {
  719. listeInter->erase(listeInter->begin()+i);
  720. }
  721. }
  722. cout<<"Fin PierreN() : taille : "<<listeInter->size()<<endl;
  723. return listeInter->size()>0;
  724. }
  725. bool regles::PierreB(vector<int> * listeInter) { // vire les intersections ne contenant pas de pierres blanches
  726. traceTemp+=" && PierreB ";
  727. cout<<"Début PierreB()"<<endl;
  728. int i=0;
  729. while (i<(int)listeInter->size()) {
  730. if (g->getIntersection(abscisse((*listeInter)[i]), ordonnee((*listeInter)[i]))->couleur() == BLANC) {
  731. i++;
  732. cout<<"L'intersection ("<<abscisse((*listeInter)[i])<<";"<<ordonnee((*listeInter)[i])<<") contient une pierre blanche et est donc conservée"<<endl;
  733. } else
  734. listeInter->erase(listeInter->begin()+i);
  735. }
  736. cout<<"Fin PierreB() : taille : "<<listeInter->size()<<endl;
  737. return listeInter->size()>0;
  738. }
  739. /*bool regles::superGroupe (vector<int> * listeSuperGroupes) // réinitialise une liste avec tous les supergroupes
  740. {
  741. //on efface le contenu de la liste (quand on l'appelle c'est pour renvoyer tous les groupes du goban)
  742. listeSuperGroupes->clear();
  743. int tailleN = g->getListeSuperGroupeN()->size(), tailleB = g->getListeSuperGroupeB()->size(), i;
  744. listeSuperGroupes->resize(tailleB + tailleN);
  745. for(i=0; i<tailleN; i++)
  746. (*listeSuperGroupes)[i] = SUPERGROUPE_NOIR + i;
  747. for(i=tailleN; i<tailleN + tailleB; i++)
  748. (*listeSuperGroupes)[i] = SUPERGROUPE_BLANC + i - tailleN;
  749. return i>0;
  750. }
  751. bool regles::SuperGroupeN (vector<int> * listeSuperGroupes) // initialise la liste avec les supergroupes noirs si elle est vide, vire les groupes blancs sinon
  752. {
  753. int i;
  754. int taille = listeSuperGroupes->size();
  755. if(taille == 0) // on remplit listeGroupe avec les supergroupes noirs
  756. {
  757. taille = g->getListeSuperGroupeN()->size();
  758. if(taille == 0)
  759. return false;
  760. else
  761. {
  762. listeSuperGroupes->resize(taille);
  763. for(i=0 ; i<taille ; i++)
  764. (*listeSuperGroupes)[i] = SUPERGROUPE_NOIR + i;
  765. }
  766. }
  767. else // on vire les supergroupes blancs
  768. {
  769. i=0;
  770. while(i<listeSuperGroupes->size())
  771. {
  772. if((*listeSuperGroupes)[i]>=SUPERGROUPE_BLANC) // supergroupe blanc
  773. listeSuperGroupes->erase(listeSuperGroupes->begin()+i);
  774. else
  775. i++;
  776. }
  777. }
  778. return i>0;
  779. }
  780. bool regles::SuperGroupeB (vector<int> * listeSuperGroupes) // initialise la liste avec les supergroupes blancs si elle est vide, vire les groupes noirs sinon
  781. {
  782. int i;
  783. int taille = listeSuperGroupes->size();
  784. if(taille == 0) // on remplit listeSuperGroupe avec les supergroupes blancs
  785. {
  786. taille = g->getListeSuperGroupeB()->size();
  787. if(taille == 0)
  788. return false;
  789. else
  790. {
  791. listeSuperGroupes->resize(taille);
  792. for(i=0 ; i<taille ; i++)
  793. (*listeSuperGroupes)[i] = SUPERGROUPE_BLANC + i;
  794. }
  795. }
  796. else // on vire les supergroupes noirs
  797. {
  798. i=0;
  799. while(i<listeSuperGroupes->size())
  800. {
  801. if((*listeSuperGroupes)[i]<SUPERGROUPE_BLANC) // supergroupe noir
  802. listeSuperGroupes->erase(listeSuperGroupes->begin()+i);
  803. else
  804. i++;
  805. }
  806. }
  807. return i>0;
  808. }*/
  809. bool regles::ligne (vector<int> * listeLignes) { //réinitialise une liste des lignes
  810. traceTemp+="ligne ";
  811. listeLignes->resize(abscisseTengen() + 1);
  812. for (int i=0; i<=abscisseTengen(); i++)
  813. (*listeLignes)[i] = i;
  814. return 1;
  815. }
  816. bool regles::lignes(vector<int> * listeLignes, int numLigne) { // supprime toutes les lignes différentes de numLigne
  817. traceTemp+=" && ligne(";
  818. traceTemp+=(numLigne+48);
  819. traceTemp+=" )";
  820. bool trouve=false;
  821. int i=0;
  822. while (i<(int)listeLignes->size() and !trouve) {
  823. if ((*listeLignes)[i] == numLigne)
  824. trouve = true;
  825. else
  826. i++;
  827. }
  828. if (trouve) {
  829. listeLignes->resize(1);
  830. (*listeLignes)[0] = numLigne;
  831. } else
  832. listeLignes->resize(0);
  833. return trouve;
  834. }
  835. bool regles::libertes(vector<int> * groupes, int libertes) { // supprime les groupes ayant au moins [libertes] libertés de la liste, retourne false si la liste est vide ŕ la fin
  836. traceTemp+=" && libertes ( ";
  837. traceTemp+=libertes+48;
  838. traceTemp+=" ) ";
  839. int i=0;
  840. cout<<"nombre de groupes noirs sur le goban : "<<g->getListeGroupeN()->size()<<endl;
  841. cout<<"nombre de groupes blancs sur le goban : "<<g->getListeGroupeB()->size()<<endl;
  842. cout<<"nombre de groupes : "<<groupes->size()<<endl;
  843. while (i<(int)groupes->size()) {
  844. cout<<"groupe "<<(*groupes)[i]<<endl;
  845. if ((*groupes)[i]<GROUPE_BLANC) { // le groupe est noir
  846. cout<<"groupe noir numero "<<(*groupes)[i]-GROUPE_NOIR<<endl;
  847. if ((*(g->getListeGroupeN()))[(*groupes)[i]-GROUPE_NOIR]->getNbLib() >= libertes) // si le groupe a trop de libertés
  848. groupes->erase(groupes->begin()+i);
  849. else
  850. i++;
  851. } else { // le groupe est blanc
  852. cout<<"groupe blanc numero "<<(*groupes)[i]-GROUPE_BLANC<<endl;
  853. if ((*(g->getListeGroupeB()))[(*groupes)[i]-GROUPE_BLANC]->getNbLib()>=libertes) // si le groupe a trop de libertés
  854. groupes->erase(groupes->begin()+i);
  855. else
  856. i++;
  857. }
  858. }
  859. cout<<"fin de bool regles::libertes(vector<int> * groupes, int libertes)"<<endl;
  860. return i>0;
  861. }
  862. bool regles::libertesInterN(vector<int> * inter, int lib) { // élimine les intersections ayant moins de lib libertes, la couleur considérée est celle de l'IA
  863. traceTemp+=" && libertesInterN( ";
  864. traceTemp+=lib+48;
  865. traceTemp+=" ) ";
  866. cout<<"Debut de libertesInterN(inter, lib) : taille : inter->size()"<<endl;
  867. int i=0, absc, ord;
  868. char couleur = NOIR;
  869. while (i<(int)inter->size()) {
  870. absc = abscisse((*inter)[i]);
  871. ord = ordonnee((*inter)[i]);
  872. cout<<"intersection ("<<absc<<","<<ord<<") : "<<endl;
  873. if (g->caseJouable(absc, ord, couleur) == false){
  874. inter->erase(inter->begin()+i);
  875. cout<<"Case injouable"<<endl;
  876. } else {
  877. Goban gob(g);
  878. gob.poserPierreLite(couleur, absc, ord);
  879. if (gob.getIntersection(absc, ord)->getGroupe()->getNbLib() < lib) {
  880. cout<<"L'intersection en ("<<absc<<";"<<ord<<") n'offrirait que "<<gob.getIntersection(absc, ord)->getGroupe()->getNbLib()<<" libertés ŕ "<<couleur<<" et est donc rejetée"<<endl;
  881. inter->erase(inter->begin()+i);
  882. } else {
  883. cout<<"L'intersection en ("<<absc<<";"<<ord<<") offrirait "<<gob.getIntersection(absc, ord)->getGroupe()->getNbLib()<<" libertés ŕ "<<couleur<<" et est donc retenue"<<endl;
  884. i++;
  885. }
  886. }
  887. }
  888. cout<<"Fin de libertesInterN"<<endl;
  889. return inter->size()>0;
  890. }
  891. bool regles::libertesInterB(vector<int> * inter, int lib) { // élimine les intersections ayant moins de lib libertes
  892. traceTemp+=" && libertesInterB ";
  893. cout<<"Debut de libertesInter(inter, lib)"<<endl;
  894. int i=0, absc, ord;
  895. char couleur = BLANC;
  896. while (i<(int)inter->size()) {
  897. Goban gob(g);
  898. absc = abscisse((*inter)[i]);
  899. ord = ordonnee((*inter)[i]);
  900. gob.poserPierre(couleur, absc, ord);
  901. if (gob.caseJouable(absc, ord, couleur) == false) {
  902. inter->erase(inter->begin()+i);
  903. }
  904. if (gob.getIntersection(absc, ord)->getGroupe()->getNbLib() < lib) {
  905. cout<<"L'intersection en ("<<absc<<";"<<ord<<") n'offrirait que "<<gob.getIntersection(absc, ord)->getGroupe()->getNbLib()<<" libertés ŕ "<<couleur<<" et est donc rejetée"<<endl;
  906. inter->erase(inter->begin()+i);
  907. } else {
  908. cout<<"L'intersection en ("<<absc<<";"<<ord<<") offrirait "<<gob.getIntersection(absc, ord)->getGroupe()->getNbLib()<<" libertés ŕ "<<couleur<<" et est donc retenue"<<endl;
  909. i++;
  910. }
  911. }
  912. cout<<"Fin de libertesInter"<<endl;
  913. return inter->size()>0;
  914. }
  915. //enleve tous les groupes qui n'ont pas une liberté qui est une intersction de la liste et toutes les intersections qui ne sont pas des libertés dans des groupes
  916. bool regles::liberteGroupe(vector<int> * intersections, vector<int> * groupes) {
  917. traceTemp+=" && libertes ";
  918. //cout<<"LIBERTEGROUPE!!!!"<<endl;
  919. bool trouve;
  920. for (int j = 0; j < (int)intersections->size(); j++) {
  921. int i=0;
  922. trouve = false;
  923. while (i<(int)groupes->size()&& !trouve) {
  924. //le groupe est blancs
  925. if ((*groupes)[i]>=GROUPE_BLANC) {
  926. if ((*(g->getListeGroupeB()))[(*groupes)[i]-GROUPE_BLANC]->findLiberte(abscisse((*intersections)[j]), ordonnee((*intersections)[j])) ) {
  927. trouve=true;
  928. }
  929. } else { //le groupe est noir
  930. if ((*(g->getListeGroupeN()))[(*groupes)[i]-GROUPE_NOIR]->findLiberte(abscisse((*intersections)[j]), ordonnee((*intersections)[j])) ) {
  931. trouve=true;
  932. }
  933. }
  934. i++;
  935. }
  936. cout<<"intersection: "<<abscisse((*intersections)[j])<<" - "<<ordonnee((*intersections)[j])<< "trouve: "<<trouve<<endl;
  937. if (!trouve) {
  938. intersections->erase(intersections->begin()+j);
  939. j--;
  940. }
  941. }
  942. for (int j = 0; j < (int)groupes->size(); j++) {
  943. int i=0;
  944. trouve = false;
  945. while (i<(int)intersections->size()&& !trouve) {
  946. //le groupe est blancs
  947. if ((*groupes)[j]>=GROUPE_BLANC) {
  948. if ((*(g->getListeGroupeB()))[(*groupes)[j]-GROUPE_BLANC]->findLiberte(abscisse((*intersections)[i]), ordonnee((*intersections)[i])) ) {
  949. trouve=true;
  950. }
  951. } else { //le groupe est noir
  952. if ((*(g->getListeGroupeN()))[(*groupes)[j]-GROUPE_NOIR]->findLiberte(abscisse((*intersections)[i]), ordonnee((*intersections)[i])) ) {
  953. trouve=true;
  954. }
  955. }
  956. i++;
  957. }
  958. if (!trouve) {
  959. groupes->erase(groupes->begin()+j);
  960. j--;
  961. }
  962. }
  963. //cout<<"FIN LIBERTE GROUPE"<<endl;
  964. return groupes->size()>0;
  965. }
  966. bool regles::nbPierres(vector<int> * groupes, int pierres) { // supprime les groupes ayant de moins de pieres que [pierres] retourne false si la liste est vide ŕ la fin
  967. traceTemp+=" && nbPierres > ";
  968. traceTemp+=pierres;
  969. int i=0;
  970. /*cout<<"nombre de groupes noirs sur le goban : "<<g->getListeGroupeN()->size()<<endl;
  971. cout<<"nombre de groupes blancs sur le goban : "<<g->getListeGroupeB()->size()<<endl;
  972. cout<<"nombre de groupes : "<<groupes->size()<<endl;*/
  973. while (i<(int)groupes->size()) {
  974. //cout<<"groupe "<<(*groupes)[i]<<endl;
  975. if ((*groupes)[i]<GROUPE_BLANC) { // le groupe est noir
  976. //cout<<"groupe noir numero "<<(*groupes)[i]-GROUPE_NOIR<<endl;
  977. if ((*(g->getListeGroupeN()))[(*groupes)[i]-GROUPE_NOIR]->getNbPierres() < pierres) // si le groupe a moins de libertés que demandé
  978. groupes->erase(groupes->begin()+i);
  979. else
  980. i++;
  981. } else { // le groupe est blanc
  982. //cout<<"groupe blanc numero "<<(*groupes)[i]-GROUPE_BLANC<<endl;
  983. if ((*(g->getListeGroupeB()))[(*groupes)[i]-GROUPE_BLANC]->getNbPierres() < pierres) // si le groupe a moins de libertés que demandé
  984. groupes->erase(groupes->begin()+i);
  985. else
  986. i++;
  987. }
  988. }
  989. //cout<<"fin de bool regles::libertes(vector<int> * groupes, int libertes)"<<endl;
  990. return i>0;
  991. }
  992. bool regles::momentPartie(int moment) { // retoure vrai si on est dans la période de la partie indiquée
  993. traceTemp+=" && (momentParties = ";
  994. traceTemp+=moment;
  995. machiaFait instant;
  996. instant.id = moment;
  997. instant.args.resize(0);
  998. return testerFait(instant);
  999. }
  1000. bool regles::nbcoupsjoues(int nb) { // indique si au moins nb coups ont été joués
  1001. traceTemp+=" && nbCoupsJoues >";
  1002. traceTemp+=(char)nb;
  1003. return (int)g->getHistorique().size() >= nb;
  1004. }
  1005. bool regles::shisho(vector<int> * groupes) {
  1006. traceTemp+=" && Shisho ";
  1007. int i=0;
  1008. int j=0;
  1009. while (i<(int)groupes->size()) {
  1010. Goban * g1 = new Goban(g);
  1011. string sTemp = "\n \n ++++++++++++++++++ \n nouveau Shisho \n ++++++++++++++++++ \n \n";
  1012. g1->setTrace("shishoERR.txt");
  1013. g->trace("shisho.txt",1,1,&sTemp);
  1014. //g1->write("début d'un nouveau shisho");
  1015. Goban * g2 = new Goban(g);
  1016. g2->setTrace("shishoERR.txt");
  1017. //g2->write("début d'un nouveau shisho");
  1018. if ((*groupes)[i]>=GROUPE_BLANC) { // le groupe est noir
  1019. cout<<"shisho ORIGINEL ! ! ! ! "<<endl;
  1020. cout<<"trace : nbLib : "<<(*(g->getListeGroupeB()))[(*groupes)[i]-GROUPE_BLANC]->getNbLib()<<endl;
  1021. /* if (!(
  1022. (
  1023. ((*(g->getListeGroupeB()))[(*groupes)[i]-GROUPE_BLANC]->getNbLib()==2)
  1024. &&
  1025. shisho2(g1, (*(g1->getListeGroupeB()))[(*groupes)[i]-GROUPE_BLANC])
  1026. )||(
  1027. ((*(g->getListeGroupeB()))[(*groupes)[i]-GROUPE_BLANC]->getNbLib()==1)
  1028. &&
  1029. shisho1(g2,(*(g2->getListeGroupeB()))[(*groupes)[i]-GROUPE_BLANC])
  1030. )
  1031. )) {
  1032. groupes->erase(groupes->begin()+i);
  1033. j++;
  1034. } else {
  1035. i++;
  1036. }
  1037. */
  1038. //LA PARTIE AU DESSUS SEGFAULT!
  1039. //remplacement:
  1040. bool bTemp=false;
  1041. if((*(g->getListeGroupeB()))[(*groupes)[i]-GROUPE_BLANC]->getNbLib()==2){
  1042. cout<<"pre S2"<<endl;
  1043. bTemp+=shisho2(g1, (*(g1->getListeGroupeB()))[(*groupes)[i]-GROUPE_BLANC]);
  1044. cout<<"post S2"<<endl;
  1045. }
  1046. if(bTemp==0 && (*(g->getListeGroupeB()))[(*groupes)[i]-GROUPE_BLANC]->getNbLib()==1){
  1047. cout<<"pre S1"<<endl;
  1048. shisho1(g2,(*(g2->getListeGroupeB()))[(*groupes)[i]-GROUPE_BLANC]);
  1049. cout<<"post S1"<<endl;
  1050. }
  1051. if(!bTemp){
  1052. groupes->erase(groupes->begin()+i);
  1053. j++;
  1054. } else {
  1055. i++;
  1056. }
  1057. } else { // le groupe est blanc
  1058. if (!( (((*(g->getListeGroupeN()))[(*groupes)[i]-GROUPE_NOIR]->getNbLib()==2) && shisho2(g1, (*(g1->getListeGroupeN()))[(*groupes)[i]-GROUPE_NOIR]) ) ||
  1059. (((*(g->getListeGroupeN()))[(*groupes)[i]-GROUPE_NOIR]->getNbLib()==1) && shisho1(g2,(*(g2->getListeGroupeN()))[(*groupes)[i]-GROUPE_NOIR])))) {
  1060. groupes->erase(groupes->begin()+i);
  1061. j++;
  1062. } else {
  1063. i++;
  1064. }
  1065. }
  1066. delete g1;
  1067. delete g2;
  1068. }
  1069. cout<<i<<" groupes pris dans des shishos !"<<endl;
  1070. return i>0;
  1071. }
  1072. bool regles::atari(Coup cp, Goban * g) {
  1073. char c2= couleurOppose(cp.c);
  1074. int x = cp.x;
  1075. int y = cp.y;
  1076. if ( (g->getIntersection(x-1,y)->couleur() == c2 && g->getIntersection(x-1,y)->getGroupe()->getNbLib() < 2) ||
  1077. (g->getIntersection(x,y-1)->couleur() == c2 && g->getIntersection(x,y-1)->getGroupe()->getNbLib() < 2) ||
  1078. (g->getIntersection(x+1,y)->couleur() == c2 && g->getIntersection(x+1,y)->getGroupe()->getNbLib() < 2) ||
  1079. (g->getIntersection(x,y+1)->couleur() == c2 && g->getIntersection(x,y+1)->getGroupe()->getNbLib() < 2)) {
  1080. return true;
  1081. } else {
  1082. return false;
  1083. }
  1084. }
  1085. //prend un groupe qui a une liberté
  1086. bool regles::shisho1(Goban * g1,Groupe * gp) {
  1087. cout<<"shisho1 ! ! ! ! "<<endl;
  1088. cout<<"trace : nbLib : "<<gp->getNbLib()<<endl;
  1089. Groupe * gr2;
  1090. string sTemp = "Shisho1";
  1091. g1->trace("shisho.txt",1,1,&sTemp);
  1092. Coup cp;
  1093. g1->afficher();
  1094. //cout<<gp->getNbLib()<<endl;
  1095. cp.x = gp->getLibertes(0).x;
  1096. cp.y = gp->getLibertes(0).y;
  1097. cp.c = gp->getCouleur();
  1098. cout<<(int)cp.x<<" - "<<(int)cp.y<<endl;
  1099. if (!g1->caseJouable(cp)) {
  1100. return true;
  1101. } else {
  1102. sTemp="TRACE BEFORE :";
  1103. g1->trace("shisho.txt",1,1,&sTemp);
  1104. //cout<<"TRACE : NBLIB BEFORE! : "<<(*(gp->getLibertes())).size()<<" / "<<gp->getNbLib()<<endl;
  1105. g1->poserPierreLite(cp);
  1106. sTemp="TRACE AFTER :";
  1107. g1->trace("shisho.txt",1,1,&sTemp);
  1108. //g1->poserPierre(cp);
  1109. gr2= (g1->getIntersection(cp.x, cp.y)->getGroupe());
  1110. //cout<<"TRACE : NBLIB AFTER : "<<(*(gr2->getLibertes())).size()<<" / "<<gr2->getNbLib()<<endl;
  1111. if (atari(cp,g1)) {
  1112. cout<<"atari!"<<endl;
  1113. return false;
  1114. } else {
  1115. cout<<"shisho1.4 ! ! ! ! "<<endl;
  1116. g1->afficher();
  1117. cout<<"fin shisho1"<<endl;
  1118. return shisho2(g1, gr2);
  1119. }
  1120. }
  1121. }
  1122. //prend un groupe qui a 2 libertés
  1123. bool regles::shisho2(Goban * g1,Groupe * gp) {
  1124. string sTemp = "Shisho2";
  1125. g1->trace("shisho.txt",1,1,&sTemp);
  1126. cout<<"shisho2 ! ! ! ! "<<endl;
  1127. cout<<"trace : nbLib : "<<gp->getNbLib()<<endl;
  1128. g1->afficher();
  1129. if (gp->getNbLib()==2) {
  1130. bool retour = false;
  1131. //g2->afficher();
  1132. Coup cp, cp2, cpG; //cp et cp2 sont les coups sur les libertés. cpG est une des pierres du groupe.
  1133. cp.x = gp->getLibertes(0).x;
  1134. cp.y = gp->getLibertes(0).y;
  1135. cp2.x = gp->getLibertes(1).x;
  1136. cp2.y = gp->getLibertes(1).y;
  1137. cpG.x = (*(gp->getListe()))[0]->getX();
  1138. cpG.y = (*(gp->getListe()))[0]->getY();
  1139. cout<<(int)cp.x<<" - "<<(int)cp.y<<endl;
  1140. cp.c = couleurOppose(gp->getCouleur());
  1141. if(g1->caseJouable(cp)){
  1142. g1->poserPierreLite(cp);
  1143. //g1->afficher();
  1144. retour = shisho1(g1, gp);
  1145. }
  1146. if(!retour ){
  1147. Goban * g2 = new Goban(g1);
  1148. //cout<<" TRACE R1 : "<<gp->getListe()->size()<<endl;
  1149. //cout<<" TRACE R2 : "<<(*(gp->getListe()))[0]->getX()<<endl;
  1150. Groupe * Gp2 = g2->getIntersection(cpG.x ,cpG.y)->getGroupe();
  1151. cp2.c = couleurOppose(gp->getCouleur());
  1152. cout<<(int)cp2.x<<" - "<<(int)cp2.y<<endl;
  1153. if(g2->caseJouable(cp2)){
  1154. g2->poserPierreLite(cp2);
  1155. //g2->afficher();
  1156. retour += shisho1(g2,Gp2 );
  1157. }
  1158. // cout<<"appel shisho1"<<endl;
  1159. // bool b = shisho1(g2, g2->getIntersection(gp->getListe()[0]->getX(),gp->getListe()[0]->getY())->getGroupe()) || shisho1(g1, gp); //A RETOUCHER ! ! ! !
  1160. delete g2;
  1161. }
  1162. cout<<"fin shisho2"<<endl;
  1163. return retour;
  1164. } else {
  1165. cout<<"sortie des conditions..."<<gp->getNbLib()<<endl;
  1166. return (gp->getNbLib() < 2);
  1167. }
  1168. }
  1169. bool regles::surLigne(vector<int> * inter, int numligne) {
  1170. /*
  1171. traceTemp+=" && surLigne( ";
  1172. traceTemp+=numligne+48;
  1173. traceTemp+=" ) ";
  1174. */
  1175. cout<<"Début de surLigne"<<endl;
  1176. int i=0, x, y;
  1177. while (i<(int)inter->size()) {
  1178. x = abscisse((*inter)[i]);
  1179. y = ordonnee((*inter)[i]);
  1180. if ((x == numligne || y == numligne || x == g->getTaille()-1-numligne || y == g->getTaille()-1-numligne) && x>=numligne && y>=numligne && x <= g->getTaille()-1-numligne && y <= g->getTaille()-1-numligne) {
  1181. i++;
  1182. cout<<"l'intersection ("<<x<<";"<<y<<") est sur la ligne "<<numligne<<" et est donc conservée"<<endl;
  1183. } else
  1184. inter->erase(inter->begin()+i);
  1185. }
  1186. cout<<"regles::surLigne : taille de inter : "<<inter->size()<<endl;
  1187. return inter->size()>0;
  1188. }
  1189. void regles::J_shisho(vector<vector<int> > arguments, regles * r, int poids) {
  1190. cout<<"J_Shisho!"<<endl;
  1191. int taille = arguments[0].size();
  1192. Groupe * grp;
  1193. int i;
  1194. char couleur;
  1195. vector<vector<int> > * p = r->getPoids();
  1196. for (i=0; i<taille; i++) {
  1197. if (arguments[0][i]<GROUPE_BLANC) { // groupe noir
  1198. if ((arguments[0][i] -GROUPE_NOIR) >= (int)(*(r->getGoban()->getListeGroupeN())).size()) {
  1199. cout<<"ERROR : ERREUR DANS LE CHOIX DU GROUPE NOIR : "<<arguments[0][i] -GROUPE_NOIR<<endl;
  1200. grp = 0;
  1201. } else {
  1202. cout<<"gp : n "<<arguments[0][i] - GROUPE_NOIR<<endl;
  1203. grp = (*(r->getGoban()->getListeGroupeN()))[arguments[0][i]-GROUPE_NOIR];
  1204. couleur = NOIR;
  1205. }
  1206. } else { //groupe blanc
  1207. if ((arguments[0][i] -GROUPE_BLANC) >= (int)(*(r->getGoban()->getListeGroupeB())).size()) {
  1208. cout<<"ERROR : ERREUR DANS LE CHOIX DU GROUPE BLANC : "<<arguments[0][i] -GROUPE_BLANC<<endl;
  1209. grp = 0;
  1210. } else {
  1211. cout<<"gp : b "<<arguments[0][i] - GROUPE_BLANC<<endl;
  1212. grp = (*(r->getGoban()->getListeGroupeB()))[arguments[0][i]-GROUPE_BLANC];
  1213. couleur = BLANC;
  1214. }
  1215. }
  1216. if (grp->getNbLib()==2) {
  1217. // if (grp.getNbLib()==1){r->getGoban(); shisho1(grp);}
  1218. Coup lib1;
  1219. lib1.x = grp->getLibertes(0).x ;
  1220. lib1.y = grp->getLibertes(0).y;
  1221. lib1.c='n';
  1222. Coup lib2;
  1223. lib2.x = grp->getLibertes(1).x ;
  1224. lib2.y = grp->getLibertes(1).y;
  1225. lib2.c='n';
  1226. //on crée des copies locales du goban.
  1227. Goban * g1 = new Goban(r->getGoban());
  1228. Goban * g2 = new Goban(r->getGoban());
  1229. //on bouche une liberté sur chaque goban.
  1230. string sTemp = "J_Shisho : lib1 :";
  1231. sTemp+=lib1.x;
  1232. sTemp+=" - ";
  1233. sTemp+=lib1.y;
  1234. sTemp+=" / Lib2 : ";
  1235. sTemp+=lib2.x;
  1236. sTemp+=" - ";
  1237. sTemp+=lib2.y;
  1238. bool b = false;
  1239. r->getGoban()->trace("Jsihso.txt",1,1,&sTemp);
  1240. if(r->getGoban()->caseJouable(lib1)){
  1241. g1->poserPierreLite(lib1);
  1242. Groupe * gp1 = g1->getIntersection((*(grp->getListe()))[0]->getX(),(*(grp->getListe()))[0]->getY())->getGroupe() ;
  1243. if (r->shisho1(g1,gp1)) {
  1244. (*p)[lib1.x][lib1.y] += (grp->getNbPierres() * poids);
  1245. cout<<"shisho validé"<<endl;
  1246. b = true;
  1247. }
  1248. }
  1249. if(r->getGoban()->caseJouable(lib2)){
  1250. g2->poserPierreLite(lib2);
  1251. Groupe * gp2 = g2->getIntersection((*(grp->getListe()))[0]->getX(),(*(grp->getListe()))[0]->getY())->getGroupe();
  1252. if (r->shisho1(g2,gp2)) {
  1253. (*p)[lib2.x][lib2.y] += (grp->getNbPierres() * poids);
  1254. cout<<"shisho validé"<<endl;
  1255. b = true;
  1256. }
  1257. }
  1258. /*
  1259. Groupe * gp1 = g1->getIntersection((*(grp->getListe()))[0]->getX(),(*(grp->getListe()))[0]->getY())->getGroupe() ;
  1260. Groupe * gp2 = g2->getIntersection((*(grp->getListe()))[0]->getX(),(*(grp->getListe()))[0]->getY())->getGroupe();
  1261. if (r->shisho1(g1,gp1)) {
  1262. (*p)[lib1.x][lib1.y] += (grp->getNbPierres() * poids);
  1263. cout<<"shisho validé"<<endl;
  1264. b = true;
  1265. }
  1266. if (r->shisho1(g2,gp2)) {
  1267. (*p)[lib2.x][lib2.y] += (grp->getNbPierres() * poids);
  1268. cout<<"shisho validé"<<endl;
  1269. b = true;
  1270. }
  1271. */
  1272. if (b== false) {
  1273. cout<<"ERREUR ! : Shisho non RETROUVE"<<endl;
  1274. }
  1275. delete g1;
  1276. delete g2;
  1277. } else if (grp->getNbLib()==1) {
  1278. int lib1x = grp->getLibertes(0).x ;
  1279. int lib1y = grp->getLibertes(0).y;
  1280. (*p)[lib1x][lib1y] += (grp->getNbPierres() * poids);
  1281. } else {
  1282. cout<<"ERREUR sur nb liberté du groupe en shisho!!!!"<<endl;
  1283. }
  1284. }
  1285. }
  1286. /*bool regles::Shicho1lib(int numInterPierreAgressee) // retourne vrai si le shicho fonctionne
  1287. {
  1288. Groupe * grp = g->getIntersection(abscisse(numInterPierreAgressee), ordonnee(numInterPierreAgressee))->getGroupe();
  1289. if(grp->getNbLib() > 1)
  1290. return false;
  1291. else if(!(g->caseJouable((*(grp->getLibertes()))[0][0]), (*(grp->getLibertes()))[0][1], grp->getCouleur())) // si la liberte est une case de suicide
  1292. return true
  1293. else // deux libertés
  1294. {
  1295. Goban gob = new Goban(g);
  1296. gob.poserPierre(grp->getCouleurOpposee(), )
  1297. grp = g->getIntersection(abscisse(numInterPierreAgressee), ordonnee(numInterPierreAgressee))->getGroupe();
  1298. return ShichoRecursif(grp);
  1299. }
  1300. }
  1301. bool regles::ShichoRecursif(Groupe * grp)
  1302. {
  1303. // grp n'a qu'une liberté qui est jouable
  1304. if(gob_test->caseJouable()
  1305. gob_test.poserPierre(grp->getCouleur(), (*grp->getLibertes())[0][0], (*grp->getLibertes())[1][0]);
  1306. grp = g->getIntersection(abscisse(numInterPierreAgressee), ordonnee(numInterPierreAgressee))->getGroupe();
  1307. switch(grp->getNbLib())
  1308. {
  1309. case 3 :
  1310. return false;
  1311. }
  1312. }
  1313. */
  1314. //fonctions conclusion:
  1315. bool regles::Tengen(vector<int> * intersections) { // supprime les intersections ne correspondant pas au tengen, retourne faux si le tengen n'est pas dans la liste
  1316. bool retour = false;
  1317. int i = 0, tengen = numInterTengen();
  1318. cout<<"tengen : "<<tengen<<endl;
  1319. while (i<(int)intersections->size() && retour == false) {
  1320. if ((*intersections)[i] == tengen) // Tengen
  1321. retour = true;
  1322. else
  1323. i++;
  1324. }
  1325. if (retour == true) {
  1326. intersections->resize(1);
  1327. (*intersections)[0] = tengen;
  1328. } else
  1329. intersections->resize(0);
  1330. return retour;
  1331. }
  1332. bool regles::tobi(vector<int> * listeInterA, vector<int> * listeInterB) { // supprime les éléments de chaque liste ne permettant pas de faire un tobi avec un élément de l'autre liste;
  1333. traceTemp+=" && tobi ";
  1334. cout<<"Début de tobi"<<endl;
  1335. vector<bool> interOkA, interOkB;
  1336. int i, j, diffX, diffY;
  1337. interOkA.resize(listeInterA->size());
  1338. interOkB.resize(listeInterB->size());
  1339. for (i=0; i<(int)listeInterA->size(); i++)
  1340. interOkA[i]=false;
  1341. for (j=0; j<(int)listeInterB->size(); j++)
  1342. interOkB[j]=false;
  1343. cout<<"tobi : listeInterB : "<<endl;
  1344. afficherVecteurInt(listeInterB);
  1345. for (i=0; i<(int)listeInterA->size(); i++) {
  1346. for (j=0; j<(int)listeInterB->size(); j++) {
  1347. if (!interOkA[i] || !interOkB[j]) {
  1348. diffX = abs(abscisse((*listeInterB)[j])-abscisse((*listeInterA)[i]));
  1349. diffY = abs(ordonnee((*listeInterB)[j])-ordonnee((*listeInterA)[i]));
  1350. if (((diffX == 2 && diffY == 0) || (diffX == 0 && diffY == 2)) && g->getIntersection((abscisse((*listeInterB)[j])+abscisse((*listeInterA)[i]))/2, (ordonnee((*listeInterB)[j])+ordonnee((*listeInterA)[i]))/2)->couleur() == VIDE) { // c'est un tobi
  1351. interOkA[i] = true;
  1352. interOkB[j] = true;
  1353. cout<<"Les intersections ("<<abscisse((*listeInterA)[i])<<";"<<ordonnee((*listeInterA)[i])<<") et ("<<abscisse((*listeInterB)[j])<<";"<<ordonnee((*listeInterB)[j])<<") forment un tobi et seront donc retenues"<<endl;
  1354. }
  1355. }
  1356. }
  1357. }
  1358. for (i=interOkA.size()-1; i>=0; i--) {
  1359. if (interOkA[i] == false)
  1360. listeInterA->erase(listeInterA->begin()+i);
  1361. }
  1362. for (j=interOkB.size()-1; j>=0; j--) {
  1363. if (interOkB[j] == false)
  1364. listeInterB->erase(listeInterB->begin()+j);
  1365. }
  1366. cout<<"Fin de tobi"<<endl;
  1367. return listeInterB->size()>0; // listeInterA->size() est donc également >0
  1368. }
  1369. bool regles::videAutour(vector<int> * listeIntersections, int distance) {
  1370. traceTemp+=" && videAutour(";
  1371. traceTemp+=(distance+48);
  1372. traceTemp+=")";
  1373. int i = 0, ligne, colonne;
  1374. //int xinter, yinter;
  1375. bool pierre;
  1376. Intersection * inter;
  1377. while (i < (int)listeIntersections->size()) {
  1378. pierre = false;
  1379. inter = getIntersection((*listeIntersections)[i]);
  1380. // ligne = max(inter->getX() - distance, 0);
  1381. ligne = inter->getX() - distance;
  1382. // on parcourt les intersections alentours ŕ la recherche d'une pierre
  1383. //while(ligne < min(inter->getX()+distance, g->getTaille()-1) and pierre == false)
  1384. while (ligne < inter->getX()+distance+1 and pierre == false) {
  1385. //colonne = max(inter->getY() - distance, 0);
  1386. colonne = inter->getY() - distance;
  1387. //while(colonne < min(inter->getY()+distance, g->getTaille()-1) and pierre == false)
  1388. while (colonne < inter->getY()+distance+1 and pierre == false) {
  1389. if (g->getIntersection(ligne, colonne)->couleur() == VIDE /* or (ligne == inter->getX() and colonne == inter->getY()) */ || ((colonne == inter->getY() - distance || colonne == inter->getY() + distance) && (ligne == inter->getX() - distance || ligne == inter->getX() + distance))) {
  1390. //cout<<"intersection "<<ligne<<" - "<<colonne<<"est safe pour la pierre"<<inter->getX()<<" - "<<inter->getY()<<endl;
  1391. colonne++;
  1392. } else {
  1393. pierre = true;
  1394. //cout<<"inter->getY()+distance : "<<inter->getY()+distance<<" - g->getTaille()-1 : "<<g->getTaille()-1<<" - min(inter->getY()+distance, g->getTaille()-1) :"<<min(inter->getY()+distance, g->getTaille()-1)<<endl;
  1395. //cout<<"case "<<i<<" : La pierre en ("<<ligne<<", "<<colonne<<") fait que l'intersection numéro "<<(*listeIntersections)[i]<<" ("<<inter->getX()<<", "<<inter->getY()<<") n'a pas été retenue"<<endl;
  1396. }
  1397. }
  1398. ligne++;
  1399. }
  1400. // une pierre a été trouvée, on retire l'intersection étudiée de la liste
  1401. if (pierre == true)
  1402. listeIntersections->erase(listeIntersections->begin() + i);
  1403. else {
  1404. i++;
  1405. cout<<"case "<<i<<" : L'intersection numéro "<<(*listeIntersections)[i]<<" ("<<inter->getX()<<", "<<inter->getY()<<") ne comprend aucune pierre ŕ "<<distance<<" cases ŕ la ronde"<<endl;
  1406. }
  1407. }
  1408. return listeIntersections->size() > 0;
  1409. }
  1410. bool regles::voisinDroitBlanc(vector<int> * listeInter) { // vire les pierres dont le voisin de droite n'est pas une pierre blanche
  1411. traceTemp+=" && voisinDroitBlanc";
  1412. cout<<"Début voisinDroitBlanc"<<endl;
  1413. int i=0;
  1414. Intersection * inter;
  1415. while (i<(int)listeInter->size()) {
  1416. cout<<"Début du while de voisinDroitBlanc : intersection : ("<<abscisse((*listeInter)[i])<<";"<<ordonnee((*listeInter)[i])<<")"<<endl;
  1417. inter = g->getIntersection(abscisse((*listeInter)[i]), ordonnee((*listeInter)[i]))->getPierreDroite();
  1418. if (inter == NULL)
  1419. cout<<"inter a une valeur nulle";
  1420. else {
  1421. cout<<"inter vaut "<<inter<<endl;
  1422. cout<<"inter : x = "<<inter->getX()<<" , y = "<<inter->getY()<<endl;
  1423. cout<<"couleur de l'inter : "<<inter->couleur()<<endl;
  1424. }
  1425. if (inter!=NULL && inter->couleur() == BLANC) {
  1426. cout<<"L'intersection a pour voisin de droite une pierre blanche et est donc conservée"<<endl;
  1427. i++;
  1428. } else
  1429. listeInter->erase(listeInter->begin()+i);
  1430. }
  1431. cout<<"Fin voisinDroitBlanc"<<endl;
  1432. return listeInter->size()>0;
  1433. }
  1434. bool regles::voisinDroitNoir(vector<int> * listeInter) { // vire les pierres dont le voisin de droite n'est pas une pierre noire
  1435. traceTemp+=" && voisinDroitNoir";
  1436. cout<<"Début voisinDroitNoir"<<endl;
  1437. int i=0;
  1438. Intersection * inter;
  1439. while (i<(int)listeInter->size()) {
  1440. inter = g->getIntersection(abscisse((*listeInter)[i]), ordonnee((*listeInter)[i]))->getPierreDroite();
  1441. if (inter!=NULL && inter->couleur() == NOIR) {
  1442. cout<<"L'intersection a pour voisin de droite une pierre noire et est donc conservée"<<endl;
  1443. i++;
  1444. } else
  1445. listeInter->erase(listeInter->begin()+i);
  1446. }
  1447. cout<<"Fin voisinDroitNoir"<<endl;
  1448. return listeInter->size()>0;
  1449. }
  1450. bool regles::voisinGaucheBlanc(vector<int> * listeInter) { // vire les pierres dont le voisin de gauche n'est pas une pierre blanche
  1451. traceTemp+=" && voisinGaucheBlancs";
  1452. cout<<"Début voisinGaucheBlanc"<<endl;
  1453. if (g->getIntersection(2,14)->getPierreGauche()!=NULL)
  1454. cout<<"Pierre ŕ gauche de (2;14) : ("<<g->getIntersection(2,14)->getPierreGauche()->getX()<<";"<<g->getIntersection(2,14)->getPierreGauche()->getY()<<")"<<endl;
  1455. else
  1456. cout<<"La pierre en (2;14) n'a pas de voisins de gauche"<<endl;
  1457. int i=0;
  1458. Intersection * inter;
  1459. while (i<(int)listeInter->size()) {
  1460. cout<<"Début du while de voisinGaucheBlanc : intersection : ("<<abscisse((*listeInter)[i])<<";"<<ordonnee((*listeInter)[i])<<")"<<endl;
  1461. inter = g->getIntersection(abscisse((*listeInter)[i]), ordonnee((*listeInter)[i]))->getPierreGauche();
  1462. if (inter == NULL)
  1463. cout<<"inter a une valeur nulle"<<endl;
  1464. else {
  1465. cout<<"inter vaut "<<inter<<endl;
  1466. cout<<"inter : abscisse:"<<inter->getX()<<" - ordonnée : "<<inter->getY()<<endl;
  1467. cout<<"couleur de l'inter : "<<inter->couleur()<<endl;
  1468. }
  1469. if (inter!=NULL && inter->couleur() == BLANC) {
  1470. cout<<"L'intersection a pour voisin de gauche une pierre blanche et est donc conservée"<<endl;
  1471. i++;
  1472. } else
  1473. listeInter->erase(listeInter->begin()+i);
  1474. }
  1475. cout<<"Fin voisinGaucheBlanc : taille :"<<listeInter->size()<<endl;
  1476. return listeInter->size()>0;
  1477. }
  1478. bool regles::voisinGaucheNoir(vector<int> * listeInter) { // vire les pierres dont le voisin de gauche n'est pas une pierre noire
  1479. traceTemp+=" && voisinGaucheNoir";
  1480. cout<<"Début voisinGaucheNoir"<<endl;
  1481. int i=0;
  1482. Intersection * inter;
  1483. while (i<(int)listeInter->size()) {
  1484. inter = g->getIntersection(abscisse((*listeInter)[i]), ordonnee((*listeInter)[i]))->getPierreGauche();
  1485. if (inter!=NULL && inter->couleur() == NOIR) {
  1486. cout<<"L'intersection a pour voisin de gauche une pierre noire et est donc conservée"<<endl;
  1487. i++;
  1488. } else
  1489. listeInter->erase(listeInter->begin()+i);
  1490. }
  1491. cout<<"Fin voisinGaucheNoir"<<endl;
  1492. return listeInter->size()>0;
  1493. }
  1494. int regles::nbLibBonus(int x, int y, Groupe * grp) {
  1495. int nbLibertesBonus = 0;
  1496. char couleur = grp->getCouleur();
  1497. if (g->dansPlateau(x,y) && g->getIntersection(x,y)->getGroupe() != grp ) { // si l'intersection est dans le goban et qu'elle n'appartient aps au groupe que l'onregarde.
  1498. cout<<x<<" : "<<y<<" : "<<g->getIntersection(x,y)->couleur()<<endl;
  1499. switch (g->getIntersection(x,y)->couleur()) { // selon la couleur de cette intersection
  1500. case VIDE:
  1501. nbLibertesBonus += 1;
  1502. cout<<" + 1"<<endl;
  1503. break;
  1504. case NOIR:
  1505. if (couleur == NOIR) {
  1506. nbLibertesBonus += g->getIntersection(x,y)->getGroupe()->getNbLib() -1; // -1 car ce coup enlčve une liberté au groupe en question
  1507. cout<<"nbLib="<<nbLibertesBonus<<endl;
  1508. }
  1509. break;
  1510. case BLANC:
  1511. if (couleur == BLANC) {
  1512. nbLibertesBonus += g->getIntersection(x,y)->getGroupe()->getNbLib() -1; // -1 car ce coup enlčve une liberté au groupe en question
  1513. cout<<"nbLib="<<nbLibertesBonus<<endl;
  1514. }
  1515. break;
  1516. }
  1517. }
  1518. return nbLibertesBonus;
  1519. }
  1520. bool regles::intersectionAbs(Groupe * grp, int coord) {
  1521. int i =0;
  1522. while (i < g->getTaille() && ! grp->findIntersection(coord, i)) {
  1523. i++;
  1524. }
  1525. return (i < g->getTaille());
  1526. }
  1527. bool regles::intersectionOrd(Groupe * grp, int coord) {
  1528. int i =0;
  1529. while (i < g->getTaille() && ! grp->findIntersection(i,coord)) {
  1530. i++;
  1531. }
  1532. return (i < g->getTaille());
  1533. }
  1534. /*
  1535. void regles::transformer(){
  1536. }
  1537. */
  1538. bool regles::jouer (void (*fct)(vector<vector<int> >,regles *, int), string nomFct, vector<vector<int> > arguments, int valeur) {
  1539. cout<<"Bienvenue dans la fonction jouer, ici pour executer la magnifique fonction: "<<nomFct<<endl;
  1540. *fichier<<traceTemp<<" -> jouer : "<<nomFct<<" avec le ratio " <<valeur <<" sur ";
  1541. *fTrace<<sTrace<<" => "<<nomFct<<" avec le ratio " <<valeur <<" sur ";
  1542. for (int i=0; i<(int) arguments[0].size(); i++) {
  1543. *fichier<<"( ";
  1544. *fTrace<<"( ";
  1545. for (int j=0; j< (int)arguments.size(); j++) {
  1546. *fichier<<arguments[j][i]<<", ";
  1547. *fTrace<<arguments[j][i]<<", ";
  1548. }
  1549. *fichier<<") ";
  1550. *fTrace<<") ";
  1551. }
  1552. //transformer(arguments);
  1553. *fTrace<<endl;
  1554. *fichier<<endl;
  1555. //cout<<"JOUUUUUUUUEEEERRRRR "<<arguments.size()<<" - "<<arguments[0]->size()<<endl;
  1556. int i;
  1557. ConcluPoids cp;
  1558. //vérification que la conclusion n'a pas déja été obtenue avec la męme valeur
  1559. for (i =0; i <(int) Conclusions.size(); i++) {
  1560. if (( Conclusions[i].nomConclu== nomFct)&&(Conclusions[i].Poids==valeur)) {
  1561. return false; // break;
  1562. }
  1563. }
  1564. //si non, on la rajoute aux conclusions
  1565. if (i == (int)Conclusions.size()) {
  1566. cp.Conclu=fct;
  1567. cp.nomConclu=nomFct;
  1568. cp.Poids=valeur;
  1569. // for (int j = 0; j<arguments.size();j++){
  1570. // for (int k =0; k<arguments[j].size();j++){
  1571. cp.args=arguments;
  1572. }
  1573. Conclusions.push_back(cp);
  1574. //cout<<"CP: "<<cp.args.size()<<" - "<<cp.args[0]->size()<<endl;
  1575. cout<<"PREexecuterConcl!!! arguments2: "<<Conclusions[i].args[0].size()<<endl;
  1576. cout<<"PREexecuterConcl!!! arguments3: "<<Conclusions[i].args[1].size()<<endl;
  1577. //cout<<"JOUUUUUUUUEEEERRRRR2222 "<<arguments.size()<<" - "<<arguments[0]->size()<<endl;
  1578. // fct(arguments);
  1579. cout<<"Déja la fin de la magnifique fonction jouer, quel dommage!"<<endl;
  1580. return true;
  1581. }
  1582. void regles::afficherPoids() {
  1583. cout<<"**Tableau des Poids **"<<endl;
  1584. cout<<" 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18"<<endl;
  1585. for (int i =0; i< (int)Poids.size(); i++) {
  1586. if (i<10) cout<<i<<": ";
  1587. else cout<<i<<":";
  1588. for (int j =0;j<(int)Poi