J'ai quelques soucis : je n'arrive pas à générer de mot aléatoire avec un dico.txt (bien contenu dans les dossiers)
J'ai essayé plusieurs manières de le générer en l’appelant dès le début du programme ou par un bouton, mais rien...
main.cpp
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
FenJeu fenetreDuPendu;
fenetreDuPendu.show();
return app.exec();
}
FenJeu.h
class FenJeu : public QMainWindow
{
Q_OBJECT
public :
FenJeu();
private slots:
void piocherMot();
void verifierLettresMots();
private :
QTextEdit *reglesDeJeu;
QTextEdit *aPropos;
QLineEdit *motATrouver;
QPushButton *genererMot;
QPushButton *a;
...
QPushButton *z;
QPushButton *fermerAide;
QPushButton *fermerAbout;
QString motPiocher;
};
FenJeu.cpp
FenJeu::FenJeu()
{
//Création de QMainWindow et ses menus:
QMenu *menuFichier = menuBar()->addMenu("&Fichier");
QMenu *menuAffichage = menuBar()->addMenu("&Affichage");
QMenu *menuAide = menuBar()->addMenu("&Aide");
QWidget *fenetreDeJeu = new QWidget;
QStatusBar *barreDEtat = statusBar();
barreDEtat->showMessage("Pret", 10000);
QLabel *messageBarreDEtat = new QLabel("Jeu du Pendu");
barreDEtat->addPermanentWidget(messageBarreDEtat);
QAction *actionRecommencer = menuFichier->addAction("&Recommencer");
actionRecommencer->setShortcut(QKeySequence("Ctrl+R"));
actionRecommencer->setIcon(QIcon("arrow_refresh.png"));
actionRecommencer->setStatusTip("Générera un nouveau mot à trouver");
QAction *actionQuitter = menuFichier->addAction("&Quitter");
actionQuitter->setShortcut(QKeySequence("Ctrl+Q"));
actionQuitter->setIcon(QIcon("door_in.png"));
QAction *actionGrandEcran = menuAffichage->addAction("&Grand Ecran");
actionGrandEcran->setShortcut(QKeySequence("F10"));
actionGrandEcran->setIcon(QIcon("magnifier_zoom_in.png"));
actionGrandEcran->setStatusTip("Mettre le jeu en plein écran");
QAction *actionPetitEcran = menuAffichage->addAction(("&Petit Ecran"));
actionPetitEcran->setShortcut(QKeySequence("F9"));
actionPetitEcran->setIcon(QIcon("magifier_zoom_out.png"));
actionPetitEcran->setStatusTip("Mettre en fenetre minimal");
QAction *actionRegles = menuAide->addAction("Regles");
actionRegles->setShortcut(QKeySequence("F2"));
actionRegles->setIcon(QIcon("help.png"));
actionRegles->setStatusTip("Afficher les règles");
QAction *actionAbout = menuAide->addAction("&A propos");
actionAbout->setIcon(QIcon("information.png"));
actionAbout->setShortcut(QKeySequence("Ctrl+A"));
actionAbout->setStatusTip("Info générale du jeu");
QDialog *affichageRegles = new QDialog(this);
fermerAide = new QPushButton("Fermer l'aide");
fermerAide->setIcon(QIcon("controller.png"));
QString regles;
regles += "Vous devez retrouver le mot en moins de 8 coups\n";
regles += "Pour cela cliquer sur les boutons alphabets\n";
regles += "Les mots font entre 1 et 25 caractères\n";
regles += "\nBonne chance !";
reglesDeJeu = new QTextEdit;
reglesDeJeu->setPlainText(regles);
reglesDeJeu->setReadOnly(true);
QVBoxLayout *fenetreDAide = new QVBoxLayout;
fenetreDAide->addWidget(reglesDeJeu);
fenetreDAide->addWidget(fermerAide);
affichageRegles->setLayout(fenetreDAide);
QDialog *affichageAbout = new QDialog(this);
fermerAbout = new QPushButton;
fermerAbout->setIcon(QIcon("controller.png"));
QString about;
about += "Ce jeu du pendu a été réalisé par\n";
about += "\nElProgrammorDelaNoche";
aPropos = new QTextEdit;
aPropos->setPlainText(about);
aPropos->setReadOnly(true);
QVBoxLayout *layoutAbout = new QVBoxLayout;
layoutAbout->addWidget(aPropos);
layoutAbout->addWidget(fermerAbout);
affichageAbout->setLayout(layoutAbout);
connect(fermerAbout, SIGNAL(clicked()), affichageAbout, SLOT(close()));
connect(actionAbout, SIGNAL(triggered()), affichageAbout, SLOT(exec()));
connect(actionPetitEcran, SIGNAL(triggered()), this, SLOT(showNormal()));
connect(fermerAide, SIGNAL(clicked()), affichageRegles, SLOT(close()));
connect(actionQuitter, SIGNAL(triggered()), qApp, SLOT(quit()));
connect(actionGrandEcran, SIGNAL(triggered()), this, SLOT(showMaximized()));
connect(actionRegles, SIGNAL(triggered()), affichageRegles, SLOT(exec()));
connect(actionRecommencer, SIGNAL(triggered()), this, SLOT(piocherMot()));
setWindowTitle("Jeu du Pendu");
setWindowIcon(QIcon("Pendu.png"));
//Création de la zone de jeu:
//Ensemble:
QHBoxLayout *organisationPages = new QHBoxLayout;
QGridLayout *pageGauche = new QGridLayout;
QLabel *pageDroite = new QLabel;
//Page de Gauche:
motATrouver = new QLineEdit;
motATrouver->setAlignment(Qt::AlignHCenter);
a = new QPushButton("a"); b = new QPushButton("b"); c = new QPushButton("c"); d = new QPushButton("d"); e = new QPushButton("e");
f = new QPushButton("f"); g = new QPushButton("g"); h = new QPushButton("h"); i = new QPushButton("i"); j = new QPushButton("j");
k = new QPushButton("k"); l = new QPushButton("l"); m = new QPushButton("m"); n = new QPushButton("n"); o = new QPushButton("o");
p = new QPushButton("p"); q = new QPushButton("q"); r = new QPushButton("r"); s = new QPushButton("s"); t = new QPushButton("t");
u = new QPushButton("u"); v = new QPushButton("v"); w = new QPushButton("w"); x = new QPushButton("x"); y = new QPushButton("y");
z = new QPushButton("z");
pageGauche->addWidget(motATrouver, 0, 0, 3, 6);
pageGauche->addWidget(a); pageGauche->addWidget(b); pageGauche->addWidget(c); pageGauche->addWidget(d); pageGauche->addWidget(e);
pageGauche->addWidget(f); pageGauche->addWidget(g); pageGauche->addWidget(h); pageGauche->addWidget(i); pageGauche->addWidget(j);
pageGauche->addWidget(k); pageGauche->addWidget(l); pageGauche->addWidget(m); pageGauche->addWidget(n); pageGauche->addWidget(o);
pageGauche->addWidget(p); pageGauche->addWidget(q); pageGauche->addWidget(r);
pageGauche->addWidget(s); pageGauche->addWidget(t); pageGauche->addWidget(u); pageGauche->addWidget(v); pageGauche->addWidget(w);
pageGauche->addWidget(x); pageGauche->addWidget(y); pageGauche->addWidget(z);
pageGauche->setAlignment(Qt::AlignCenter);
connect(a, SIGNAL(clicked()), this, SLOT(verifierLettresMots()));
...
connect(z, SIGNAL(clicked()), this, SLOT(verifierLettresMots()));
//Page de Droite:
pageDroite->setPixmap(QPixmap("pendu1.jpg"));
pageDroite->setAlignment(Qt::AlignCenter);
//Fin:
organisationPages->addLayout(pageGauche);
organisationPages->addWidget(pageDroite);
fenetreDeJeu->setLayout(organisationPages);
setCentralWidget(fenetreDeJeu);
}
void FenJeu::piocherMot()
{
QFile file("dico.txt");
if (!file.open(QIODevice::ReadOnly))
return;
QTextStream fichier(&file);
int nbLignes(0);
QString caractere;
caractere.clear();
motPiocher.clear();
while (!fichier.atEnd())
{
fichier >> caractere;
if(caractere == "\n")
nbLignes++;
}
fichier.seek(0);
int ligneAleat = rand() % nbLignes;
int t(0);
while (t != ligneAleat)
{
fichier >> caractere;
if(caractere == "\n")
t++;
}
fichier >> motPiocher;
motATrouver->setText(motPiocher);
motATrouver->setEchoMode(QLineEdit::Password);
motATrouver->setReadOnly(true);
}
void FenJeu::verifierLettresMots()
{
if(a->isChecked())
{
for(int i(0) ; i < motPiocher.size() ; ++i)
{
if(motPiocher[i] == 'a')
motATrouver[i].setEchoMode(QLineEdit::Normal);
}
a->setCheckable(false);
}
...
if(z->isChecked())
{
for(int i(0) ; i < motPiocher.size() ; ++i)
{
if(motPiocher[i] == 'z')
motATrouver[i].setEchoMode(QLineEdit::Normal);
}
z->setCheckable(false);
}
}
Fonction du mot générer:
void FenJeu::piocherMot()
{
QFile file("dico.txt");
if (!file.open(QIODevice::ReadOnly))
return;
QTextStream fichier(&file);
int nbLignes(0);
QString caractere;
caractere.clear();
motPiocher.clear();
while (!fichier.atEnd())
{
fichier >> caractere;
if(caractere == "\n")
nbLignes++;
}
fichier.seek(0);
int ligneAleat = rand() % nbLignes;
int t(0);
while (t != ligneAleat)
{
fichier >> caractere;
if(caractere == "\n")
t++;
}
fichier >> motPiocher;
motATrouver->setText(motPiocher);
motATrouver->setEchoMode(QLineEdit::Password);
motATrouver->setReadOnly(true);
}
Après avoir gratter pas mal de temps et en faisant autre chose en plus, j'arrive à compiler mais...
J'ai l'impression que le texte n'est pas mis dans la QLineEdit puisque celle ci n'affiche rien...
Donc j'aurais besoin de votre aide pour :
- afficher ce fameux motPiocher(surtout le piocher d'ailleurs)
- trouver une méthode qui modifierai l'image si aucune lettre n'a été trouvé dans le mot
Plop. J'ai installé Qt spécialement pour toi.
void MainWindow::piocherMot()
{
srand(time(NULL));
QFile fichier("C:\\Users\\choco\\Documents\\PocPendu\\dico.txt");
if (!fichier.open(QIODevice::ReadOnly))
{
ui->lineEdit->setText("error");
return;
}
// Random number
int nbLigne = 0;
while (!fichier.atEnd())
{
fichier.readLine();
++nbLigne;
}
int hasard = rand() % nbLigne;
fichier.seek(0);
QString line;
for (int i = 0; i < hasard ; i++)
line = fichier.readLine();
fichier.close();
ui->lineEdit->setText(line);
}Cette fonction est ok chez moi. Pas super optimisée mais elle fait le boulot. ![]()
J'ai pas réfléchi pour la 2 dsl.
Super merci !!!!!!
Par contre je n'ai toujours pas trouvé la solution pour le deuxième cas mais j'essaye d'y arriver ![]()
Disons que c'est un peu relou de se plonger dans le code sans au minima :
- une indentation des lignes (c'est pénible, y'a des balises code sur jvc)
- un rendu de l'interface graphique, pour se représenter plus facilement ton jeu. J'avais pas pigé que tes a b c d étaient des boutons, instinctivement
Tu veux donc agir sur cette propriété si j'ai bien compris:pageDroite->setPixmap(QPixmap("pendu1.jpg"));
Le problème, c'est que ta méthode verifierLettresMots() est catastrophique. Tu répètes tout ça 26 fois ? ![]()
Faut la revoir intégralement. Je m'y pencherai ce soir ou demain, sous réserve que quelqu'un le fasse avant moi.
Enfin non, j'me sens pas de tout refaire.
Ce serait quelque chose dans ce principe (cette fonction marche, normalement)
void FenJeu::verifierLettresMots()
{
bool wordContains = false;
if(a->isChecked())
{
for(int i(0) ; i < motPiocher.size() ; ++i)
{
if(motPiocher[i] == 'a')
{
wordContains = true;
motATrouver[i].setEchoMode(QLineEdit::Normal);
}
}
a->setCheckable(false);
}
...
if(z->isChecked())
{
for(int i(0) ; i < motPiocher.size() ; ++i)
{
if(motPiocher[i] == 'z')
{
wordContains = true;
motATrouver[i].setEchoMode(QLineEdit::Normal);
}
}
z->setCheckable(false);
}
if (wordContains == true)
pageDroite->setPixmap(QPixmap("pendu1.jpg"));
else
pageDroite->setPixmap(QPixmap("pendu2.jpg"));
}
J'ai essayé de me pencher dessus mais j'avoue que j'ai un peu de mal aussi ^^ je te préviens si par hasard je trouve une solution ![]()