Faizan and Pages fun little game

Dependencies:   4DGL-uLCD-SE mbed SDFileSystem wave_player

Committer:
fkhan39
Date:
Mon Oct 31 04:54:56 2016 +0000
Revision:
11:4c91567fc089
Parent:
10:75e221ead102
Child:
12:3053789a2140
clk;

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 9:f2ee3ef97af1 3 #include "SongPlayer.h"
kswanson31 9:f2ee3ef97af1 4 #include "NavSwitch.h"
fkhan39 0:de9ffb858be9 5 #include "food.h"
fkhan39 0:de9ffb858be9 6 #include "stack.h"
fkhan39 1:9eeeb0d8f036 7 #include <ctime>
fkhan39 1:9eeeb0d8f036 8 #include <cstdlib>
fkhan39 3:058e10b8ecf6 9 #include <cmath>
fkhan39 2:4c5f409d6bb8 10 #include <vector>
fkhan39 0:de9ffb858be9 11
fkhan39 0:de9ffb858be9 12 #define BREAD 1
fkhan39 0:de9ffb858be9 13 #define LETTUCE 2
fkhan39 0:de9ffb858be9 14 #define CHEESE 3
fkhan39 0:de9ffb858be9 15 #define TOMATO 4
fkhan39 0:de9ffb858be9 16 #define BADLETTUCE 5
fkhan39 0:de9ffb858be9 17 #define BADCHEESE 6
fkhan39 0:de9ffb858be9 18 #define BADTOMATO 7
fkhan39 0:de9ffb858be9 19
fkhan39 8:b2df3588d8e0 20 #define MAROON 0x8b0000
fkhan39 8:b2df3588d8e0 21 #define DARKBROWN 0x654321
fkhan39 8:b2df3588d8e0 22 #define YELLOW 0xffff00
fkhan39 8:b2df3588d8e0 23 #define PURPLE 0x551a8b
fkhan39 8:b2df3588d8e0 24 #define BROWN 0xf4a460
fkhan39 8:b2df3588d8e0 25
fkhan39 0:de9ffb858be9 26 uLCD_4DGL lcd(p9,p10,p11);
kswanson31 9:f2ee3ef97af1 27 SongPlayer speaker(p26);
kswanson31 10:75e221ead102 28 Nav_Switch joystick(p20, p19, p18, p17, p16); // pin order on Sparkfun breakout
fkhan39 1:9eeeb0d8f036 29 vector<Food> foods;
fkhan39 3:058e10b8ecf6 30 Food * collided;
fkhan39 3:058e10b8ecf6 31
fkhan39 3:058e10b8ecf6 32 using namespace std;
fkhan39 1:9eeeb0d8f036 33 Stack sandwich(64,&lcd);
kswanson31 10:75e221ead102 34 //DigitalIn right(p21);
kswanson31 10:75e221ead102 35 //DigitalIn left(p22);
fkhan39 2:4c5f409d6bb8 36 int score, lives;
fkhan39 2:4c5f409d6bb8 37 float clk, clk2;
fkhan39 2:4c5f409d6bb8 38 Timer t;
fkhan39 3:058e10b8ecf6 39 int indexToRemove;
fkhan39 2:4c5f409d6bb8 40
fkhan39 2:4c5f409d6bb8 41 bool collisionCheck();
kswanson31 5:d832d2d67411 42 void updateScore(int);
kswanson31 5:d832d2d67411 43 void drawLives();
fkhan39 0:de9ffb858be9 44
fkhan39 0:de9ffb858be9 45 int main() {
fkhan39 0:de9ffb858be9 46
fkhan39 1:9eeeb0d8f036 47 score = 0;
fkhan39 2:4c5f409d6bb8 48 lives = 3;
kswanson31 10:75e221ead102 49 // left.mode(PullUp);
kswanson31 10:75e221ead102 50 // right.mode(PullUp);
fkhan39 2:4c5f409d6bb8 51 t.start();
fkhan39 1:9eeeb0d8f036 52 srand(time(NULL));
fkhan39 2:4c5f409d6bb8 53 clk = clk2 = 0;
fkhan39 4:c00da0b158c4 54 sandwich.draw();
fkhan39 1:9eeeb0d8f036 55
kswanson31 5:d832d2d67411 56 lcd.line(108, 1, 108, 128, WHITE);
kswanson31 5:d832d2d67411 57
kswanson31 5:d832d2d67411 58 // inital lives
kswanson31 5:d832d2d67411 59 lcd.filled_circle(118, 80, 3, YELLOW); // x, y, radius, color
kswanson31 5:d832d2d67411 60 lcd.filled_circle(118, 90, 3, YELLOW);
kswanson31 5:d832d2d67411 61 lcd.filled_circle(118, 100, 3, YELLOW);
fkhan39 1:9eeeb0d8f036 62
fkhan39 8:b2df3588d8e0 63 updateScore(0);
fkhan39 8:b2df3588d8e0 64
fkhan39 2:4c5f409d6bb8 65 while(lives) {
kswanson31 10:75e221ead102 66 if (joystick.up()) {
fkhan39 1:9eeeb0d8f036 67 sandwich.move(-1);
kswanson31 10:75e221ead102 68 } else if (joystick.down()) {
fkhan39 1:9eeeb0d8f036 69 sandwich.move(+1);
fkhan39 1:9eeeb0d8f036 70 }
fkhan39 1:9eeeb0d8f036 71 if (collisionCheck()) {
fkhan39 3:058e10b8ecf6 72 collided->erase();
fkhan39 3:058e10b8ecf6 73 if (collided->isBad) {
fkhan39 3:058e10b8ecf6 74 lives--;
fkhan39 3:058e10b8ecf6 75 // lifeLost()
fkhan39 3:058e10b8ecf6 76 // make a noise!1111
fkhan39 3:058e10b8ecf6 77 } else if (collided->typeOfFood == BREAD) {
fkhan39 3:058e10b8ecf6 78 // updateScore(sandwich.size()); // add the points to the overall score
fkhan39 3:058e10b8ecf6 79 sandwich.clear(); // should redraw
fkhan39 3:058e10b8ecf6 80 // make a noise!!11
fkhan39 3:058e10b8ecf6 81 } else {
fkhan39 3:058e10b8ecf6 82 // remove from falling object list, erase
fkhan39 3:058e10b8ecf6 83 foods.erase(foods.begin() + indexToRemove);
fkhan39 3:058e10b8ecf6 84 sandwich.add(collided);
fkhan39 3:058e10b8ecf6 85 }
fkhan39 1:9eeeb0d8f036 86 }
fkhan39 1:9eeeb0d8f036 87 // every 3 seconds add new food! use timer.
fkhan39 2:4c5f409d6bb8 88 float curr = t.read();
fkhan39 11:4c91567fc089 89 if (curr - clk >= 5.0) {
fkhan39 2:4c5f409d6bb8 90 clk = curr;
fkhan39 2:4c5f409d6bb8 91 // lcd.printf(" new ");
fkhan39 8:b2df3588d8e0 92 int x = rand()%90+1;
fkhan39 2:4c5f409d6bb8 93 int type = rand()%7+1;
fkhan39 2:4c5f409d6bb8 94 Food item(type, x, &lcd);
fkhan39 2:4c5f409d6bb8 95 foods.push_back(item);
fkhan39 2:4c5f409d6bb8 96 // add new food
fkhan39 2:4c5f409d6bb8 97 }
fkhan39 1:9eeeb0d8f036 98 // every .2 second each food should fall a lil bit! use timer.
fkhan39 11:4c91567fc089 99 if (curr - clk2 >= 0.1) {
fkhan39 2:4c5f409d6bb8 100 clk2 = curr;
fkhan39 2:4c5f409d6bb8 101 // lcd.printf(" fall ");
fkhan39 2:4c5f409d6bb8 102 for (int i = 0; i < foods.size(); i++) {
fkhan39 2:4c5f409d6bb8 103 Food * f = &foods[i];
fkhan39 2:4c5f409d6bb8 104 f->fall();
fkhan39 2:4c5f409d6bb8 105 }
fkhan39 2:4c5f409d6bb8 106 // each food should fall a lil bit!
fkhan39 2:4c5f409d6bb8 107 }
fkhan39 0:de9ffb858be9 108 }
fkhan39 2:4c5f409d6bb8 109
fkhan39 2:4c5f409d6bb8 110 lcd.printf("Your score is: %i", score);
fkhan39 0:de9ffb858be9 111 }
fkhan39 1:9eeeb0d8f036 112
fkhan39 1:9eeeb0d8f036 113 bool collisionCheck() {
fkhan39 3:058e10b8ecf6 114 if (!foods.empty()) {
fkhan39 3:058e10b8ecf6 115 Food * f = &foods.front();
fkhan39 3:058e10b8ecf6 116 if (f->y > 128) foods.erase(foods.begin()); // removed if offscreen!
fkhan39 3:058e10b8ecf6 117 }
fkhan39 3:058e10b8ecf6 118 for (int i = 0; i < foods.size(); i++) {
fkhan39 3:058e10b8ecf6 119 if (foods[i].y + 6 == sandwich.top) {
fkhan39 3:058e10b8ecf6 120 if (abs(foods[i].x - sandwich.x) < 8) {
fkhan39 3:058e10b8ecf6 121 collided = &foods[i];
fkhan39 3:058e10b8ecf6 122 indexToRemove = i;
fkhan39 3:058e10b8ecf6 123 return true;
fkhan39 3:058e10b8ecf6 124 } else break;
fkhan39 3:058e10b8ecf6 125 }
fkhan39 3:058e10b8ecf6 126 }
fkhan39 3:058e10b8ecf6 127 return false;
fkhan39 1:9eeeb0d8f036 128 // find foods that have an (x,y) that is within the range of the top of the stack
fkhan39 1:9eeeb0d8f036 129 // if nothing found w/i the range
fkhan39 1:9eeeb0d8f036 130 // return false
fkhan39 1:9eeeb0d8f036 131 // if something found
fkhan39 1:9eeeb0d8f036 132 // collidedFood = that food item
fkhan39 1:9eeeb0d8f036 133 // return true
fkhan39 2:4c5f409d6bb8 134 }
fkhan39 1:9eeeb0d8f036 135
kswanson31 5:d832d2d67411 136 void updateScore(int sandwichSize) {
kswanson31 5:d832d2d67411 137 char scoreString[2]; // max 2-digit score
kswanson31 9:f2ee3ef97af1 138 // C#, D#, F, A, D, E, F#, A#, _, A, Bb, B, C
kswanson31 9:f2ee3ef97af1 139 float notes[14] = {554.4, 622.3, 698.5, 880, 587.3, 659.3, 740, 932.3, 0, 440, 466.2, 493.9, 523.3, 0};
kswanson31 9:f2ee3ef97af1 140 float times[14] = {0.24, 0.24, 0.24, 0.24, 0.24, 0.24, 0.24, 0.24, 0.48, 0.48, 0.48, 0.48, 0.48, 0};
kswanson31 9:f2ee3ef97af1 141
kswanson31 9:f2ee3ef97af1 142 speaker.PlaySong(notes, times);
kswanson31 5:d832d2d67411 143 score += sandwichSize;
kswanson31 5:d832d2d67411 144 score = (score > 99) ? score - 100 : score; // score rollover
kswanson31 5:d832d2d67411 145 sprintf(scoreString, "%d", score); // keep score as a char string
kswanson31 5:d832d2d67411 146 lcd.text_string(scoreString, 16, 1, FONT_7X8, WHITE); // 16 chars over, 1 down
kswanson31 5:d832d2d67411 147 }
kswanson31 5:d832d2d67411 148
kswanson31 5:d832d2d67411 149 void drawLives() {
kswanson31 9:f2ee3ef97af1 150 // G, D, _, D, D, C, B, G, E, _, E, C, _
kswanson31 9:f2ee3ef97af1 151 float notes[13] = {195.9, 293.6, 0, 293.6, 293.6, 261.6, 246.9, 195.9, 164.8, 0, 164.8, 130.8, 0};
kswanson31 9:f2ee3ef97af1 152 float times[13] = {0.24, 0.24, 0.24, 0.24, 0.32, 0.32, 0.32, 0.24, 0.24, 0.24, 0.24, 0.24, 0};
kswanson31 9:f2ee3ef97af1 153
kswanson31 9:f2ee3ef97af1 154 speaker.PlaySong(notes, times);
kswanson31 9:f2ee3ef97af1 155
kswanson31 5:d832d2d67411 156 if (lives < 3) {
kswanson31 5:d832d2d67411 157 lcd.filled_circle(118, 100, 3, BLACK); // erase the life symbol
kswanson31 5:d832d2d67411 158 }
kswanson31 5:d832d2d67411 159 else if (lives < 2) {
kswanson31 5:d832d2d67411 160 lcd.filled_circle(118, 108, 3, BLACK);
kswanson31 5:d832d2d67411 161 }
kswanson31 5:d832d2d67411 162 else if (lives < 1) {
kswanson31 5:d832d2d67411 163 lcd.filled_circle(118, 116, 3, BLACK);
kswanson31 5:d832d2d67411 164 }
kswanson31 5:d832d2d67411 165 }