Hangman game using qp a 16x2 LCD and joystick.

Dependencies:   TextLCD mbed qp

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?

UserRevisionLine numberNew 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 }