Tyler Weaver
/
qp_hangman
Hangman game using qp a 16x2 LCD and joystick.
host.cpp@1:4efaebc256d3, 2012-02-09 (annotated)
- Committer:
- tylerjw
- Date:
- Thu Feb 09 03:57:44 2012 +0000
- Revision:
- 1:4efaebc256d3
- Parent:
- 0:1521c946a57b
Problems with qp library...
TODO: BSP for button and joystick then main.cpp
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
tylerjw | 0:1521c946a57b | 1 | #include "qp_port.h" |
tylerjw | 0:1521c946a57b | 2 | #include "hangman.h" |
tylerjw | 0:1521c946a57b | 3 | #include "bsp.h" |
tylerjw | 0:1521c946a57b | 4 | |
tylerjw | 1:4efaebc256d3 | 5 | Q_DEFINE_THIS_FILE |
tylerjw | 1:4efaebc256d3 | 6 | |
tylerjw | 0:1521c946a57b | 7 | class Host : public QActive { |
tylerjw | 0:1521c946a57b | 8 | private: |
tylerjw | 0:1521c946a57b | 9 | char* word; |
tylerjw | 0:1521c946a57b | 10 | uint8_t selected_word; |
tylerjw | 0:1521c946a57b | 11 | uint8_t num_letters; |
tylerjw | 0:1521c946a57b | 12 | uint8_t incorrect_letters; |
tylerjw | 0:1521c946a57b | 13 | char* used_letters; |
tylerjw | 0:1521c946a57b | 14 | |
tylerjw | 0:1521c946a57b | 15 | char letter; |
tylerjw | 0:1521c946a57b | 16 | char output1[17]; // buffer for display |
tylerjw | 0:1521c946a57b | 17 | char output2[17]; |
tylerjw | 0:1521c946a57b | 18 | |
tylerjw | 0:1521c946a57b | 19 | public: |
tylerjw | 0:1521c946a57b | 20 | Host(); |
tylerjw | 0:1521c946a57b | 21 | |
tylerjw | 0:1521c946a57b | 22 | private: |
tylerjw | 0:1521c946a57b | 23 | static QState initial(Host *me, QEvent const *e); |
tylerjw | 0:1521c946a57b | 24 | static QState welcome(Host *me, QEvent const *e); |
tylerjw | 0:1521c946a57b | 25 | static QState playing(Host *me, QEvent const *e); |
tylerjw | 0:1521c946a57b | 26 | }; |
tylerjw | 0:1521c946a57b | 27 | |
tylerjw | 0:1521c946a57b | 28 | #define BANK_SIZE 4 |
tylerjw | 0:1521c946a57b | 29 | char* const word_bank[] = { "hangmann", "global", "micro", "sensor" }; |
tylerjw | 0:1521c946a57b | 30 | char* const win_msg = " You Win!"; |
tylerjw | 0:1521c946a57b | 31 | char* const loose_msg = " You suck!"; |
tylerjw | 0:1521c946a57b | 32 | char* const press_play_msg = "Push to continue"; |
tylerjw | 0:1521c946a57b | 33 | |
tylerjw | 0:1521c946a57b | 34 | |
tylerjw | 0:1521c946a57b | 35 | // Local objects ------------------------------------------------------------- |
tylerjw | 0:1521c946a57b | 36 | static Host l_host; // local Host object |
tylerjw | 0:1521c946a57b | 37 | |
tylerjw | 0:1521c946a57b | 38 | // Public-scope objects ------------------------------------------------------ |
tylerjw | 0:1521c946a57b | 39 | QActive * const AO_Host = &l_host; // "opaque" AO pointer |
tylerjw | 0:1521c946a57b | 40 | |
tylerjw | 0:1521c946a57b | 41 | //............................................................................ |
tylerjw | 0:1521c946a57b | 42 | Host::Host() : QActive((QStateHandler)&Host::initial) { |
tylerjw | 0:1521c946a57b | 43 | } |
tylerjw | 0:1521c946a57b | 44 | |
tylerjw | 0:1521c946a57b | 45 | //............................................................................ |
tylerjw | 0:1521c946a57b | 46 | QState Host::initial(Host *me, QEvent const *e) { |
tylerjw | 0:1521c946a57b | 47 | |
tylerjw | 0:1521c946a57b | 48 | QS_OBJ_DICTIONARY(&l_host); |
tylerjw | 0:1521c946a57b | 49 | QS_FUN_DICTIONARY(&QHsm::top); |
tylerjw | 0:1521c946a57b | 50 | QS_FUN_DICTIONARY(&Host::initial); |
tylerjw | 0:1521c946a57b | 51 | QS_FUN_DICTIONARY(&Host::playing); |
tylerjw | 0:1521c946a57b | 52 | |
tylerjw | 0:1521c946a57b | 53 | QS_SIG_DICTIONARY(TERMINATE_SIG, 0); // global signal |
tylerjw | 0:1521c946a57b | 54 | |
tylerjw | 0:1521c946a57b | 55 | QS_SIG_DICTIONARY(START_SIG, me); // signals for Host |
tylerjw | 0:1521c946a57b | 56 | QS_SIG_DICTIONARY(SCROLL_SIG, me); |
tylerjw | 0:1521c946a57b | 57 | QS_SIG_DICTIONARY(SELECT_SIG, me); |
tylerjw | 0:1521c946a57b | 58 | |
tylerjw | 0:1521c946a57b | 59 | me->subscribe(TERMINATE_SIG); |
tylerjw | 0:1521c946a57b | 60 | |
tylerjw | 0:1521c946a57b | 61 | // output welcome message |
tylerjw | 0:1521c946a57b | 62 | BSP_lcdUpdate("Push btn to play mbed hangman!",""); |
tylerjw | 0:1521c946a57b | 63 | wait(2.0); // pause for 2 seconds |
tylerjw | 0:1521c946a57b | 64 | |
tylerjw | 0:1521c946a57b | 65 | return Q_TRAN(&Host::welcome); |
tylerjw | 0:1521c946a57b | 66 | } |
tylerjw | 0:1521c946a57b | 67 | |
tylerjw | 0:1521c946a57b | 68 | //............................................................................ |
tylerjw | 0:1521c946a57b | 69 | QState Host::welcome(Host *me, QEvent const *e) { |
tylerjw | 0:1521c946a57b | 70 | HostEvt *pe; |
tylerjw | 0:1521c946a57b | 71 | |
tylerjw | 0:1521c946a57b | 72 | switch (e->sig) { |
tylerjw | 0:1521c946a57b | 73 | case START_SIG: { |
tylerjw | 0:1521c946a57b | 74 | uint8_t idx; |
tylerjw | 0:1521c946a57b | 75 | |
tylerjw | 0:1521c946a57b | 76 | // init the game |
tylerjw | 0:1521c946a57b | 77 | time_t seconds = time(NULL); |
tylerjw | 0:1521c946a57b | 78 | me->selected_word = seconds % BANK_SIZE; |
tylerjw | 0:1521c946a57b | 79 | me->word = word_bank[me->selected_word]; |
tylerjw | 0:1521c946a57b | 80 | me->num_letters = strlen(me->word); |
tylerjw | 0:1521c946a57b | 81 | me->incorrect_letters = 0; |
tylerjw | 0:1521c946a57b | 82 | for (int i = 0; i < 17; i++) { // clear output |
tylerjw | 0:1521c946a57b | 83 | me->output1[i] = ' '; |
tylerjw | 0:1521c946a57b | 84 | me->output2[i] = ' '; |
tylerjw | 0:1521c946a57b | 85 | } |
tylerjw | 0:1521c946a57b | 86 | |
tylerjw | 0:1521c946a57b | 87 | for (idx = 0; idx < me->num_letters; idx++) { |
tylerjw | 0:1521c946a57b | 88 | me->output1[idx] = '_'; |
tylerjw | 0:1521c946a57b | 89 | } |
tylerjw | 0:1521c946a57b | 90 | for (; idx < 16; idx++) { |
tylerjw | 0:1521c946a57b | 91 | me->output1[idx] = ' '; |
tylerjw | 0:1521c946a57b | 92 | } |
tylerjw | 0:1521c946a57b | 93 | me->letter = 'a'; |
tylerjw | 0:1521c946a57b | 94 | idx = 16; |
tylerjw | 0:1521c946a57b | 95 | me->output1[idx] = me->letter; |
tylerjw | 0:1521c946a57b | 96 | // clear output2 |
tylerjw | 0:1521c946a57b | 97 | for (idx = 0; idx < 17; idx++) |
tylerjw | 0:1521c946a57b | 98 | me->output2[idx] = ' '; |
tylerjw | 0:1521c946a57b | 99 | |
tylerjw | 0:1521c946a57b | 100 | BSP_lcdUpdate(me->output1, me->output2); // update display |
tylerjw | 0:1521c946a57b | 101 | |
tylerjw | 0:1521c946a57b | 102 | // post play to player |
tylerjw | 0:1521c946a57b | 103 | pe = Q_NEW(HostEvt, PLAY_SIG); |
tylerjw | 0:1521c946a57b | 104 | pe->scroll_pos = 0; // center |
tylerjw | 0:1521c946a57b | 105 | QF::PUBLISH(pe, me); |
tylerjw | 0:1521c946a57b | 106 | |
tylerjw | 0:1521c946a57b | 107 | return Q_TRAN(&Host::playing); |
tylerjw | 0:1521c946a57b | 108 | } |
tylerjw | 0:1521c946a57b | 109 | case TERMINATE_SIG: { |
tylerjw | 0:1521c946a57b | 110 | QF::stop(); |
tylerjw | 0:1521c946a57b | 111 | return Q_HANDLED(); |
tylerjw | 0:1521c946a57b | 112 | } |
tylerjw | 0:1521c946a57b | 113 | } |
tylerjw | 0:1521c946a57b | 114 | return Q_SUPER(&QHsm::top); |
tylerjw | 0:1521c946a57b | 115 | } |
tylerjw | 0:1521c946a57b | 116 | |
tylerjw | 0:1521c946a57b | 117 | //............................................................................ |
tylerjw | 0:1521c946a57b | 118 | QState Host::playing(Host *me, QEvent const *e) { |
tylerjw | 0:1521c946a57b | 119 | |
tylerjw | 0:1521c946a57b | 120 | HostEvt *pe; |
tylerjw | 0:1521c946a57b | 121 | |
tylerjw | 0:1521c946a57b | 122 | switch (e->sig) { |
tylerjw | 0:1521c946a57b | 123 | case SCROLL_SIG: { |
tylerjw | 0:1521c946a57b | 124 | if (((HostEvt const *)e)->scroll_pos < 0) { // go down |
tylerjw | 0:1521c946a57b | 125 | if (me->letter == 'a') // wrap around |
tylerjw | 0:1521c946a57b | 126 | me->letter = 'z'; |
tylerjw | 0:1521c946a57b | 127 | else |
tylerjw | 0:1521c946a57b | 128 | me->letter--; |
tylerjw | 0:1521c946a57b | 129 | } else if (((HostEvt const *)e)->scroll_pos > 0) { // go up |
tylerjw | 0:1521c946a57b | 130 | if (me->letter == 'z') // wrap around |
tylerjw | 0:1521c946a57b | 131 | me->letter = 'a'; |
tylerjw | 0:1521c946a57b | 132 | else |
tylerjw | 0:1521c946a57b | 133 | me->letter++; |
tylerjw | 0:1521c946a57b | 134 | } |
tylerjw | 0:1521c946a57b | 135 | me->output1[16] = me->letter; |
tylerjw | 0:1521c946a57b | 136 | BSP_lcdUpdate(me->output1,me->output2); |
tylerjw | 0:1521c946a57b | 137 | |
tylerjw | 0:1521c946a57b | 138 | return Q_HANDLED(); |
tylerjw | 0:1521c946a57b | 139 | } |
tylerjw | 0:1521c946a57b | 140 | case SELECT_SIG: { |
tylerjw | 0:1521c946a57b | 141 | // test for letter in word |
tylerjw | 0:1521c946a57b | 142 | char * pch; |
tylerjw | 0:1521c946a57b | 143 | pch=strchr(me->word,me->letter); |
tylerjw | 0:1521c946a57b | 144 | if (pch != NULL) { // found in word |
tylerjw | 0:1521c946a57b | 145 | do { |
tylerjw | 0:1521c946a57b | 146 | me->word[pch-me->word] = ' '; |
tylerjw | 0:1521c946a57b | 147 | me->output1[pch-me->word] = me->letter; |
tylerjw | 0:1521c946a57b | 148 | pch=strchr(pch+1,me->letter); |
tylerjw | 0:1521c946a57b | 149 | } while (pch!=NULL); |
tylerjw | 0:1521c946a57b | 150 | // update screen |
tylerjw | 0:1521c946a57b | 151 | BSP_lcdUpdate(me->output1,me->output2); |
tylerjw | 0:1521c946a57b | 152 | // test for win |
tylerjw | 0:1521c946a57b | 153 | if (strpbrk(me->word,"abcdefghijklmnopqrs") == NULL) { // win! |
tylerjw | 0:1521c946a57b | 154 | BSP_lcdScrollIn(win_msg, press_play_msg); // win msg |
tylerjw | 0:1521c946a57b | 155 | // post play to player |
tylerjw | 1:4efaebc256d3 | 156 | HostEvt *pe = Q_NEW(HostEvt, FINISHED_SIG); |
tylerjw | 1:4efaebc256d3 | 157 | pe->scroll_pos = 1; // win |
tylerjw | 0:1521c946a57b | 158 | QF::PUBLISH(pe, me); |
tylerjw | 0:1521c946a57b | 159 | |
tylerjw | 0:1521c946a57b | 160 | // go to welcome state |
tylerjw | 0:1521c946a57b | 161 | return Q_TRAN(&Host::welcome); |
tylerjw | 0:1521c946a57b | 162 | } |
tylerjw | 0:1521c946a57b | 163 | } else { |
tylerjw | 0:1521c946a57b | 164 | if (++me->incorrect_letters >= MAX_LETTERS) { // loose |
tylerjw | 0:1521c946a57b | 165 | BSP_lcdScrollIn(loose_msg, press_play_msg); // message |
tylerjw | 0:1521c946a57b | 166 | // post play to player |
tylerjw | 1:4efaebc256d3 | 167 | HostEvt *pe = Q_NEW(HostEvt, FINISHED_SIG); |
tylerjw | 1:4efaebc256d3 | 168 | pe->scroll_pos = 0; // loss |
tylerjw | 0:1521c946a57b | 169 | QF::PUBLISH(pe, me); |
tylerjw | 0:1521c946a57b | 170 | |
tylerjw | 0:1521c946a57b | 171 | // go to welcome state |
tylerjw | 0:1521c946a57b | 172 | return Q_TRAN(&Host::welcome); |
tylerjw | 0:1521c946a57b | 173 | } else { |
tylerjw | 0:1521c946a57b | 174 | // post to used letters |
tylerjw | 0:1521c946a57b | 175 | me->output2[me->incorrect_letters-1] = (char)(me->letter - 33); // make uppercase |
tylerjw | 0:1521c946a57b | 176 | BSP_lcdUpdate(me->output1,me->output2); // update screen |
tylerjw | 0:1521c946a57b | 177 | } |
tylerjw | 0:1521c946a57b | 178 | } |
tylerjw | 0:1521c946a57b | 179 | return Q_HANDLED(); |
tylerjw | 0:1521c946a57b | 180 | } |
tylerjw | 0:1521c946a57b | 181 | case TERMINATE_SIG: { |
tylerjw | 0:1521c946a57b | 182 | QF::stop(); |
tylerjw | 0:1521c946a57b | 183 | return Q_HANDLED(); |
tylerjw | 0:1521c946a57b | 184 | } |
tylerjw | 0:1521c946a57b | 185 | } |
tylerjw | 0:1521c946a57b | 186 | return Q_SUPER(&QHsm::top); |
tylerjw | 0:1521c946a57b | 187 | } |