Пример #1
0
Case AlgoRegle::deroulerAlgo (Case caseClic)
{
	// On récupère la case cliquée
	caseCliquee = caseClic;

	// On récupère le tableau de cases
	Plateau* plateau = ((CJeuDeDamesApp *)AfxGetApp( ))->getPlateau();
	int nbCases = ((CJeuDeDamesApp *)AfxGetApp( ))->getTaillePlateau();

	for(int i = 0; i < nbCases; i++) {
		for(int j = 0; j < nbCases; j++)
		{
			tableauDeCases[i][j] = plateau->getCaseDuTableau(i,j);
		} 
	}

	// On récupère le joueur en cours
	int joueurEnCours = ((CJeuDeDamesApp *)AfxGetApp( ))->getJoueurEnCours();

	// On applique l'algo spécifique au joueur
	if (joueurEnCours == 1) AlgoADeroulerJoueurBlanc(nbCases);
	if (joueurEnCours == 2) AlgoADeroulerJoueurRouge(nbCases);

	// On met à jour le plateau
	for(int i = 0; i < nbCases; i++) {
		for(int j = 0; j < nbCases; j++)
		{
			plateau->setCaseDuTableau(i, j, tableauDeCases[i][j].getEtat());
		}
	}

	return caseMemo;
}
Пример #2
0
void testMortJoueur()
{
    Partie partie("Partie 1", 2, 2);
    Joueur *j1 = NULL, *j2 = NULL;
    Plateau *pl = NULL;
    Action *action = new Action();
    Sort *sort = NULL;
    vector<string> listeSort;
    listeSort.push_back("Boule de Feu");
    listeSort.push_back("Sceau de Controle");
    partie.initialiser();
    j1 =  partie.ajouterJoueur("Tarte", "pika", listeSort);
    j2 =  partie.ajouterJoueur("Platon", "Sala", listeSort);
    partie.demarrerPartie();
    pl = partie.getPlateau();
    sort = UsineSort::fabriqueSort("Boule de Feu");
    sort->setProprietaire(j2);
    action->setOrigine(NULL);
    action->setSort(sort);
    action->ajouterCible(pl->getCase(0,0));
    j2->diminuerMana(j2->getManaActuel());
    assert(j2->getManaActuel() == 0);
    partie.effectuerAction(action, j2);
    assert(j2->estMort() == true);
    assert(j2->getManaMaximum() == 0);
    assert(pl->getCase(0,0)->getDefenseActuelle() == pl->getCase(0,0)->getDefenseInitiale());
    delete action;
    delete sort;
}
Пример #3
0
void Puissance4::newPartie (){
  Plateau *p = Partie::getPartie()->getPlateau();
  Joueur *j = Partie::getPartie()->getJoueurs();
  int choix_pos = 0;
    int i=0;
  j->next();
  do{
    j->next();
    cout << "Joueur "<< j->getCourrant()<< endl;
    affichage();
    do{
      i = 0;
      cout << "choisissez une position : " << endl;
      cin >> choix_pos;
      for(;i < nbLignes && not p->hasPion(i, choix_pos); i++){}
    }while(choix_pos < 0 || 
	   choix_pos > nbLignes || 
	   (i == 0 && p->hasPion(choix_pos, i)));
    i = (i==0)? 0 : i-1;
    if(j->getCourrant() == 0){
      p->mettrePionDansCase(pO, i, choix_pos);
    } else {
      p->mettrePionDansCase(pX, i, choix_pos);
    }
  }while(not hasP4(i, choix_pos));
  affichage();
  cout << "Le joueur " << j->getCourrant() << "a gagné "<<  endl; 
  
}
Пример #4
0
int testParachutage(Pion& pion, int x_fin, int y_fin, int joueur_actif, Plateau plateau)
{
	if(joueur_actif==1)
	{
		if(y_fin==0)//pas de parachutage en derniere ligne
			return -1;
		if((pion.getNom()==Cavalier)&&(y_fin<=1))//pas de cavalier sur les deux dernières lignes
			return -1;
	}	
	if(joueur_actif==2) //idem pour joueur 2
	{
		if(y_fin==8)
			return -1;
		if((pion.getNom()==Cavalier)&&(y_fin>=7))
			return -1;
	}
	
	if(pion.getNom()==Soldat) //vérification qu'il n'y a pas deux soldats non promus dans la même colonne
	{
		for(int i = 0; i<9;i++)
		{
			if((plateau.getPion(x_fin,i).getNom()==Soldat)&&(plateau.getPion(x_fin,i).getProprietaire()==joueur_actif))
				return -1;
		}
	}
	else return 0;
	
}
Пример #5
0
int main()
{
	Plateau p;
	char choix;
	bool nouveau_jeu = false;

	while (nouveau_jeu == false)
	{
		p.plateau_centraliser();
		cout << "voulez vous continuer à jouer (O/N)" << endl;
		cin >> choix;
		if (choix == 'O' || choix == 'o')
		{
			
			nouveau_jeu = false;
		}
		else if (choix == 'N' || choix == 'n' )
		{
			cout << "le jeux va s'arrêté" << endl;
			nouveau_jeu = true;
		}
	}

	system("PAUSE");
	return 0;
}
Пример #6
0
void AngePuissant::modifierCase(int &ligne, int &colonne, Plateau &p) {

    p.gameboard()[_ligne][_colonne].setCase(false, true);

    p.gameboard()[ligne][colonne].setCase(false, false);
 
    _ligne = ligne, _colonne = colonne;  //Je sauvegarde mes coordonées afin de faire les test plsu tard dans incorrect.
}
Пример #7
0
void Ange::modifierCase(int &ligne, int &colonne, Plateau &plateau) {

    plateau.gameboard()[_ligne][_colonne].setCase(false, true);

    plateau.gameboard()[ligne][colonne].setCase(false, false);
    
    _ligne = ligne, _colonne = colonne;
}
Пример #8
0
// la methode qui va tester si l'ange est arrivé aux coins des cases
bool Ange::gagne(Plateau &plateau) {

    if (_ligne == 0 || _ligne == plateau.dim() - 1 || _colonne == 0 || _colonne == plateau.dim() - 1) {
        plateau.affiche();
        cout << "Bravo !! vous avez gagné \n" << endl;
        return true;
    }
    return false;
}
Пример #9
0
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Plateau w;
    w.setWindowIcon(QIcon(":/img/img/icone.ico"));
    w.setWindowTitle("Bonne nuit !");
    w.show();

    return a.exec();
}
Пример #10
0
int main()
{
	cout << "\n Coucou ! \t" << endl;
    Plateau plateau = Plateau();
    plateau.afficher();

    cout << endl;
    plateau(4,4).afficher();
    plateau(4,4).modifPion(-1);
    plateau(4,4).afficher();
    plateau.afficher();
    cout << endl;
}
Пример #11
0
void Renderer::render(surface& surf, Plateau& plateau) {

	surf.fill(color::black());
	back.blit(surf,100,0);

	int blanc=0;
	int noir=0;
	for(size_t i=0;i<plateau.pions.size();i++) {
		for(size_t j=0;j<plateau.pions[i].size();j++) {
			if(plateau.pions[i][j]==Pion::black()) {
				black.blit(surf,100+((int)i*60),(int)j*60);
				noir++;
			} else if(plateau.pions[i][j]==Pion::white()) {
				white.blit(surf,100+((int)i*60),(int)j*60);
				blanc++;
			}
		}
	}
	if(plateau.gameFinished()) {
		string aff = "Joueur: "
				+lexical_cast<string>(blanc)+" Ordinateur: "
				+lexical_cast<string>(noir);
		surface text = thefont.render_shaded(aff,color::cyan(),color::grey());
			text.blit(surf,(surf.get_width()/2)-(text.get_width()/2)
				,(surf.get_height()/2)-(text.get_height()/2));
	}

	surf.flip();
}
Пример #12
0
int main()
{
	srand(time(NULL));
	initscr();
	noecho();
	curs_set(FALSE);

	keypad(stdscr, TRUE);
	nodelay(stdscr, TRUE);
	intrflush(stdscr, TRUE);
	Plateau p;

	p.init_plateau();
	p.game();

	endwin();

	return 0;
}
Пример #13
0
void Puissance4::affichage(){
  Plateau *p = Partie::getPartie()->getPlateau();
  for(int i = 0; i < nbLignes; i++){
    for(int j = 0; j< nbColonnes ; j++){
      if(p->hasPion(i, j)){
	switch(p->getCase(i, j)->getPion()->getJoueur()){
	  case 0: cout << "O "; break;
	  case 1: cout << "X "; break;
	}	
      }else {
	cout << ". ";
      }
    }
    cout << endl;
  }
  for(int j = 0; j< nbLignes; j++){
    cout << j << " " ;
  }
  cout << endl;
}
Пример #14
0
bool AngePuissant::incorrect(int &ligne, int &colonne, Plateau &plateau) {

    if (ligne < 0 || ligne > plateau.dim() - 1 || colonne < 0 || colonne > plateau.dim() - 1) {
        cout << "Cette case n'existe pas " << endl;
        return false;

    }else if(!plateau.gameboard()[ligne][colonne].broken() && !plateau.gameboard()[ligne][colonne].free()) {
        cout << "Vous êtes deja dessus !!\n" << endl;
        return false;

    } else if (plateau.gameboard()[ligne][colonne].broken() && !plateau.gameboard()[ligne][colonne].free()) {
        cout << "Case deja detruite !!\n" << endl;
        return false;
        
    }else{
        
        if (_colonne - _puissance <= colonne && colonne <= _colonne + _puissance && _ligne - _puissance <= ligne && ligne <= _ligne + _puissance) {
            return true;

        }else{
            cout << "Vous pouvez bouger que de " << _puissance << " cases" << endl;
            return false;
        }
    }
}
Пример #15
0
bool Demon::incorrect(int &ligne, int &colonne, Plateau &plateau) {

    if (ligne < 0 || colonne < 0 || ligne > plateau.dim() - 1 || colonne > plateau.dim() - 1) {
        cout << "Entrez une case valide !!\n" << endl;
        return false;

    }else if (!plateau.gameboard()[ligne][colonne].free() && plateau.gameboard()[ligne][colonne].broken()) {
        cout << "La case est déja detruite !!\n" << endl;
        return false;

    }else if (!plateau.gameboard()[ligne][colonne].broken() && !plateau.gameboard()[ligne][colonne].free()) {
        cout << "Case occupée par l'ange !!\n" << endl;
        return false;

    }else{
        return true;
    }

}
Пример #16
0
int main(void) {
	//! Déclaration des variables utiles au main
	Plateau plateau; //! Creation d'un plateau
	list<Deplacement> regulier, nulls; //! Liste temporaires de déplacements
	int tour = BLANC; //! Le premier tour sera effectué par les blancs : 0x00
	Deplacement deplacement; //! Stoque le déplacement en cours
	bool deplacementBool;

	//! Initialisation des deux joueurs IA
	IAJoueur noir(NOIR, 3);
	IAJoueur blanc(BLANC, 1);

	//! Iniialisation du plateau par defaut en le remplissant
	plateau.initialisationPlateau();

	printf("###################################################\n");
	printf("Jeux d'echec, computer vs. computeur. - m1_76\n"
			"Basé sur un algorithme d'elagage alpha-beta.\n"
			"(optimisation de l'algorithme MinMax)\n"
			"Profondeur de recherche (modifiable en dur) :\n"
			"--- NOIR : 4\n"
			"--- BLANC : 1\n"
			"ATTENTION : Etre patient, certains déplacements peuvent etre longs !\n");
	printf("###################################################\n");
	printf("##### Appuyez sur une touche pour commencer ! #####\n");
	getchar();
	for(;;) {

		//! Affichage du plateau
		plateau.affichage();

		//! Tour par tour
		if(tour)
			deplacementBool = noir.getDeplacement(plateau, deplacement);
		else
			deplacementBool = blanc.getDeplacement(plateau, deplacement);

		if(!deplacementBool) //! Si aucun déplacement n'est possible:deplacementBool=0
			break;

		//! Si un déplacement est trouvé alors on le get
		regulier.clear();
		nulls.clear();
		plateau.getDeplacements(tour, regulier, regulier, nulls);

		//Execution des mouvements nulls di de maintenance
		for(list<Deplacement>::iterator i=nulls.begin(); i!=nulls.end(); ++i){ //! On parcours la liste de déplacement nulls
			plateau.deplacement(*i);
		}

		//! On vient executer le déplacement sur le plateau
		plateau.deplacement(deplacement);

		//! On affiche le déplacement au dessu du plateau
		deplacement.affichage();

		//! On vient passer le tour à l'adverssair : 0x10 ^ tour
		tour = CHANGE_COULEUR(tour);
	}

	//! Get le Status du tour pour voir si il y a echec ou pat
	JoueurEchec::Status status = plateau.getJoueurStatus(tour);

	switch(status) //! En fonction du status du joueur en cour
	{
		case JoueurEchec::EchecMat:
			printf("EchecMat -- Les Noirs ont gagné\n");
			break;
		case JoueurEchec::Pat:
			printf("Pat -- Aucun vainqueur\n");
			break;
	}
}
Пример #17
0
Plateau::Plateau(const Plateau &obj) {

    _dim = obj._dim;
    _gameboard = obj.gameboard();
}
Пример #18
0
void Demon::modifierCase(int &ligne, int &colonne, Plateau &plateau) {
    plateau.gameboard()[ligne][colonne].setCase(true, false);
}
Пример #19
0
bool Plateau::puisJeEtreDeposerSurCePlateau(Plateau p_unPlateau)
{
    return (m_taille < p_unPlateau.getTaille());
}
Пример #20
0
void AlgoEtude::appliquerAlgoEtude (Case caseCliquee)
{
	// On récupère le plateau, sa taille et le joueur en cours
	Plateau* plateau = ((CJeuDeDamesApp *)AfxGetApp( ))->getPlateau();
	int nbCases = ((CJeuDeDamesApp *)AfxGetApp( ))->getTaillePlateau();
	int joueurEnCours = ((CJeuDeDamesApp *)AfxGetApp( ))->getJoueurEnCours();
	AlgoRegle* algoRegle = ((CJeuDeDamesApp *)AfxGetApp( ))->getAlgoRegle();
	int nbPionsBlanc = ((CJeuDeDamesApp *)AfxGetApp( ))->getNbPionsBlanc();
	int nbPionsRouge = ((CJeuDeDamesApp *)AfxGetApp( ))->getNbPionsRouge();

	// CAS DU JOUEUR 1
	if (joueurEnCours == 1 )
	{
		// Il clique sur une case occupée par un de ses pions
		if(caseCliquee.getEtat() == NOIR_OC_BLANC)
		{
			// On désélectionne toutes les cases
			for(int i = 0; i < nbCases; i++) {
				for(int j = 0; j < nbCases; j++)
				{
					if (plateau->getCaseDuTableau(i, j).getEtat() == NOIR_SEL) plateau->setCaseDuTableau(i, j, NOIR);
				} 
			}

			caseMemo = algoRegle->deroulerAlgo(caseCliquee);	
		}

		// Il clique sur une case candidate au déplacement
		if(caseCliquee.getEtat() == NOIR_SEL)
		{
			int iMemo = caseMemo.getLigne();
			int jMemo = caseMemo.getColonne();

			int iClic = caseCliquee.getLigne();
			int jClic = caseCliquee.getColonne();

			// On déplace le pion
			plateau->setCaseDuTableau(iMemo, jMemo, NOIR);
			plateau->setCaseDuTableau(iClic, jClic, NOIR_OC_BLANC);

			// CAS où on saute un pion
			if ((iMemo - iClic) == 2)
			{
				testCaseOc(caseCliquee, algoRegle, plateau);
				nbPionsRouge -= 1;
				((CJeuDeDamesApp *)AfxGetApp( ))->setNbPionsRouge(nbPionsRouge);
			}
			
			// On désélectionne toutes les cases
			for(int i = 0; i < nbCases; i++) {
				for(int j = 0; j < nbCases; j++)
				{
					if (plateau->getCaseDuTableau(i, j).getEtat() == NOIR_SEL) plateau->setCaseDuTableau(i, j, NOIR);
				} 
			}

			// On change de joueur
			((CJeuDeDamesApp *)AfxGetApp( ))->setJoueurEnCours(2);
		}

	}

	// CAS DU JOUEUR 2
	if (joueurEnCours == 2 )
	{
		// Il clique sur une case occupée par un de ses pions
		if(caseCliquee.getEtat() == NOIR_OC_ROUGE)
		{
			// On désélectionne toutes les cases
			for(int i = 0; i < nbCases; i++) {
				for(int j = 0; j < nbCases; j++)
				{
					if (plateau->getCaseDuTableau(i, j).getEtat() == NOIR_SEL) plateau->setCaseDuTableau(i, j, NOIR);
				} 
			}

			caseMemo = algoRegle->deroulerAlgo(caseCliquee);
		}

		// Il clique sur une case candidate au déplacement
		if(caseCliquee.getEtat() == NOIR_SEL)
		{
			int iMemo = caseMemo.getLigne();
			int jMemo = caseMemo.getColonne();

			int iClic = caseCliquee.getLigne();
			int jClic = caseCliquee.getColonne();

			// On déplace le pion
			plateau->setCaseDuTableau(iMemo, jMemo, NOIR);
			plateau->setCaseDuTableau(iClic, jClic, NOIR_OC_ROUGE);

			// CAS où on saute un pion
			if ((iClic - iMemo) == 2)
			{
				testCaseOc(caseCliquee, algoRegle, plateau);
				nbPionsBlanc -= 1;
				((CJeuDeDamesApp *)AfxGetApp( ))->setNbPionsBlanc(nbPionsBlanc);
			}

			// On désélectionne toutes les cases
			for(int i = 0; i < nbCases; i++) {
				for(int j = 0; j < nbCases; j++)
				{
					if (plateau->getCaseDuTableau(i, j).getEtat() == NOIR_SEL) plateau->setCaseDuTableau(i, j, NOIR);
				} 
			}

			// On change de joueur
			((CJeuDeDamesApp *)AfxGetApp( ))->setJoueurEnCours(1);
		}

	}

}
Пример #21
0
// methode qui teste si le demon entoure l'ange de case detruite
bool Demon::gagne(Plateau &plateau) {

    for (int i = 0; i < plateau.dim(); i++) {

        for (int j = 0; j < plateau.dim(); j++) {

            if ((!plateau.gameboard()[i][j].broken() && !plateau.gameboard()[i][j].free()) && // Position ange
                (plateau.gameboard()[i + 1][j].broken() && !plateau.gameboard()[i + 1][j].free()) && // bas
                (plateau.gameboard()[i - 1][j].broken() && !plateau.gameboard()[i - 1][j].free()) && // haut
                (plateau.gameboard()[i][j - 1].broken() && !plateau.gameboard()[i][j - 1].free()) && // gauche
                (plateau.gameboard()[i][j + 1].broken() && !plateau.gameboard()[i][j + 1].free()) && // droite
                (plateau.gameboard()[i - 1][j + 1].broken() && !plateau.gameboard()[i - 1][j + 1].free()) && // droite haut
                (plateau.gameboard()[i - 1][j - 1].broken() && !plateau.gameboard()[i - 1][j - 1].free()) && // gauche haut
                (plateau.gameboard()[i + 1][j + 1].broken() && !plateau.gameboard()[i + 1][j + 1].free()) && // droite bas
                (plateau.gameboard()[i + 1][j - 1].broken() && !plateau.gameboard()[i + 1][j - 1].free())) { // gauche bas
                
                plateau.affiche();
                
                cout << "Bravo !! " <<  _pseudo << " vous avez gagné \n" << endl;
                return true;
            }
            
        }
    }
    
    return false;
}