Faizan and Pages fun little game

Dependencies:   4DGL-uLCD-SE mbed SDFileSystem wave_player

Committer:
kswanson31
Date:
Mon Oct 31 20:18:51 2016 +0000
Revision:
18:2e42ec5e2311
Parent:
17:95948ed73911
Added end of game screen, updated pause.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
fkhan39 0:de9ffb858be9 1 #include "mbed.h"
fkhan39 0:de9ffb858be9 2 #include "uLCD_4DGL.h"
kswanson31 16:702313ea97b9 3 //#include "SongPlayer.h"
kswanson31 16:702313ea97b9 4 #include "SDFileSystem.h"
kswanson31 16:702313ea97b9 5 #include "wave_player.h"
kswanson31 9:f2ee3ef97af1 6 #include "NavSwitch.h"
fkhan39 0:de9ffb858be9 7 #include "food.h"
fkhan39 0:de9ffb858be9 8 #include "stack.h"
fkhan39 1:9eeeb0d8f036 9 #include <ctime>
fkhan39 1:9eeeb0d8f036 10 #include <cstdlib>
fkhan39 3:058e10b8ecf6 11 #include <cmath>
fkhan39 2:4c5f409d6bb8 12 #include <vector>
fkhan39 0:de9ffb858be9 13
fkhan39 0:de9ffb858be9 14 #define BREAD 1
fkhan39 0:de9ffb858be9 15 #define LETTUCE 2
fkhan39 0:de9ffb858be9 16 #define CHEESE 3
fkhan39 0:de9ffb858be9 17 #define TOMATO 4
fkhan39 0:de9ffb858be9 18 #define BADLETTUCE 5
fkhan39 0:de9ffb858be9 19 #define BADCHEESE 6
fkhan39 0:de9ffb858be9 20 #define BADTOMATO 7
fkhan39 0:de9ffb858be9 21
fkhan39 8:b2df3588d8e0 22 #define MAROON 0x8b0000
fkhan39 8:b2df3588d8e0 23 #define DARKBROWN 0x654321
fkhan39 8:b2df3588d8e0 24 #define YELLOW 0xffff00
fkhan39 8:b2df3588d8e0 25 #define PURPLE 0x551a8b
fkhan39 8:b2df3588d8e0 26 #define BROWN 0xf4a460
fkhan39 8:b2df3588d8e0 27
fkhan39 0:de9ffb858be9 28 uLCD_4DGL lcd(p9,p10,p11);
kswanson31 16:702313ea97b9 29 SDFileSystem sd(p5, p6, p7, p8, "sd"); //SD card
kswanson31 16:702313ea97b9 30 AnalogOut DACout(p18);
kswanson31 16:702313ea97b9 31 wave_player waver(&DACout);
kswanson31 16:702313ea97b9 32 Nav_Switch joystick(p20, p19, p17, p16, p15); // pin order on Sparkfun breakout
kswanson31 15:b18537055368 33 DigitalIn speed(p21);
kswanson31 15:b18537055368 34 DigitalIn pause(p22);
kswanson31 15:b18537055368 35
fkhan39 1:9eeeb0d8f036 36 vector<Food> foods;
fkhan39 3:058e10b8ecf6 37 Food * collided;
fkhan39 3:058e10b8ecf6 38
fkhan39 3:058e10b8ecf6 39 using namespace std;
fkhan39 1:9eeeb0d8f036 40 Stack sandwich(64,&lcd);
fkhan39 2:4c5f409d6bb8 41 int score, lives;
fkhan39 2:4c5f409d6bb8 42 float clk, clk2;
fkhan39 2:4c5f409d6bb8 43 Timer t;
fkhan39 3:058e10b8ecf6 44 int indexToRemove;
fkhan39 2:4c5f409d6bb8 45
fkhan39 2:4c5f409d6bb8 46 bool collisionCheck();
kswanson31 5:d832d2d67411 47 void updateScore(int);
kswanson31 5:d832d2d67411 48 void drawLives();
fkhan39 0:de9ffb858be9 49
fkhan39 0:de9ffb858be9 50 int main() {
kswanson31 15:b18537055368 51 speed.mode(PullUp);
kswanson31 15:b18537055368 52 pause.mode(PullUp);
kswanson31 15:b18537055368 53
kswanson31 15:b18537055368 54 // splash sequence
kswanson31 15:b18537055368 55 lcd.filled_rectangle(34, 18, 44, 19, BROWN);
kswanson31 15:b18537055368 56 lcd.filled_rectangle(30, 22, 50, 20, BROWN); // top bun
kswanson31 15:b18537055368 57 lcd.filled_rectangle(34, 38, 44, 42, YELLOW); // cheese
kswanson31 15:b18537055368 58 lcd.filled_rectangle(34, 56, 44, 60, GREEN); // lettuce
kswanson31 15:b18537055368 59 lcd.filled_rectangle(34, 74, 44, 78, RED); // tomato
kswanson31 15:b18537055368 60 lcd.filled_rectangle(30, 94, 50, 96, BROWN); // bottom bun
kswanson31 15:b18537055368 61 lcd.filled_rectangle(34, 98, 44, 97, BROWN);
kswanson31 16:702313ea97b9 62
kswanson31 16:702313ea97b9 63 FILE *wave_file;
kswanson31 16:702313ea97b9 64 wave_file=fopen("/sd/start.wav","r");
kswanson31 16:702313ea97b9 65 waver.play(wave_file);
kswanson31 16:702313ea97b9 66 fclose(wave_file);
kswanson31 16:702313ea97b9 67
kswanson31 15:b18537055368 68 lcd.text_string("bun", 11, 3, FONT_7X8, WHITE);
kswanson31 15:b18537055368 69 wait(1);
kswanson31 15:b18537055368 70 lcd.text_string("cheese", 11, 5, FONT_7X8, WHITE);
kswanson31 15:b18537055368 71 wait(1);
kswanson31 15:b18537055368 72 lcd.text_string("lettuce", 11, 7, FONT_7X8, WHITE);
kswanson31 15:b18537055368 73 wait(1);
kswanson31 15:b18537055368 74 lcd.text_string("tomato", 11, 9, FONT_7X8, WHITE);
kswanson31 15:b18537055368 75 wait(1);
kswanson31 15:b18537055368 76 lcd.text_string("bun", 11, 11, FONT_7X8, WHITE);
kswanson31 15:b18537055368 77 wait(4);
kswanson31 15:b18537055368 78 lcd.cls();
kswanson31 15:b18537055368 79
kswanson31 15:b18537055368 80 lcd.filled_rectangle(34, 38, 44, 42, MAROON); // bad foods
kswanson31 15:b18537055368 81 lcd.filled_rectangle(34, 56, 44, 60, DARKBROWN);
kswanson31 15:b18537055368 82 lcd.filled_rectangle(34, 74, 44, 78, PURPLE);
kswanson31 15:b18537055368 83 wait(2);
kswanson31 15:b18537055368 84 lcd.text_string("GROSS!", 11, 7, FONT_7X8, WHITE);
kswanson31 15:b18537055368 85 wait(2);
kswanson31 15:b18537055368 86 lcd.cls();
fkhan39 0:de9ffb858be9 87
fkhan39 1:9eeeb0d8f036 88 score = 0;
fkhan39 2:4c5f409d6bb8 89 lives = 3;
fkhan39 2:4c5f409d6bb8 90 t.start();
fkhan39 1:9eeeb0d8f036 91 srand(time(NULL));
fkhan39 2:4c5f409d6bb8 92 clk = clk2 = 0;
fkhan39 4:c00da0b158c4 93 sandwich.draw();
fkhan39 1:9eeeb0d8f036 94
kswanson31 5:d832d2d67411 95 lcd.line(108, 1, 108, 128, WHITE);
kswanson31 5:d832d2d67411 96
kswanson31 5:d832d2d67411 97 // inital lives
kswanson31 5:d832d2d67411 98 lcd.filled_circle(118, 80, 3, YELLOW); // x, y, radius, color
kswanson31 5:d832d2d67411 99 lcd.filled_circle(118, 90, 3, YELLOW);
kswanson31 5:d832d2d67411 100 lcd.filled_circle(118, 100, 3, YELLOW);
fkhan39 1:9eeeb0d8f036 101
fkhan39 8:b2df3588d8e0 102 updateScore(0);
fkhan39 8:b2df3588d8e0 103
fkhan39 2:4c5f409d6bb8 104 while(lives) {
kswanson31 17:95948ed73911 105 if (!pause) { // pause game
kswanson31 17:95948ed73911 106 lcd.text_string("PAUSED", 6, 7, FONT_7X8, WHITE);
kswanson31 17:95948ed73911 107 int paused = 1;
kswanson31 17:95948ed73911 108 while (paused) {
kswanson31 17:95948ed73911 109 wait(.2);
kswanson31 17:95948ed73911 110 paused = pause;
kswanson31 17:95948ed73911 111 }
kswanson31 17:95948ed73911 112 lcd.text_string("PAUSED", 6, 7, FONT_7X8, BLACK);
kswanson31 17:95948ed73911 113 }
kswanson31 17:95948ed73911 114
kswanson31 17:95948ed73911 115 if (joystick.up()) {
fkhan39 1:9eeeb0d8f036 116 sandwich.move(-1);
kswanson31 17:95948ed73911 117 } else if (joystick.down()) {
kswanson31 13:a8eaced521a3 118 sandwich.move(+1);
fkhan39 1:9eeeb0d8f036 119 }
fkhan39 1:9eeeb0d8f036 120 if (collisionCheck()) {
fkhan39 3:058e10b8ecf6 121 collided->erase();
fkhan39 3:058e10b8ecf6 122 if (collided->isBad) {
fkhan39 3:058e10b8ecf6 123 lives--;
kswanson31 14:e51c9827f788 124 drawLives();
fkhan39 3:058e10b8ecf6 125 // make a noise!1111
fkhan39 3:058e10b8ecf6 126 } else if (collided->typeOfFood == BREAD) {
fkhan39 3:058e10b8ecf6 127 // updateScore(sandwich.size()); // add the points to the overall score
fkhan39 3:058e10b8ecf6 128 sandwich.clear(); // should redraw
fkhan39 3:058e10b8ecf6 129 // make a noise!!11
fkhan39 3:058e10b8ecf6 130 } else {
fkhan39 3:058e10b8ecf6 131 // remove from falling object list, erase
fkhan39 3:058e10b8ecf6 132 foods.erase(foods.begin() + indexToRemove);
fkhan39 3:058e10b8ecf6 133 sandwich.add(collided);
fkhan39 3:058e10b8ecf6 134 }
fkhan39 1:9eeeb0d8f036 135 }
fkhan39 1:9eeeb0d8f036 136 // every 3 seconds add new food! use timer.
fkhan39 2:4c5f409d6bb8 137 float curr = t.read();
fkhan39 11:4c91567fc089 138 if (curr - clk >= 5.0) {
fkhan39 2:4c5f409d6bb8 139 clk = curr;
fkhan39 2:4c5f409d6bb8 140 // lcd.printf(" new ");
fkhan39 8:b2df3588d8e0 141 int x = rand()%90+1;
fkhan39 2:4c5f409d6bb8 142 int type = rand()%7+1;
fkhan39 2:4c5f409d6bb8 143 Food item(type, x, &lcd);
fkhan39 2:4c5f409d6bb8 144 foods.push_back(item);
fkhan39 2:4c5f409d6bb8 145 // add new food
fkhan39 2:4c5f409d6bb8 146 }
fkhan39 1:9eeeb0d8f036 147 // every .2 second each food should fall a lil bit! use timer.
fkhan39 11:4c91567fc089 148 if (curr - clk2 >= 0.1) {
fkhan39 2:4c5f409d6bb8 149 clk2 = curr;
fkhan39 2:4c5f409d6bb8 150 // lcd.printf(" fall ");
fkhan39 2:4c5f409d6bb8 151 for (int i = 0; i < foods.size(); i++) {
fkhan39 2:4c5f409d6bb8 152 Food * f = &foods[i];
fkhan39 2:4c5f409d6bb8 153 f->fall();
fkhan39 2:4c5f409d6bb8 154 }
fkhan39 2:4c5f409d6bb8 155 // each food should fall a lil bit!
fkhan39 2:4c5f409d6bb8 156 }
fkhan39 0:de9ffb858be9 157 }
fkhan39 2:4c5f409d6bb8 158
kswanson31 18:2e42ec5e2311 159 lcd.cls();
kswanson31 18:2e42ec5e2311 160
kswanson31 18:2e42ec5e2311 161 char message[20];
kswanson31 18:2e42ec5e2311 162 sprintf(message, "Your score? %d", score);
kswanson31 18:2e42ec5e2311 163 while (true) { // end game
kswanson31 18:2e42ec5e2311 164 lcd.text_string(message, 1, 7, FONT_7X8, WHITE);
kswanson31 18:2e42ec5e2311 165 wait(0.7);
kswanson31 18:2e42ec5e2311 166 lcd.text_string(message, 1, 7, FONT_7X8, BLACK);
kswanson31 18:2e42ec5e2311 167 wait(0.4);
kswanson31 18:2e42ec5e2311 168 }
fkhan39 0:de9ffb858be9 169 }
fkhan39 1:9eeeb0d8f036 170
fkhan39 1:9eeeb0d8f036 171 bool collisionCheck() {
fkhan39 3:058e10b8ecf6 172 if (!foods.empty()) {
fkhan39 3:058e10b8ecf6 173 Food * f = &foods.front();
fkhan39 3:058e10b8ecf6 174 if (f->y > 128) foods.erase(foods.begin()); // removed if offscreen!
fkhan39 3:058e10b8ecf6 175 }
fkhan39 3:058e10b8ecf6 176 for (int i = 0; i < foods.size(); i++) {
fkhan39 3:058e10b8ecf6 177 if (foods[i].y + 6 == sandwich.top) {
fkhan39 3:058e10b8ecf6 178 if (abs(foods[i].x - sandwich.x) < 8) {
fkhan39 3:058e10b8ecf6 179 collided = &foods[i];
fkhan39 3:058e10b8ecf6 180 indexToRemove = i;
fkhan39 3:058e10b8ecf6 181 return true;
fkhan39 3:058e10b8ecf6 182 } else break;
fkhan39 3:058e10b8ecf6 183 }
fkhan39 3:058e10b8ecf6 184 }
fkhan39 3:058e10b8ecf6 185 return false;
fkhan39 1:9eeeb0d8f036 186 // find foods that have an (x,y) that is within the range of the top of the stack
fkhan39 1:9eeeb0d8f036 187 // if nothing found w/i the range
fkhan39 1:9eeeb0d8f036 188 // return false
fkhan39 1:9eeeb0d8f036 189 // if something found
fkhan39 1:9eeeb0d8f036 190 // collidedFood = that food item
fkhan39 1:9eeeb0d8f036 191 // return true
fkhan39 2:4c5f409d6bb8 192 }
fkhan39 1:9eeeb0d8f036 193
kswanson31 5:d832d2d67411 194 void updateScore(int sandwichSize) {
kswanson31 5:d832d2d67411 195 char scoreString[2]; // max 2-digit score
kswanson31 9:f2ee3ef97af1 196
kswanson31 16:702313ea97b9 197 FILE *wave_file;
kswanson31 16:702313ea97b9 198 wave_file=fopen("/sd/score.wav","r");
kswanson31 16:702313ea97b9 199 waver.play(wave_file);
kswanson31 16:702313ea97b9 200 fclose(wave_file);
kswanson31 16:702313ea97b9 201
kswanson31 5:d832d2d67411 202 score += sandwichSize;
kswanson31 5:d832d2d67411 203 score = (score > 99) ? score - 100 : score; // score rollover
kswanson31 5:d832d2d67411 204 sprintf(scoreString, "%d", score); // keep score as a char string
kswanson31 5:d832d2d67411 205 lcd.text_string(scoreString, 16, 1, FONT_7X8, WHITE); // 16 chars over, 1 down
kswanson31 5:d832d2d67411 206 }
kswanson31 5:d832d2d67411 207
kswanson31 5:d832d2d67411 208 void drawLives() {
kswanson31 16:702313ea97b9 209
kswanson31 16:702313ea97b9 210 FILE *wave_file;
kswanson31 16:702313ea97b9 211 wave_file=fopen("/sd/life.wav","r");
kswanson31 16:702313ea97b9 212 waver.play(wave_file);
kswanson31 16:702313ea97b9 213 fclose(wave_file);
kswanson31 9:f2ee3ef97af1 214
kswanson31 15:b18537055368 215 if (lives == 2) {
kswanson31 18:2e42ec5e2311 216 lcd.filled_circle(118, 80, 3, BLACK); // erase the life symbol
kswanson31 5:d832d2d67411 217 }
kswanson31 15:b18537055368 218 else if (lives == 1) {
kswanson31 18:2e42ec5e2311 219 lcd.filled_circle(118, 90, 3, BLACK);
kswanson31 5:d832d2d67411 220 }
kswanson31 15:b18537055368 221 else if (lives == 0) {
kswanson31 18:2e42ec5e2311 222 lcd.filled_circle(118, 100, 3, BLACK);
kswanson31 5:d832d2d67411 223 }
kswanson31 5:d832d2d67411 224 }