A simple Whack-a-Mole game using LEDs and pushbuttons
Dependencies: DebounceIn TextLCD mbed-rtos mbed
main.cpp@0:a4e667868bd4, 2014-10-21 (annotated)
- Committer:
- tdouglas6
- Date:
- Tue Oct 21 00:10:27 2014 +0000
- Revision:
- 0:a4e667868bd4
A simple Whack-a-Mole game using LEDs and pushbuttons
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
tdouglas6 | 0:a4e667868bd4 | 1 | #include "mbed.h" |
tdouglas6 | 0:a4e667868bd4 | 2 | #include "rtos.h" |
tdouglas6 | 0:a4e667868bd4 | 3 | #include "DebounceIn.h" |
tdouglas6 | 0:a4e667868bd4 | 4 | #include "TextLCD.h" |
tdouglas6 | 0:a4e667868bd4 | 5 | |
tdouglas6 | 0:a4e667868bd4 | 6 | TextLCD lcd(p15, p16, p17, p18, p19, p20); |
tdouglas6 | 0:a4e667868bd4 | 7 | |
tdouglas6 | 0:a4e667868bd4 | 8 | DigitalOut led1(p11); |
tdouglas6 | 0:a4e667868bd4 | 9 | DigitalOut led2(p8); |
tdouglas6 | 0:a4e667868bd4 | 10 | DigitalOut led3(p6); |
tdouglas6 | 0:a4e667868bd4 | 11 | DigitalOut led4(p10); |
tdouglas6 | 0:a4e667868bd4 | 12 | DigitalOut led5(p7); |
tdouglas6 | 0:a4e667868bd4 | 13 | DigitalOut led6(p5); |
tdouglas6 | 0:a4e667868bd4 | 14 | |
tdouglas6 | 0:a4e667868bd4 | 15 | DebounceIn pb1(p23); |
tdouglas6 | 0:a4e667868bd4 | 16 | DebounceIn pb2(p22); |
tdouglas6 | 0:a4e667868bd4 | 17 | DebounceIn pb3(p21); |
tdouglas6 | 0:a4e667868bd4 | 18 | DebounceIn pb4(p26); |
tdouglas6 | 0:a4e667868bd4 | 19 | DebounceIn pb5(p24); |
tdouglas6 | 0:a4e667868bd4 | 20 | DebounceIn pb6(p25); |
tdouglas6 | 0:a4e667868bd4 | 21 | int n, c; |
tdouglas6 | 0:a4e667868bd4 | 22 | int comm; |
tdouglas6 | 0:a4e667868bd4 | 23 | int counter=0; |
tdouglas6 | 0:a4e667868bd4 | 24 | int timer=30; |
tdouglas6 | 0:a4e667868bd4 | 25 | |
tdouglas6 | 0:a4e667868bd4 | 26 | //*clock counts down from 30 seconds*// |
tdouglas6 | 0:a4e667868bd4 | 27 | void Countdown(void const *args) { |
tdouglas6 | 0:a4e667868bd4 | 28 | lcd.cls(); |
tdouglas6 | 0:a4e667868bd4 | 29 | while(true) { |
tdouglas6 | 0:a4e667868bd4 | 30 | lcd.cls(); |
tdouglas6 | 0:a4e667868bd4 | 31 | lcd.printf("Time Left: %d s", timer); |
tdouglas6 | 0:a4e667868bd4 | 32 | lcd.printf("\nHit Count: %d", counter); |
tdouglas6 | 0:a4e667868bd4 | 33 | timer--; |
tdouglas6 | 0:a4e667868bd4 | 34 | Thread::wait(1000); |
tdouglas6 | 0:a4e667868bd4 | 35 | } |
tdouglas6 | 0:a4e667868bd4 | 36 | } |
tdouglas6 | 0:a4e667868bd4 | 37 | |
tdouglas6 | 0:a4e667868bd4 | 38 | //*randomly selects which LEDs will turn on *// |
tdouglas6 | 0:a4e667868bd4 | 39 | void Random(void const *args) { |
tdouglas6 | 0:a4e667868bd4 | 40 | n=0; |
tdouglas6 | 0:a4e667868bd4 | 41 | |
tdouglas6 | 0:a4e667868bd4 | 42 | while(true) { |
tdouglas6 | 0:a4e667868bd4 | 43 | comm=rand()%15; //determines which LEDs will turn on |
tdouglas6 | 0:a4e667868bd4 | 44 | c=rand()%400; //speed |
tdouglas6 | 0:a4e667868bd4 | 45 | |
tdouglas6 | 0:a4e667868bd4 | 46 | if(comm==0) { |
tdouglas6 | 0:a4e667868bd4 | 47 | led1=1; |
tdouglas6 | 0:a4e667868bd4 | 48 | led2=0; |
tdouglas6 | 0:a4e667868bd4 | 49 | led3=0; |
tdouglas6 | 0:a4e667868bd4 | 50 | led4=0; |
tdouglas6 | 0:a4e667868bd4 | 51 | led5=0; |
tdouglas6 | 0:a4e667868bd4 | 52 | led6=0; |
tdouglas6 | 0:a4e667868bd4 | 53 | wait(0.2); |
tdouglas6 | 0:a4e667868bd4 | 54 | } else if (comm==1) { |
tdouglas6 | 0:a4e667868bd4 | 55 | led1=0; |
tdouglas6 | 0:a4e667868bd4 | 56 | led2=1; |
tdouglas6 | 0:a4e667868bd4 | 57 | led3=0; |
tdouglas6 | 0:a4e667868bd4 | 58 | led4=0; |
tdouglas6 | 0:a4e667868bd4 | 59 | led5=0; |
tdouglas6 | 0:a4e667868bd4 | 60 | led6=0; |
tdouglas6 | 0:a4e667868bd4 | 61 | wait(0.2); |
tdouglas6 | 0:a4e667868bd4 | 62 | } else if (comm==2) { |
tdouglas6 | 0:a4e667868bd4 | 63 | led1=0; |
tdouglas6 | 0:a4e667868bd4 | 64 | led2=0; |
tdouglas6 | 0:a4e667868bd4 | 65 | led3=1; |
tdouglas6 | 0:a4e667868bd4 | 66 | led4=0; |
tdouglas6 | 0:a4e667868bd4 | 67 | led5=0; |
tdouglas6 | 0:a4e667868bd4 | 68 | led6=0; |
tdouglas6 | 0:a4e667868bd4 | 69 | wait(0.2); |
tdouglas6 | 0:a4e667868bd4 | 70 | } else if (comm==3) { |
tdouglas6 | 0:a4e667868bd4 | 71 | led1=0; |
tdouglas6 | 0:a4e667868bd4 | 72 | led2=0; |
tdouglas6 | 0:a4e667868bd4 | 73 | led3=0; |
tdouglas6 | 0:a4e667868bd4 | 74 | led4=1; |
tdouglas6 | 0:a4e667868bd4 | 75 | led5=0; |
tdouglas6 | 0:a4e667868bd4 | 76 | led6=0; |
tdouglas6 | 0:a4e667868bd4 | 77 | wait(0.2); |
tdouglas6 | 0:a4e667868bd4 | 78 | } else if (comm==4) { |
tdouglas6 | 0:a4e667868bd4 | 79 | led1=0; |
tdouglas6 | 0:a4e667868bd4 | 80 | led2=0; |
tdouglas6 | 0:a4e667868bd4 | 81 | led3=0; |
tdouglas6 | 0:a4e667868bd4 | 82 | led4=0; |
tdouglas6 | 0:a4e667868bd4 | 83 | led5=1; |
tdouglas6 | 0:a4e667868bd4 | 84 | led6=0; |
tdouglas6 | 0:a4e667868bd4 | 85 | wait(0.2); |
tdouglas6 | 0:a4e667868bd4 | 86 | } else if (comm==5) { |
tdouglas6 | 0:a4e667868bd4 | 87 | led1=0; |
tdouglas6 | 0:a4e667868bd4 | 88 | led2=0; |
tdouglas6 | 0:a4e667868bd4 | 89 | led3=0; |
tdouglas6 | 0:a4e667868bd4 | 90 | led4=0; |
tdouglas6 | 0:a4e667868bd4 | 91 | led5=0; |
tdouglas6 | 0:a4e667868bd4 | 92 | led6=1; |
tdouglas6 | 0:a4e667868bd4 | 93 | wait(0.2); |
tdouglas6 | 0:a4e667868bd4 | 94 | } else if (comm==6) { |
tdouglas6 | 0:a4e667868bd4 | 95 | led1=0; |
tdouglas6 | 0:a4e667868bd4 | 96 | led2=1; |
tdouglas6 | 0:a4e667868bd4 | 97 | led3=0; |
tdouglas6 | 0:a4e667868bd4 | 98 | led4=0; |
tdouglas6 | 0:a4e667868bd4 | 99 | led5=0; |
tdouglas6 | 0:a4e667868bd4 | 100 | led6=1; |
tdouglas6 | 0:a4e667868bd4 | 101 | wait(0.2); |
tdouglas6 | 0:a4e667868bd4 | 102 | } else if (comm==7) { |
tdouglas6 | 0:a4e667868bd4 | 103 | led1=1; |
tdouglas6 | 0:a4e667868bd4 | 104 | led2=0; |
tdouglas6 | 0:a4e667868bd4 | 105 | led3=1; |
tdouglas6 | 0:a4e667868bd4 | 106 | led4=0; |
tdouglas6 | 0:a4e667868bd4 | 107 | led5=0; |
tdouglas6 | 0:a4e667868bd4 | 108 | led6=0; |
tdouglas6 | 0:a4e667868bd4 | 109 | wait(0.2); |
tdouglas6 | 0:a4e667868bd4 | 110 | } else if (comm==8) { |
tdouglas6 | 0:a4e667868bd4 | 111 | led1=0; |
tdouglas6 | 0:a4e667868bd4 | 112 | led2=1; |
tdouglas6 | 0:a4e667868bd4 | 113 | led3=0; |
tdouglas6 | 0:a4e667868bd4 | 114 | led4=1; |
tdouglas6 | 0:a4e667868bd4 | 115 | led5=0; |
tdouglas6 | 0:a4e667868bd4 | 116 | led6=1; |
tdouglas6 | 0:a4e667868bd4 | 117 | wait(0.2); |
tdouglas6 | 0:a4e667868bd4 | 118 | } else if (comm==9) { |
tdouglas6 | 0:a4e667868bd4 | 119 | led1=0; |
tdouglas6 | 0:a4e667868bd4 | 120 | led2=0; |
tdouglas6 | 0:a4e667868bd4 | 121 | led3=1; |
tdouglas6 | 0:a4e667868bd4 | 122 | led4=1; |
tdouglas6 | 0:a4e667868bd4 | 123 | led5=0; |
tdouglas6 | 0:a4e667868bd4 | 124 | led6=1; |
tdouglas6 | 0:a4e667868bd4 | 125 | wait(0.2); |
tdouglas6 | 0:a4e667868bd4 | 126 | } else if (comm==10) { |
tdouglas6 | 0:a4e667868bd4 | 127 | led1=1; |
tdouglas6 | 0:a4e667868bd4 | 128 | led2=0; |
tdouglas6 | 0:a4e667868bd4 | 129 | led3=0; |
tdouglas6 | 0:a4e667868bd4 | 130 | led4=0; |
tdouglas6 | 0:a4e667868bd4 | 131 | led5=0; |
tdouglas6 | 0:a4e667868bd4 | 132 | led6=1; |
tdouglas6 | 0:a4e667868bd4 | 133 | wait(0.2); |
tdouglas6 | 0:a4e667868bd4 | 134 | } else if (comm==11) { |
tdouglas6 | 0:a4e667868bd4 | 135 | led1=0; |
tdouglas6 | 0:a4e667868bd4 | 136 | led2=1; |
tdouglas6 | 0:a4e667868bd4 | 137 | led3=1; |
tdouglas6 | 0:a4e667868bd4 | 138 | led4=0; |
tdouglas6 | 0:a4e667868bd4 | 139 | led5=1; |
tdouglas6 | 0:a4e667868bd4 | 140 | led6=1; |
tdouglas6 | 0:a4e667868bd4 | 141 | wait(0.2); |
tdouglas6 | 0:a4e667868bd4 | 142 | } else if (comm==12) { |
tdouglas6 | 0:a4e667868bd4 | 143 | led1=1; |
tdouglas6 | 0:a4e667868bd4 | 144 | led2=1; |
tdouglas6 | 0:a4e667868bd4 | 145 | led3=1; |
tdouglas6 | 0:a4e667868bd4 | 146 | led4=1; |
tdouglas6 | 0:a4e667868bd4 | 147 | led5=1; |
tdouglas6 | 0:a4e667868bd4 | 148 | led6=1; |
tdouglas6 | 0:a4e667868bd4 | 149 | wait(0.2); |
tdouglas6 | 0:a4e667868bd4 | 150 | } else if (comm==13) { |
tdouglas6 | 0:a4e667868bd4 | 151 | led1=1; |
tdouglas6 | 0:a4e667868bd4 | 152 | led2=0; |
tdouglas6 | 0:a4e667868bd4 | 153 | led3=1; |
tdouglas6 | 0:a4e667868bd4 | 154 | led4=0; |
tdouglas6 | 0:a4e667868bd4 | 155 | led5=1; |
tdouglas6 | 0:a4e667868bd4 | 156 | led6=0; |
tdouglas6 | 0:a4e667868bd4 | 157 | wait(0.2); |
tdouglas6 | 0:a4e667868bd4 | 158 | } else if (comm==14) { |
tdouglas6 | 0:a4e667868bd4 | 159 | led1=0; |
tdouglas6 | 0:a4e667868bd4 | 160 | led2=1; |
tdouglas6 | 0:a4e667868bd4 | 161 | led3=0; |
tdouglas6 | 0:a4e667868bd4 | 162 | led4=0; |
tdouglas6 | 0:a4e667868bd4 | 163 | led5=1; |
tdouglas6 | 0:a4e667868bd4 | 164 | led6=0; |
tdouglas6 | 0:a4e667868bd4 | 165 | wait(0.2); |
tdouglas6 | 0:a4e667868bd4 | 166 | } |
tdouglas6 | 0:a4e667868bd4 | 167 | n++; |
tdouglas6 | 0:a4e667868bd4 | 168 | Thread::wait(c); |
tdouglas6 | 0:a4e667868bd4 | 169 | } |
tdouglas6 | 0:a4e667868bd4 | 170 | } |
tdouglas6 | 0:a4e667868bd4 | 171 | |
tdouglas6 | 0:a4e667868bd4 | 172 | //*if the correct button is pressed while the corresponding LED is on, the hit count will increase*// |
tdouglas6 | 0:a4e667868bd4 | 173 | void ButtonPress(void const *args) { |
tdouglas6 | 0:a4e667868bd4 | 174 | while(true) { |
tdouglas6 | 0:a4e667868bd4 | 175 | if(led1==1&&pb1==0) { |
tdouglas6 | 0:a4e667868bd4 | 176 | counter++; |
tdouglas6 | 0:a4e667868bd4 | 177 | } else if(led2==1&&pb2==0) { |
tdouglas6 | 0:a4e667868bd4 | 178 | counter++; |
tdouglas6 | 0:a4e667868bd4 | 179 | } else if(led3==1&&pb3==0) { |
tdouglas6 | 0:a4e667868bd4 | 180 | counter++; |
tdouglas6 | 0:a4e667868bd4 | 181 | } else if(led4==1&&pb4==0) { |
tdouglas6 | 0:a4e667868bd4 | 182 | counter++; |
tdouglas6 | 0:a4e667868bd4 | 183 | } else if(led5==1&&pb5==0) { |
tdouglas6 | 0:a4e667868bd4 | 184 | counter++; |
tdouglas6 | 0:a4e667868bd4 | 185 | } else if(led6==1&&pb6==0) { |
tdouglas6 | 0:a4e667868bd4 | 186 | counter++; |
tdouglas6 | 0:a4e667868bd4 | 187 | } |
tdouglas6 | 0:a4e667868bd4 | 188 | Thread::wait(300); |
tdouglas6 | 0:a4e667868bd4 | 189 | } |
tdouglas6 | 0:a4e667868bd4 | 190 | } |
tdouglas6 | 0:a4e667868bd4 | 191 | |
tdouglas6 | 0:a4e667868bd4 | 192 | int main() { |
tdouglas6 | 0:a4e667868bd4 | 193 | pb1.mode(PullUp); |
tdouglas6 | 0:a4e667868bd4 | 194 | pb2.mode(PullUp); |
tdouglas6 | 0:a4e667868bd4 | 195 | pb3.mode(PullUp); |
tdouglas6 | 0:a4e667868bd4 | 196 | pb4.mode(PullUp); |
tdouglas6 | 0:a4e667868bd4 | 197 | pb5.mode(PullUp); |
tdouglas6 | 0:a4e667868bd4 | 198 | pb6.mode(PullUp); |
tdouglas6 | 0:a4e667868bd4 | 199 | wait(.001); |
tdouglas6 | 0:a4e667868bd4 | 200 | |
tdouglas6 | 0:a4e667868bd4 | 201 | Thread t3(Countdown); |
tdouglas6 | 0:a4e667868bd4 | 202 | Thread t1(Random); |
tdouglas6 | 0:a4e667868bd4 | 203 | Thread t2(ButtonPress); |
tdouglas6 | 0:a4e667868bd4 | 204 | |
tdouglas6 | 0:a4e667868bd4 | 205 | while(1) { |
tdouglas6 | 0:a4e667868bd4 | 206 | if(timer==0) { |
tdouglas6 | 0:a4e667868bd4 | 207 | lcd.cls(); |
tdouglas6 | 0:a4e667868bd4 | 208 | t1.terminate(); |
tdouglas6 | 0:a4e667868bd4 | 209 | t2.terminate(); |
tdouglas6 | 0:a4e667868bd4 | 210 | t3.terminate(); |
tdouglas6 | 0:a4e667868bd4 | 211 | led1=0; |
tdouglas6 | 0:a4e667868bd4 | 212 | led2=0; |
tdouglas6 | 0:a4e667868bd4 | 213 | led3=0; |
tdouglas6 | 0:a4e667868bd4 | 214 | led4=0; |
tdouglas6 | 0:a4e667868bd4 | 215 | led5=0; |
tdouglas6 | 0:a4e667868bd4 | 216 | led6=0; |
tdouglas6 | 0:a4e667868bd4 | 217 | lcd.printf("Game Over!\nFinal score: %d", counter); |
tdouglas6 | 0:a4e667868bd4 | 218 | } |
tdouglas6 | 0:a4e667868bd4 | 219 | Thread::wait(1000); |
tdouglas6 | 0:a4e667868bd4 | 220 | } |
tdouglas6 | 0:a4e667868bd4 | 221 | } |