voici le code complet minimal qui reproduit l'erreur
#include <vector>
#include <SFML/Graphics.hpp>
using namespace std;
class Morpion
{
typedef enum {VIDE, CROIX, ROND} Contenu;
vector<vector<Morpion::Contenu>> grille;
sf::Texture* tGrille;
sf::Sprite* sGrille;
sf::Texture* tCroix;
sf::Sprite* sCroix;
sf::Texture* tRond;
sf::Sprite* sRond;
sf::RenderWindow* fenetre;
int compteur;
bool partieTerminee;
bool aGagne;
public :
Morpion();
~Morpion();
void Jouer();
bool ModifierGrille(Morpion::Contenu contenu, int i, int j);
bool PartieTerminee();
void Init();
bool IA();
std::pair<int,int> EvaluerColonnes(Morpion::Contenu c);
std::pair<int,int> EvaluerLignes(Morpion::Contenu c);
std::pair<int,int> EvaluerDiagonales(Morpion::Contenu c);
int GetCompteur() {return compteur;}
bool AGagne() {return aGagne;}
sf::RenderWindow* GetFenetre() {return fenetre;}
};
Morpion::Morpion() :
grille(3, vector<Morpion::Contenu>(3)),
tGrille(new sf::Texture()),
sGrille(new sf::Sprite()),
tCroix(new sf::Texture()),
sCroix(new sf::Sprite()),
tRond(new sf::Texture()),
sRond(new sf::Sprite()),
fenetre(new sf::RenderWindow(sf::VideoMode(300,300,32), "Test", sf::Style::None)),
compteur(9),
partieTerminee(false),
aGagne(false)
{
grille = {{VIDE, VIDE, VIDE},{VIDE, VIDE, VIDE},{VIDE, VIDE, VIDE}};
tGrille->loadFromFile("grille.png");
sGrille->setTexture(*tGrille);
tCroix->loadFromFile("croix.png");
sCroix->setTexture(*tCroix);
tRond->loadFromFile("rond.png");
sRond->setTexture(*tRond);
fenetre->setFramerateLimit(60);
srand(time(NULL)); // initialisation de rand
}
Morpion::~Morpion()
{
delete tGrille;
delete tCroix;
delete tRond;
delete sGrille;
delete sCroix;
delete sRond;
delete fenetre;
}
void Morpion::Jouer()
{
while (fenetre->isOpen() && compteur!= 0 && !partieTerminee)
{
sf::Event event;
while (fenetre->pollEvent(event))
{
if (event.type == sf::Event::KeyPressed && event.key.code == sf::Keyboard::Q)
fenetre->close();
//C'est la ligne qui vient qui fait planter quand on clique en dehors de la fenetre
if (sf::Mouse::isButtonPressed(sf::Mouse::Left))
ModifierGrille(Contenu::CROIX, sf::Mouse::getPosition(*fenetre).x/100, sf::Mouse::getPosition(*fenetre).y/100);
}
fenetre->clear();
fenetre->display();
}
}
bool Morpion::ModifierGrille(Morpion::Contenu contenu, int i, int j)
{
if (grille[i].at(j) == Contenu::VIDE)
{
grille[i].at(j) = contenu;
return true;
}
else return false;
}
int main()
{
Morpion m;
m.Jouer();
return 0;
}
je pensais que renseigner la fenetre dans getPosition permettait de ne pas tenir compte des clics en dehors du programme...mais aparremment ça fonctionne pas comme ça ^^
Donc quand je clique en dehors getPosition(*fenetre) plante pas vraiment mais renvoit des coordonnées négatives je supposes, ce qui créé un segfault à l'affectation de la grille...