Target Practice game for the LPC1768.

Dependencies:   4DGL-uLCD-SE SDFileSystem mbed wave_player

Fork of USBKeyboard_HelloWorld by Samuel Mokrani

Committer:
hwardlaw3
Date:
Thu Mar 16 04:31:56 2017 +0000
Revision:
7:84c2f2ed37d0
Parent:
5:03a4211d593a

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
samux 1:291a88a2c151 1 #include "mbed.h"
hwardlaw3 7:84c2f2ed37d0 2 #include "SDFileSystem.h"
hwardlaw3 7:84c2f2ed37d0 3 #include "uLCD_4DGL.h"
hwardlaw3 7:84c2f2ed37d0 4 #include "wave_player.h"
hwardlaw3 7:84c2f2ed37d0 5 #include "stdio.h"
hwardlaw3 7:84c2f2ed37d0 6
hwardlaw3 7:84c2f2ed37d0 7 DigitalIn right(p13);
hwardlaw3 7:84c2f2ed37d0 8 DigitalIn left(p11);
hwardlaw3 7:84c2f2ed37d0 9 DigitalIn up(p15);
hwardlaw3 7:84c2f2ed37d0 10 DigitalIn down(p12);
hwardlaw3 7:84c2f2ed37d0 11
hwardlaw3 7:84c2f2ed37d0 12 DigitalIn top(p17);
hwardlaw3 7:84c2f2ed37d0 13 DigitalIn center(p20);
hwardlaw3 7:84c2f2ed37d0 14 DigitalIn bottom(p19);
hwardlaw3 7:84c2f2ed37d0 15 DigitalIn last(p16);
hwardlaw3 7:84c2f2ed37d0 16
hwardlaw3 7:84c2f2ed37d0 17 SDFileSystem sd(p5, p6, p7, p8, "sd");
hwardlaw3 7:84c2f2ed37d0 18 uLCD_4DGL uLCD(p28,p27,p30);
hwardlaw3 7:84c2f2ed37d0 19 //Analog Out Jack
hwardlaw3 7:84c2f2ed37d0 20 AnalogOut DACout(p18);
hwardlaw3 7:84c2f2ed37d0 21 //On Board Speaker
hwardlaw3 7:84c2f2ed37d0 22 //PwmOut PWMout(p23);
hwardlaw3 7:84c2f2ed37d0 23 wave_player waver(&DACout);
hwardlaw3 7:84c2f2ed37d0 24 Timer t;
hwardlaw3 7:84c2f2ed37d0 25
hwardlaw3 7:84c2f2ed37d0 26 struct target {
hwardlaw3 7:84c2f2ed37d0 27 bool dead;
hwardlaw3 7:84c2f2ed37d0 28 int myX, myY;
hwardlaw3 7:84c2f2ed37d0 29 bool wasVisible;
hwardlaw3 7:84c2f2ed37d0 30 };
hwardlaw3 7:84c2f2ed37d0 31 float currScore;
hwardlaw3 7:84c2f2ed37d0 32 float scores[9];
hwardlaw3 7:84c2f2ed37d0 33
hwardlaw3 7:84c2f2ed37d0 34
samux 1:291a88a2c151 35 int main(void) {
hwardlaw3 7:84c2f2ed37d0 36 //Start timer for seed value
hwardlaw3 7:84c2f2ed37d0 37 t.start();
hwardlaw3 7:84c2f2ed37d0 38 uLCD.cls();
hwardlaw3 7:84c2f2ed37d0 39 uLCD.baudrate(3000000);
hwardlaw3 7:84c2f2ed37d0 40 bool newGame;
hwardlaw3 7:84c2f2ed37d0 41 int xloc, yloc, xold, yold, kills;
hwardlaw3 7:84c2f2ed37d0 42 target myTargets[10];
hwardlaw3 7:84c2f2ed37d0 43
hwardlaw3 7:84c2f2ed37d0 44
hwardlaw3 7:84c2f2ed37d0 45 for(int i = 0; i < 10; i++){
hwardlaw3 7:84c2f2ed37d0 46 scores[i] = 999.99;
hwardlaw3 7:84c2f2ed37d0 47 }
hwardlaw3 7:84c2f2ed37d0 48 FILE *wfile;
hwardlaw3 7:84c2f2ed37d0 49
hwardlaw3 7:84c2f2ed37d0 50
hwardlaw3 7:84c2f2ed37d0 51
hwardlaw3 7:84c2f2ed37d0 52 // Exit main menu on button press
hwardlaw3 7:84c2f2ed37d0 53 uLCD.media_init();
hwardlaw3 7:84c2f2ed37d0 54 uLCD.set_sector_address(0x003B, 0x5001);
hwardlaw3 7:84c2f2ed37d0 55 uLCD.display_image(0,0);
hwardlaw3 7:84c2f2ed37d0 56
hwardlaw3 7:84c2f2ed37d0 57 wfile = fopen("/sd/intro.wav","r");
hwardlaw3 7:84c2f2ed37d0 58 waver.play(wfile);
hwardlaw3 7:84c2f2ed37d0 59 fclose(wfile);
hwardlaw3 7:84c2f2ed37d0 60
hwardlaw3 7:84c2f2ed37d0 61 uLCD.locate(0,10);
hwardlaw3 7:84c2f2ed37d0 62 uLCD.printf("Button 1 to Start!");
hwardlaw3 7:84c2f2ed37d0 63 while(top){
hwardlaw3 7:84c2f2ed37d0 64 //reset high score list
hwardlaw3 7:84c2f2ed37d0 65 if(!last) {
hwardlaw3 7:84c2f2ed37d0 66 for(int i = 0; i < 10; i++){
hwardlaw3 7:84c2f2ed37d0 67 scores[i] = 999.99;
hwardlaw3 7:84c2f2ed37d0 68 uLCD.locate(0,0);
hwardlaw3 7:84c2f2ed37d0 69 uLCD.printf("High scores reset");
hwardlaw3 7:84c2f2ed37d0 70 }
hwardlaw3 7:84c2f2ed37d0 71 }
hwardlaw3 7:84c2f2ed37d0 72 }
hwardlaw3 7:84c2f2ed37d0 73 t.stop();
hwardlaw3 7:84c2f2ed37d0 74
hwardlaw3 7:84c2f2ed37d0 75
hwardlaw3 7:84c2f2ed37d0 76
hwardlaw3 7:84c2f2ed37d0 77 //Main game loop
hwardlaw3 7:84c2f2ed37d0 78 while(true) {
hwardlaw3 7:84c2f2ed37d0 79 newGame = false;
hwardlaw3 7:84c2f2ed37d0 80
hwardlaw3 7:84c2f2ed37d0 81 //Ready-set-go style countdown
hwardlaw3 7:84c2f2ed37d0 82 uLCD.cls();
hwardlaw3 7:84c2f2ed37d0 83 uLCD.locate(4,4);
hwardlaw3 7:84c2f2ed37d0 84 uLCD.printf("Get Ready!");
hwardlaw3 7:84c2f2ed37d0 85 wait(1);
hwardlaw3 7:84c2f2ed37d0 86 uLCD.cls();
hwardlaw3 7:84c2f2ed37d0 87 uLCD.locate(8,4);
hwardlaw3 7:84c2f2ed37d0 88 uLCD.printf("3");
hwardlaw3 7:84c2f2ed37d0 89 wfile = fopen("/sd/beep.wav","r");
hwardlaw3 7:84c2f2ed37d0 90 waver.play(wfile);
hwardlaw3 7:84c2f2ed37d0 91 fclose(wfile);
hwardlaw3 7:84c2f2ed37d0 92 uLCD.cls();
hwardlaw3 7:84c2f2ed37d0 93 uLCD.locate(8,4);
hwardlaw3 7:84c2f2ed37d0 94 uLCD.printf("2");
hwardlaw3 7:84c2f2ed37d0 95 wfile = fopen("/sd/beep.wav","r");
hwardlaw3 7:84c2f2ed37d0 96 waver.play(wfile);
hwardlaw3 7:84c2f2ed37d0 97 fclose(wfile);
hwardlaw3 7:84c2f2ed37d0 98 uLCD.cls();
hwardlaw3 7:84c2f2ed37d0 99 uLCD.locate(8,4);
hwardlaw3 7:84c2f2ed37d0 100 uLCD.printf("1");
hwardlaw3 7:84c2f2ed37d0 101 wfile = fopen("/sd/beep.wav","r");
hwardlaw3 7:84c2f2ed37d0 102 waver.play(wfile);
hwardlaw3 7:84c2f2ed37d0 103 fclose(wfile);
hwardlaw3 7:84c2f2ed37d0 104 uLCD.cls();
hwardlaw3 7:84c2f2ed37d0 105 uLCD.locate(7,4);
hwardlaw3 7:84c2f2ed37d0 106 uLCD.printf("GO!");
hwardlaw3 7:84c2f2ed37d0 107 wfile = fopen("/sd/beephigh.wav","r");
hwardlaw3 7:84c2f2ed37d0 108 waver.play(wfile);
hwardlaw3 7:84c2f2ed37d0 109 fclose(wfile);
hwardlaw3 7:84c2f2ed37d0 110 uLCD.cls();
hwardlaw3 7:84c2f2ed37d0 111
hwardlaw3 7:84c2f2ed37d0 112
hwardlaw3 7:84c2f2ed37d0 113 xloc = 64;
hwardlaw3 7:84c2f2ed37d0 114 yloc = 64;
hwardlaw3 7:84c2f2ed37d0 115 xold = 0;
hwardlaw3 7:84c2f2ed37d0 116 yold = 0;
hwardlaw3 7:84c2f2ed37d0 117 kills = 0;
hwardlaw3 7:84c2f2ed37d0 118
hwardlaw3 7:84c2f2ed37d0 119
hwardlaw3 7:84c2f2ed37d0 120 //Create targets, use time as seed
hwardlaw3 7:84c2f2ed37d0 121 srand(t.read());
hwardlaw3 7:84c2f2ed37d0 122
hwardlaw3 7:84c2f2ed37d0 123 for (int i = 0; i < 10; i++) {
hwardlaw3 7:84c2f2ed37d0 124 myTargets[i].myX = rand() % 128;
hwardlaw3 7:84c2f2ed37d0 125 myTargets[i].myY = rand() % 128;
hwardlaw3 7:84c2f2ed37d0 126 myTargets[i].dead = false;
hwardlaw3 7:84c2f2ed37d0 127 myTargets[i].wasVisible = false;
hwardlaw3 7:84c2f2ed37d0 128 }
hwardlaw3 7:84c2f2ed37d0 129
hwardlaw3 7:84c2f2ed37d0 130 //Start score timer for game
hwardlaw3 7:84c2f2ed37d0 131 t.reset();
hwardlaw3 7:84c2f2ed37d0 132 t.start();
hwardlaw3 7:84c2f2ed37d0 133 while (!newGame) {
hwardlaw3 7:84c2f2ed37d0 134 //Redraw scope if moved
hwardlaw3 7:84c2f2ed37d0 135 if (xloc != xold || yloc != yold) {
hwardlaw3 7:84c2f2ed37d0 136 uLCD.filled_circle(xold, yold, 14, BLACK);
hwardlaw3 7:84c2f2ed37d0 137 uLCD.filled_circle(xloc, yloc, 14, GREEN);
hwardlaw3 7:84c2f2ed37d0 138 uLCD.filled_circle(xloc, yloc, 2, WHITE);
hwardlaw3 7:84c2f2ed37d0 139 xold = xloc;
hwardlaw3 7:84c2f2ed37d0 140 yold = yloc;
hwardlaw3 7:84c2f2ed37d0 141 }
hwardlaw3 7:84c2f2ed37d0 142
hwardlaw3 7:84c2f2ed37d0 143 //Check if targets are visible
hwardlaw3 7:84c2f2ed37d0 144 for (int i = 0; i < 10; i++) {
hwardlaw3 7:84c2f2ed37d0 145 if (myTargets[i].dead == true) {
hwardlaw3 7:84c2f2ed37d0 146 continue;
hwardlaw3 7:84c2f2ed37d0 147 }
hwardlaw3 7:84c2f2ed37d0 148
hwardlaw3 7:84c2f2ed37d0 149 if (abs(myTargets[i].myX - xloc) < 16 && abs(myTargets[i].myY - yloc) < 16) {
hwardlaw3 7:84c2f2ed37d0 150 uLCD.filled_circle(myTargets[i].myX, myTargets[i].myY, 10, RED);
hwardlaw3 7:84c2f2ed37d0 151 myTargets[i].wasVisible = true;
hwardlaw3 7:84c2f2ed37d0 152 }
hwardlaw3 7:84c2f2ed37d0 153 else if (myTargets[i].wasVisible == true) {
hwardlaw3 7:84c2f2ed37d0 154 myTargets[i].wasVisible = false;
hwardlaw3 7:84c2f2ed37d0 155 uLCD.filled_circle(myTargets[i].myX, myTargets[i].myY, 10, BLACK);
hwardlaw3 7:84c2f2ed37d0 156 uLCD.filled_circle(xloc, yloc, 14, GREEN);
hwardlaw3 7:84c2f2ed37d0 157 uLCD.filled_circle(xloc, yloc, 2, WHITE);
hwardlaw3 7:84c2f2ed37d0 158 }
hwardlaw3 7:84c2f2ed37d0 159 }
hwardlaw3 7:84c2f2ed37d0 160
hwardlaw3 7:84c2f2ed37d0 161
hwardlaw3 7:84c2f2ed37d0 162 //Check if shot hit
hwardlaw3 7:84c2f2ed37d0 163 if (!top) {
hwardlaw3 7:84c2f2ed37d0 164 wfile = fopen("/sd/newsilencer.wav","r");
hwardlaw3 7:84c2f2ed37d0 165 waver.play(wfile);
hwardlaw3 7:84c2f2ed37d0 166 fclose(wfile);
hwardlaw3 7:84c2f2ed37d0 167 for (int i = 0; i < 10; i++) {
hwardlaw3 7:84c2f2ed37d0 168 if (myTargets[i].dead == true)
hwardlaw3 7:84c2f2ed37d0 169 continue;
hwardlaw3 7:84c2f2ed37d0 170 if (abs(myTargets[i].myX - xloc) < 8 && abs(myTargets[i].myY - yloc) < 8) {
hwardlaw3 7:84c2f2ed37d0 171 uLCD.filled_circle(myTargets[i].myX, myTargets[i].myY, 10, BLACK);
hwardlaw3 7:84c2f2ed37d0 172 uLCD.filled_circle(xloc, yloc, 14, GREEN);
hwardlaw3 7:84c2f2ed37d0 173 uLCD.filled_circle(xloc, yloc, 2, WHITE);
hwardlaw3 7:84c2f2ed37d0 174 myTargets[i].dead = true;
hwardlaw3 7:84c2f2ed37d0 175 kills++;
hwardlaw3 7:84c2f2ed37d0 176 uLCD.filled_circle(xloc, yloc, 2, 0xffa500);//orange
hwardlaw3 7:84c2f2ed37d0 177
hwardlaw3 7:84c2f2ed37d0 178
hwardlaw3 7:84c2f2ed37d0 179
hwardlaw3 7:84c2f2ed37d0 180 }
hwardlaw3 7:84c2f2ed37d0 181 }
hwardlaw3 7:84c2f2ed37d0 182 }
hwardlaw3 7:84c2f2ed37d0 183
hwardlaw3 7:84c2f2ed37d0 184 if (!up) {
hwardlaw3 7:84c2f2ed37d0 185 yloc -= 6;
hwardlaw3 7:84c2f2ed37d0 186 if (yloc < 6)
hwardlaw3 7:84c2f2ed37d0 187 yloc = 6;
hwardlaw3 7:84c2f2ed37d0 188 }
hwardlaw3 7:84c2f2ed37d0 189 if (!down){
hwardlaw3 7:84c2f2ed37d0 190 yloc += 6;
hwardlaw3 7:84c2f2ed37d0 191 if (yloc > 121)
hwardlaw3 7:84c2f2ed37d0 192 yloc = 121;
hwardlaw3 7:84c2f2ed37d0 193 }
hwardlaw3 7:84c2f2ed37d0 194 if (!left) {
hwardlaw3 7:84c2f2ed37d0 195 xloc -= 6;
hwardlaw3 7:84c2f2ed37d0 196 if (xloc < 6)
hwardlaw3 7:84c2f2ed37d0 197 xloc = 6;
hwardlaw3 7:84c2f2ed37d0 198 }
hwardlaw3 7:84c2f2ed37d0 199 if (!right) {
hwardlaw3 7:84c2f2ed37d0 200 xloc += 6;
hwardlaw3 7:84c2f2ed37d0 201 if (xloc > 121)
hwardlaw3 7:84c2f2ed37d0 202 xloc = 121;
hwardlaw3 7:84c2f2ed37d0 203 }
hwardlaw3 7:84c2f2ed37d0 204 uLCD.locate(0,0);
hwardlaw3 7:84c2f2ed37d0 205 uLCD.printf("Time: %0.2f", t.read());
hwardlaw3 7:84c2f2ed37d0 206 wait(.025);
hwardlaw3 7:84c2f2ed37d0 207 //Win Screen
hwardlaw3 7:84c2f2ed37d0 208 if (kills >= 10) {
hwardlaw3 7:84c2f2ed37d0 209 t.stop();
hwardlaw3 7:84c2f2ed37d0 210 currScore = t.read() - .4;
hwardlaw3 7:84c2f2ed37d0 211 uLCD.cls();
hwardlaw3 7:84c2f2ed37d0 212
hwardlaw3 7:84c2f2ed37d0 213 if(currScore < scores[0]){
hwardlaw3 7:84c2f2ed37d0 214 uLCD.locate(0,1);
hwardlaw3 7:84c2f2ed37d0 215 uLCD.printf("NEW HIGH SCORE!!!");
hwardlaw3 7:84c2f2ed37d0 216 }
hwardlaw3 7:84c2f2ed37d0 217 for(int i = 0; i < 9; i++){
hwardlaw3 7:84c2f2ed37d0 218 if(currScore < scores[i]) {
hwardlaw3 7:84c2f2ed37d0 219 for(int j = 7; j >= i; j--){
hwardlaw3 7:84c2f2ed37d0 220 scores[j+1] = scores[j];
hwardlaw3 7:84c2f2ed37d0 221 }
hwardlaw3 7:84c2f2ed37d0 222 scores[i] = currScore;
hwardlaw3 7:84c2f2ed37d0 223 break;
hwardlaw3 7:84c2f2ed37d0 224 }
hwardlaw3 7:84c2f2ed37d0 225
hwardlaw3 7:84c2f2ed37d0 226 }
hwardlaw3 7:84c2f2ed37d0 227
hwardlaw3 7:84c2f2ed37d0 228 uLCD.locate(0,3);
hwardlaw3 7:84c2f2ed37d0 229 uLCD.printf("High Scores\n");
hwardlaw3 7:84c2f2ed37d0 230 uLCD.printf("-----------\n");
hwardlaw3 7:84c2f2ed37d0 231 for(int i = 0; i < 9; i++){
hwardlaw3 7:84c2f2ed37d0 232 uLCD.printf("%d. %6.2f\n", i+1, scores[i]);
hwardlaw3 7:84c2f2ed37d0 233 }
hwardlaw3 7:84c2f2ed37d0 234 //display score
hwardlaw3 7:84c2f2ed37d0 235 uLCD.locate(0,0);
hwardlaw3 7:84c2f2ed37d0 236 uLCD.printf("Final Score: %0.2f\n",currScore);
hwardlaw3 7:84c2f2ed37d0 237 wfile = fopen("/sd/youwinshort.wav","r");
hwardlaw3 7:84c2f2ed37d0 238 waver.play(wfile);
hwardlaw3 7:84c2f2ed37d0 239 fclose(wfile);
hwardlaw3 7:84c2f2ed37d0 240 uLCD.filled_rectangle(0, 0, 128, 16, BLACK);
hwardlaw3 7:84c2f2ed37d0 241 uLCD.locate(0,0);
hwardlaw3 7:84c2f2ed37d0 242 uLCD.printf("New Game?");
hwardlaw3 7:84c2f2ed37d0 243 while (true) {
hwardlaw3 7:84c2f2ed37d0 244 //Break and reset on button press
hwardlaw3 7:84c2f2ed37d0 245 if (!top) {
hwardlaw3 7:84c2f2ed37d0 246 newGame = true;
hwardlaw3 7:84c2f2ed37d0 247 break;
hwardlaw3 7:84c2f2ed37d0 248 }
hwardlaw3 7:84c2f2ed37d0 249
hwardlaw3 7:84c2f2ed37d0 250 }
hwardlaw3 7:84c2f2ed37d0 251 }
hwardlaw3 7:84c2f2ed37d0 252 }
samux 1:291a88a2c151 253 }
samux 4:f0df6aae7147 254 }