Target Practice game for the LPC1768.
Dependencies: 4DGL-uLCD-SE SDFileSystem mbed wave_player
Fork of USBKeyboard_HelloWorld by
Diff: main.cpp
- Revision:
- 7:84c2f2ed37d0
- Parent:
- 5:03a4211d593a
--- a/main.cpp Fri Mar 01 13:23:58 2013 +0000 +++ b/main.cpp Thu Mar 16 04:31:56 2017 +0000 @@ -1,21 +1,254 @@ #include "mbed.h" -#include "USBKeyboard.h" - -//LED1: NUM_LOCK -//LED2: CAPS_LOCK -//LED3: SCROLL_LOCK -BusOut leds(LED1, LED2, LED3); - -//USBKeyboard -USBKeyboard keyboard; - +#include "SDFileSystem.h" +#include "uLCD_4DGL.h" +#include "wave_player.h" +#include "stdio.h" + +DigitalIn right(p13); +DigitalIn left(p11); +DigitalIn up(p15); +DigitalIn down(p12); + +DigitalIn top(p17); +DigitalIn center(p20); +DigitalIn bottom(p19); +DigitalIn last(p16); + +SDFileSystem sd(p5, p6, p7, p8, "sd"); +uLCD_4DGL uLCD(p28,p27,p30); +//Analog Out Jack +AnalogOut DACout(p18); +//On Board Speaker +//PwmOut PWMout(p23); +wave_player waver(&DACout); +Timer t; + +struct target { + bool dead; + int myX, myY; + bool wasVisible; +}; +float currScore; +float scores[9]; + + int main(void) { - while (1) { - keyboard.mediaControl(KEY_VOLUME_DOWN); - keyboard.printf("Hello World from Mbed\r\n"); - keyboard.keyCode('s', KEY_CTRL); - keyboard.keyCode(KEY_CAPS_LOCK); - wait(1); - leds = keyboard.lockStatus(); + //Start timer for seed value + t.start(); + uLCD.cls(); + uLCD.baudrate(3000000); + bool newGame; + int xloc, yloc, xold, yold, kills; + target myTargets[10]; + + + for(int i = 0; i < 10; i++){ + scores[i] = 999.99; + } + FILE *wfile; + + + + // Exit main menu on button press + uLCD.media_init(); + uLCD.set_sector_address(0x003B, 0x5001); + uLCD.display_image(0,0); + + wfile = fopen("/sd/intro.wav","r"); + waver.play(wfile); + fclose(wfile); + + uLCD.locate(0,10); + uLCD.printf("Button 1 to Start!"); + while(top){ + //reset high score list + if(!last) { + for(int i = 0; i < 10; i++){ + scores[i] = 999.99; + uLCD.locate(0,0); + uLCD.printf("High scores reset"); + } + } + } + t.stop(); + + + + //Main game loop + while(true) { + newGame = false; + + //Ready-set-go style countdown + uLCD.cls(); + uLCD.locate(4,4); + uLCD.printf("Get Ready!"); + wait(1); + uLCD.cls(); + uLCD.locate(8,4); + uLCD.printf("3"); + wfile = fopen("/sd/beep.wav","r"); + waver.play(wfile); + fclose(wfile); + uLCD.cls(); + uLCD.locate(8,4); + uLCD.printf("2"); + wfile = fopen("/sd/beep.wav","r"); + waver.play(wfile); + fclose(wfile); + uLCD.cls(); + uLCD.locate(8,4); + uLCD.printf("1"); + wfile = fopen("/sd/beep.wav","r"); + waver.play(wfile); + fclose(wfile); + uLCD.cls(); + uLCD.locate(7,4); + uLCD.printf("GO!"); + wfile = fopen("/sd/beephigh.wav","r"); + waver.play(wfile); + fclose(wfile); + uLCD.cls(); + + + xloc = 64; + yloc = 64; + xold = 0; + yold = 0; + kills = 0; + + + //Create targets, use time as seed + srand(t.read()); + + for (int i = 0; i < 10; i++) { + myTargets[i].myX = rand() % 128; + myTargets[i].myY = rand() % 128; + myTargets[i].dead = false; + myTargets[i].wasVisible = false; + } + + //Start score timer for game + t.reset(); + t.start(); + while (!newGame) { + //Redraw scope if moved + if (xloc != xold || yloc != yold) { + uLCD.filled_circle(xold, yold, 14, BLACK); + uLCD.filled_circle(xloc, yloc, 14, GREEN); + uLCD.filled_circle(xloc, yloc, 2, WHITE); + xold = xloc; + yold = yloc; + } + + //Check if targets are visible + for (int i = 0; i < 10; i++) { + if (myTargets[i].dead == true) { + continue; + } + + if (abs(myTargets[i].myX - xloc) < 16 && abs(myTargets[i].myY - yloc) < 16) { + uLCD.filled_circle(myTargets[i].myX, myTargets[i].myY, 10, RED); + myTargets[i].wasVisible = true; + } + else if (myTargets[i].wasVisible == true) { + myTargets[i].wasVisible = false; + uLCD.filled_circle(myTargets[i].myX, myTargets[i].myY, 10, BLACK); + uLCD.filled_circle(xloc, yloc, 14, GREEN); + uLCD.filled_circle(xloc, yloc, 2, WHITE); + } + } + + + //Check if shot hit + if (!top) { + wfile = fopen("/sd/newsilencer.wav","r"); + waver.play(wfile); + fclose(wfile); + for (int i = 0; i < 10; i++) { + if (myTargets[i].dead == true) + continue; + if (abs(myTargets[i].myX - xloc) < 8 && abs(myTargets[i].myY - yloc) < 8) { + uLCD.filled_circle(myTargets[i].myX, myTargets[i].myY, 10, BLACK); + uLCD.filled_circle(xloc, yloc, 14, GREEN); + uLCD.filled_circle(xloc, yloc, 2, WHITE); + myTargets[i].dead = true; + kills++; + uLCD.filled_circle(xloc, yloc, 2, 0xffa500);//orange + + + + } + } + } + + if (!up) { + yloc -= 6; + if (yloc < 6) + yloc = 6; + } + if (!down){ + yloc += 6; + if (yloc > 121) + yloc = 121; + } + if (!left) { + xloc -= 6; + if (xloc < 6) + xloc = 6; + } + if (!right) { + xloc += 6; + if (xloc > 121) + xloc = 121; + } + uLCD.locate(0,0); + uLCD.printf("Time: %0.2f", t.read()); + wait(.025); + //Win Screen + if (kills >= 10) { + t.stop(); + currScore = t.read() - .4; + uLCD.cls(); + + if(currScore < scores[0]){ + uLCD.locate(0,1); + uLCD.printf("NEW HIGH SCORE!!!"); + } + for(int i = 0; i < 9; i++){ + if(currScore < scores[i]) { + for(int j = 7; j >= i; j--){ + scores[j+1] = scores[j]; + } + scores[i] = currScore; + break; + } + + } + + uLCD.locate(0,3); + uLCD.printf("High Scores\n"); + uLCD.printf("-----------\n"); + for(int i = 0; i < 9; i++){ + uLCD.printf("%d. %6.2f\n", i+1, scores[i]); + } + //display score + uLCD.locate(0,0); + uLCD.printf("Final Score: %0.2f\n",currScore); + wfile = fopen("/sd/youwinshort.wav","r"); + waver.play(wfile); + fclose(wfile); + uLCD.filled_rectangle(0, 0, 128, 16, BLACK); + uLCD.locate(0,0); + uLCD.printf("New Game?"); + while (true) { + //Break and reset on button press + if (!top) { + newGame = true; + break; + } + + } + } + } } } \ No newline at end of file