Wt examples  4.10.4
HangmanWidget.C
Go to the documentation of this file.
1 /*
2  * Copyright (C) 2011 Emweb bv, Herent, Belgium
3  *
4  * See the LICENSE file for terms of use.
5  */
6 
7 #include "HangmanWidget.h"
8 
9 #include <Wt/WBreak.h>
10 #include <Wt/WComboBox.h>
11 #include <Wt/WPushButton.h>
12 #include <Wt/WText.h>
13 #include <Wt/WAny.h>
14 
15 #include "Session.h"
16 #include "Dictionary.h"
17 #include "WordWidget.h"
18 #include "ImagesWidget.h"
19 #include "LettersWidget.h"
20 
21 using namespace Wt;
22 
23 namespace {
24  const int MaxGuesses = 9;
25 }
26 
27 HangmanWidget::HangmanWidget(const std::string &name)
28  : name_(name)
29 {
30  setContentAlignment(AlignmentFlag::Center);
31 
32  title_ = addNew<WText>(tr("hangman.readyToPlay"));
33 
34  word_ = addNew<WordWidget>();
35  statusText_ = addNew<WText>();
36  images_ = addNew<ImagesWidget>(MaxGuesses);
37 
38  letters_ = addNew<LettersWidget>();
40 
41  language_ = addNew<WComboBox>();
42  language_->addItem(tr("hangman.englishWords").arg(18957));
43  language_->addItem(tr("hangman.dutchWords").arg(1688));
44 
45  addNew<WBreak>();
46 
47  newGameButton_ = addNew<WPushButton>(tr("hangman.newGame"));
49 
50  letters_->hide();
51 }
52 
54 {
55  WString title(tr("hangman.guessTheWord"));
56  title_->setText(title.arg(name_));
57 
58  language_->hide();
60 
61  /*
62  * Choose a new secret word and reset the game
63  */
64  auto dictionary = static_cast<Dictionary>(language_->currentIndex());
65  word_->init(randomWord(dictionary));
66  letters_->reset();
67  badGuesses_ = 0;
69  statusText_->setText("");
70 }
71 
73 {
74  if (badGuesses_ < MaxGuesses) {
75  bool correct = word_->guess(c);
76 
77  if (!correct) {
78  ++badGuesses_;
80  }
81  }
82 
83  if (badGuesses_ == MaxGuesses) {
84  WString status = tr("hangman.youHang");
85  statusText_->setText(status.arg(word_->word()));
86 
87  letters_->hide();
88  language_->show();
90 
91  scoreUpdated_.emit(-10);
92  } else if (word_->won()) {
93  statusText_->setText(tr("hangman.youWin"));
95 
96  letters_->hide();
97  language_->show();
99 
100  scoreUpdated_.emit(20 - badGuesses_);
101  }
102 }
std::string randomWord(Dictionary dictionary)
Definition: Dictionary.C:14
Dictionary
Definition: Dictionary.h:13
std::string name_
Definition: HangmanWidget.h:39
void registerGuess(char c)
Definition: HangmanWidget.C:72
LettersWidget * letters_
Definition: HangmanWidget.h:31
Wt::WText * statusText_
Definition: HangmanWidget.h:33
Wt::WComboBox * language_
Definition: HangmanWidget.h:34
ImagesWidget * images_
Definition: HangmanWidget.h:30
Wt::WText * title_
Definition: HangmanWidget.h:27
HangmanWidget(const std::string &name)
Definition: HangmanWidget.C:27
Wt::Signal< int > scoreUpdated_
Definition: HangmanWidget.h:37
WordWidget * word_
Definition: HangmanWidget.h:29
Wt::WPushButton * newGameButton_
Definition: HangmanWidget.h:35
void showImage(int index)
Definition: ImagesWidget.C:36
static const int HURRAY
Definition: ImagesWidget.h:18
Wt::Signal< char > & letterPushed()
Definition: LettersWidget.h:27
void init(const std::string &word)
Definition: WordWidget.C:16
bool guess(char c)
Definition: WordWidget.C:29
std::string word() const
Definition: WordWidget.h:18
bool won()
Definition: WordWidget.C:44
Wt::Signals::connection connect(F function)
virtual Wt::Signals::connection connect(WObject *target, WObject::Method method) override
int currentIndex() const
void addItem(const WString &text)
void setContentAlignment(WFlags< AlignmentFlag > contentAlignment)
EventSignal< WMouseEvent > & clicked()
WString & arg(const std::wstring &value)
bool setText(const WString &text)
static WString tr(const char *key)