Wt examples  3.3.5
/usr/src/RPM/BUILD/wt-3.3.5-rc2/examples/hangman/HangmanWidget.C
Go to the documentation of this file.
00001 /*
00002  * Copyright (C) 2011 Emweb bvba, Heverlee, Belgium
00003  *
00004  * See the LICENSE file for terms of use.
00005  */
00006 
00007 #include "HangmanWidget.h"
00008 
00009 #include <Wt/WBreak>
00010 #include <Wt/WComboBox>
00011 #include <Wt/WPushButton>
00012 #include <Wt/WText>
00013 #include <boost/lexical_cast.hpp>
00014 
00015 #include "Session.h"
00016 #include "Dictionary.h"
00017 #include "WordWidget.h"
00018 #include "ImagesWidget.h"
00019 #include "LettersWidget.h"
00020 
00021 using namespace Wt;
00022 
00023 namespace {
00024   const int MaxGuesses = 9;
00025 }
00026 
00027 HangmanWidget::HangmanWidget(const std::string &name, WContainerWidget *parent)
00028   : WContainerWidget(parent),
00029     name_(name),
00030     badGuesses_(0)
00031 {
00032   setContentAlignment(AlignCenter);
00033   
00034   title_ = new WText(tr("hangman.readyToPlay"), this);
00035 
00036   word_ = new WordWidget(this);
00037   statusText_ = new WText(this);
00038   images_ = new ImagesWidget(MaxGuesses, this);
00039 
00040   letters_ = new LettersWidget(this);
00041   letters_->letterPushed().connect(this, &HangmanWidget::registerGuess);
00042 
00043   language_ = new WComboBox(this);
00044   language_->addItem(tr("hangman.englishWords").arg(18957));
00045   language_->addItem(tr("hangman.dutchWords").arg(1688));
00046 
00047   new WBreak(this);
00048 
00049   newGameButton_ = new WPushButton(tr("hangman.newGame"), this);
00050   newGameButton_->clicked().connect(this, &HangmanWidget::newGame);
00051 
00052   letters_->hide();
00053 }
00054 
00055 void HangmanWidget::newGame()
00056 {
00057   WString title(tr("hangman.guessTheWord"));
00058   title_->setText(title.arg(name_));
00059 
00060   language_->hide();
00061   newGameButton_->hide();
00062 
00063   /*
00064    * Choose a new secret word and reset the game
00065    */
00066   Dictionary dictionary = (Dictionary) language_->currentIndex();
00067   word_->init(RandomWord(dictionary));
00068   letters_->reset();
00069   badGuesses_ = 0;
00070   images_->showImage(badGuesses_);
00071   statusText_->setText("");
00072 }
00073 
00074 void HangmanWidget::registerGuess(char c)
00075 {
00076   if (badGuesses_ < MaxGuesses) {
00077     bool correct = word_->guess(c);
00078 
00079     if (!correct) {
00080       ++badGuesses_;
00081       images_->showImage(badGuesses_);
00082     }
00083   }
00084 
00085   if (badGuesses_ == MaxGuesses) {
00086     WString status(tr("hangman.youHang"));
00087     statusText_->setText(status.arg(word_->word()));
00088 
00089     letters_->hide();
00090     language_->show();
00091     newGameButton_->show();
00092 
00093     scoreUpdated_.emit(-10);
00094   } else if (word_->won()) {
00095     statusText_->setText(tr("hangman.youWin"));
00096     images_->showImage(ImagesWidget::HURRAY);
00097 
00098     letters_->hide();
00099     language_->show();
00100     newGameButton_->show();
00101 
00102     scoreUpdated_.emit(20 - badGuesses_);
00103   }
00104 }

Generated on Tue Mar 22 2016 for the C++ Web Toolkit (Wt) by doxygen 1.7.6.1