Faizan and Pages fun little game

Dependencies:   4DGL-uLCD-SE mbed SDFileSystem wave_player

Committer:
fkhan39
Date:
Mon Oct 31 04:05:14 2016 +0000
Revision:
7:7cbff8cf583b
Parent:
5:d832d2d67411
stack;

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"
fkhan39 0:de9ffb858be9 3 #include "food.h"
fkhan39 0:de9ffb858be9 4 #include "stack.h"
fkhan39 1:9eeeb0d8f036 5 #include <ctime>
fkhan39 1:9eeeb0d8f036 6 #include <cstdlib>
fkhan39 3:058e10b8ecf6 7 #include <cmath>
fkhan39 2:4c5f409d6bb8 8 #include <vector>
fkhan39 0:de9ffb858be9 9
fkhan39 0:de9ffb858be9 10 #define BREAD 1
fkhan39 0:de9ffb858be9 11 #define LETTUCE 2
fkhan39 0:de9ffb858be9 12 #define CHEESE 3
fkhan39 0:de9ffb858be9 13 #define TOMATO 4
fkhan39 0:de9ffb858be9 14 #define BADLETTUCE 5
fkhan39 0:de9ffb858be9 15 #define BADCHEESE 6
fkhan39 0:de9ffb858be9 16 #define BADTOMATO 7
fkhan39 0:de9ffb858be9 17
fkhan39 0:de9ffb858be9 18 uLCD_4DGL lcd(p9,p10,p11);
fkhan39 1:9eeeb0d8f036 19 vector<Food> foods;
fkhan39 3:058e10b8ecf6 20 Food * collided;
fkhan39 3:058e10b8ecf6 21
fkhan39 3:058e10b8ecf6 22 using namespace std;
fkhan39 1:9eeeb0d8f036 23 Stack sandwich(64,&lcd);
fkhan39 7:7cbff8cf583b 24 DigitalIn right(p21);
fkhan39 7:7cbff8cf583b 25 DigitalIn left(p22);
fkhan39 2:4c5f409d6bb8 26 int score, lives;
fkhan39 2:4c5f409d6bb8 27 float clk, clk2;
fkhan39 2:4c5f409d6bb8 28 Timer t;
fkhan39 3:058e10b8ecf6 29 int indexToRemove;
fkhan39 2:4c5f409d6bb8 30
fkhan39 2:4c5f409d6bb8 31 bool collisionCheck();
kswanson31 5:d832d2d67411 32 void updateScore(int);
kswanson31 5:d832d2d67411 33 void drawLives();
fkhan39 0:de9ffb858be9 34
fkhan39 0:de9ffb858be9 35 int main() {
fkhan39 0:de9ffb858be9 36
fkhan39 1:9eeeb0d8f036 37 score = 0;
fkhan39 2:4c5f409d6bb8 38 lives = 3;
fkhan39 1:9eeeb0d8f036 39 left.mode(PullUp);
fkhan39 1:9eeeb0d8f036 40 right.mode(PullUp);
fkhan39 2:4c5f409d6bb8 41 t.start();
fkhan39 1:9eeeb0d8f036 42 srand(time(NULL));
fkhan39 2:4c5f409d6bb8 43 clk = clk2 = 0;
fkhan39 4:c00da0b158c4 44 sandwich.draw();
fkhan39 1:9eeeb0d8f036 45
kswanson31 5:d832d2d67411 46 lcd.line(108, 1, 108, 128, WHITE);
kswanson31 5:d832d2d67411 47
kswanson31 5:d832d2d67411 48 // inital lives
kswanson31 5:d832d2d67411 49 lcd.filled_circle(118, 80, 3, YELLOW); // x, y, radius, color
kswanson31 5:d832d2d67411 50 lcd.filled_circle(118, 90, 3, YELLOW);
kswanson31 5:d832d2d67411 51 lcd.filled_circle(118, 100, 3, YELLOW);
fkhan39 1:9eeeb0d8f036 52
fkhan39 7:7cbff8cf583b 53 updateScore(0);
fkhan39 7:7cbff8cf583b 54
fkhan39 2:4c5f409d6bb8 55 while(lives) {
fkhan39 1:9eeeb0d8f036 56 if (!left) {
fkhan39 1:9eeeb0d8f036 57 sandwich.move(-1);
fkhan39 2:4c5f409d6bb8 58 } else if (!right) {
fkhan39 1:9eeeb0d8f036 59 sandwich.move(+1);
fkhan39 1:9eeeb0d8f036 60 }
fkhan39 1:9eeeb0d8f036 61 if (collisionCheck()) {
fkhan39 3:058e10b8ecf6 62 collided->erase();
fkhan39 3:058e10b8ecf6 63 if (collided->isBad) {
fkhan39 3:058e10b8ecf6 64 lives--;
fkhan39 7:7cbff8cf583b 65 drawLives();
fkhan39 3:058e10b8ecf6 66 // make a noise!1111
fkhan39 3:058e10b8ecf6 67 } else if (collided->typeOfFood == BREAD) {
fkhan39 7:7cbff8cf583b 68 updateScore(sandwich.size()); // add the points to the overall score
fkhan39 3:058e10b8ecf6 69 sandwich.clear(); // should redraw
fkhan39 3:058e10b8ecf6 70 // make a noise!!11
fkhan39 3:058e10b8ecf6 71 } else {
fkhan39 3:058e10b8ecf6 72 // remove from falling object list, erase
fkhan39 3:058e10b8ecf6 73 foods.erase(foods.begin() + indexToRemove);
fkhan39 3:058e10b8ecf6 74 sandwich.add(collided);
fkhan39 3:058e10b8ecf6 75 }
fkhan39 1:9eeeb0d8f036 76 }
fkhan39 1:9eeeb0d8f036 77 // every 3 seconds add new food! use timer.
fkhan39 2:4c5f409d6bb8 78 float curr = t.read();
fkhan39 7:7cbff8cf583b 79 if (curr - clk >= 5.0) {
fkhan39 2:4c5f409d6bb8 80 clk = curr;
fkhan39 2:4c5f409d6bb8 81 // lcd.printf(" new ");
fkhan39 7:7cbff8cf583b 82 int x = rand()%90+1;
fkhan39 2:4c5f409d6bb8 83 int type = rand()%7+1;
fkhan39 2:4c5f409d6bb8 84 Food item(type, x, &lcd);
fkhan39 2:4c5f409d6bb8 85 foods.push_back(item);
fkhan39 2:4c5f409d6bb8 86 // add new food
fkhan39 2:4c5f409d6bb8 87 }
fkhan39 1:9eeeb0d8f036 88 // every .2 second each food should fall a lil bit! use timer.
fkhan39 7:7cbff8cf583b 89 if (curr - clk2 >= 0.1) {
fkhan39 2:4c5f409d6bb8 90 clk2 = curr;
fkhan39 2:4c5f409d6bb8 91 // lcd.printf(" fall ");
fkhan39 2:4c5f409d6bb8 92 for (int i = 0; i < foods.size(); i++) {
fkhan39 2:4c5f409d6bb8 93 Food * f = &foods[i];
fkhan39 2:4c5f409d6bb8 94 f->fall();
fkhan39 2:4c5f409d6bb8 95 }
fkhan39 2:4c5f409d6bb8 96 // each food should fall a lil bit!
fkhan39 2:4c5f409d6bb8 97 }
fkhan39 0:de9ffb858be9 98 }
fkhan39 7:7cbff8cf583b 99 lcd.cls();
fkhan39 2:4c5f409d6bb8 100 lcd.printf("Your score is: %i", score);
fkhan39 0:de9ffb858be9 101 }
fkhan39 1:9eeeb0d8f036 102
fkhan39 1:9eeeb0d8f036 103 bool collisionCheck() {
fkhan39 3:058e10b8ecf6 104 if (!foods.empty()) {
fkhan39 3:058e10b8ecf6 105 Food * f = &foods.front();
fkhan39 3:058e10b8ecf6 106 if (f->y > 128) foods.erase(foods.begin()); // removed if offscreen!
fkhan39 3:058e10b8ecf6 107 }
fkhan39 3:058e10b8ecf6 108 for (int i = 0; i < foods.size(); i++) {
fkhan39 3:058e10b8ecf6 109 if (foods[i].y + 6 == sandwich.top) {
fkhan39 3:058e10b8ecf6 110 if (abs(foods[i].x - sandwich.x) < 8) {
fkhan39 3:058e10b8ecf6 111 collided = &foods[i];
fkhan39 3:058e10b8ecf6 112 indexToRemove = i;
fkhan39 3:058e10b8ecf6 113 return true;
fkhan39 3:058e10b8ecf6 114 } else break;
fkhan39 3:058e10b8ecf6 115 }
fkhan39 3:058e10b8ecf6 116 }
fkhan39 3:058e10b8ecf6 117 return false;
fkhan39 1:9eeeb0d8f036 118 // find foods that have an (x,y) that is within the range of the top of the stack
fkhan39 1:9eeeb0d8f036 119 // if nothing found w/i the range
fkhan39 1:9eeeb0d8f036 120 // return false
fkhan39 1:9eeeb0d8f036 121 // if something found
fkhan39 1:9eeeb0d8f036 122 // collidedFood = that food item
fkhan39 1:9eeeb0d8f036 123 // return true
fkhan39 2:4c5f409d6bb8 124 }
fkhan39 1:9eeeb0d8f036 125
kswanson31 5:d832d2d67411 126 void updateScore(int sandwichSize) {
kswanson31 5:d832d2d67411 127 char scoreString[2]; // max 2-digit score
kswanson31 5:d832d2d67411 128 score += sandwichSize;
kswanson31 5:d832d2d67411 129 score = (score > 99) ? score - 100 : score; // score rollover
kswanson31 5:d832d2d67411 130 sprintf(scoreString, "%d", score); // keep score as a char string
kswanson31 5:d832d2d67411 131 lcd.text_string(scoreString, 16, 1, FONT_7X8, WHITE); // 16 chars over, 1 down
kswanson31 5:d832d2d67411 132 }
kswanson31 5:d832d2d67411 133
kswanson31 5:d832d2d67411 134 void drawLives() {
kswanson31 5:d832d2d67411 135 if (lives < 3) {
kswanson31 5:d832d2d67411 136 lcd.filled_circle(118, 100, 3, BLACK); // erase the life symbol
kswanson31 5:d832d2d67411 137 }
kswanson31 5:d832d2d67411 138 else if (lives < 2) {
kswanson31 5:d832d2d67411 139 lcd.filled_circle(118, 108, 3, BLACK);
kswanson31 5:d832d2d67411 140 }
kswanson31 5:d832d2d67411 141 else if (lives < 1) {
kswanson31 5:d832d2d67411 142 lcd.filled_circle(118, 116, 3, BLACK);
kswanson31 5:d832d2d67411 143 }
kswanson31 5:d832d2d67411 144 }