Tank Dodger Game

Dependencies:   4DGL-uLCD-SE SDFileSystem mbed-rtos mbed wave_player

Committer:
ashankar35
Date:
Tue Mar 14 19:18:48 2017 +0000
Revision:
0:350246c72962
Lab4-FinalGame

Who changed what in which revision?

UserRevisionLine numberNew contents of line
ashankar35 0:350246c72962 1 #include "mbed.h"
ashankar35 0:350246c72962 2 #include "globals.h"
ashankar35 0:350246c72962 3 #include "uLCD_4DGL.h"
ashankar35 0:350246c72962 4 #include "rtos.h"
ashankar35 0:350246c72962 5 #include "wave_player.h"
ashankar35 0:350246c72962 6 #include "SDFileSystem.h"
ashankar35 0:350246c72962 7 #include <mpr121.h>
ashankar35 0:350246c72962 8
ashankar35 0:350246c72962 9
ashankar35 0:350246c72962 10 DigitalOut led1(LED1);
ashankar35 0:350246c72962 11 DigitalOut led2(LED2);
ashankar35 0:350246c72962 12 DigitalOut led3(LED3);
ashankar35 0:350246c72962 13 DigitalOut led4(LED4);
ashankar35 0:350246c72962 14 InterruptIn interrupt(p26);
ashankar35 0:350246c72962 15 uLCD_4DGL uLCD(p13,p14,p15);
ashankar35 0:350246c72962 16 AnalogOut DACout(p18);
ashankar35 0:350246c72962 17 wave_player player(&DACout);
ashankar35 0:350246c72962 18 SDFileSystem sd(p5, p6, p7, p8, "sd");
ashankar35 0:350246c72962 19 I2C i2c(p9, p10);
ashankar35 0:350246c72962 20 Mpr121 mpr121(&i2c, Mpr121::ADD_VSS);
ashankar35 0:350246c72962 21
ashankar35 0:350246c72962 22 int ballNum = 0;
ashankar35 0:350246c72962 23 int tank_x;
ashankar35 0:350246c72962 24 int tank_y;
ashankar35 0:350246c72962 25 int balls_x[15];
ashankar35 0:350246c72962 26 int balls_y[15];
ashankar35 0:350246c72962 27 int balls_color[15];
ashankar35 0:350246c72962 28 int lives = 1;
ashankar35 0:350246c72962 29 int dist = 0;
ashankar35 0:350246c72962 30 bool win = false;
ashankar35 0:350246c72962 31 bool playing = true;
ashankar35 0:350246c72962 32 volatile bool chosen = false;
ashankar35 0:350246c72962 33 int noOfLives;
ashankar35 0:350246c72962 34 volatile bool moved = false;
ashankar35 0:350246c72962 35 Mutex lcd_mutex;
ashankar35 0:350246c72962 36
ashankar35 0:350246c72962 37 void fallInterrupt() {
ashankar35 0:350246c72962 38 int key_code=0;
ashankar35 0:350246c72962 39 int i=0;
ashankar35 0:350246c72962 40 int value=mpr121.read(0x00);
ashankar35 0:350246c72962 41 value +=mpr121.read(0x01)<<8;
ashankar35 0:350246c72962 42 for (i=0; i<12; i++) {
ashankar35 0:350246c72962 43 if (((value>>i)&0x01)==1) key_code=i+1;
ashankar35 0:350246c72962 44 }
ashankar35 0:350246c72962 45 led4=key_code & 0x01;
ashankar35 0:350246c72962 46 led3=(key_code>>1) & 0x01;
ashankar35 0:350246c72962 47 led2=(key_code>>2) & 0x01;
ashankar35 0:350246c72962 48 led1=(key_code>>3) & 0x01;
ashankar35 0:350246c72962 49 //uLCD.printf("%d", key_code);
ashankar35 0:350246c72962 50 noOfLives = key_code;
ashankar35 0:350246c72962 51 chosen = true;
ashankar35 0:350246c72962 52 }
ashankar35 0:350246c72962 53
ashankar35 0:350246c72962 54
ashankar35 0:350246c72962 55 void tankMove() {
ashankar35 0:350246c72962 56 int key_code=0;
ashankar35 0:350246c72962 57 int i=0;
ashankar35 0:350246c72962 58 int value=mpr121.read(0x00);
ashankar35 0:350246c72962 59 value +=mpr121.read(0x01)<<8;
ashankar35 0:350246c72962 60 for (i=0; i<12; i++) {
ashankar35 0:350246c72962 61 if (((value>>i)&0x01)==1) key_code=i+1;
ashankar35 0:350246c72962 62 }
ashankar35 0:350246c72962 63 dist = 0;
ashankar35 0:350246c72962 64 if(key_code == 5) {
ashankar35 0:350246c72962 65 dist = 5;
ashankar35 0:350246c72962 66 moved = true;
ashankar35 0:350246c72962 67 } else if(key_code == 7){
ashankar35 0:350246c72962 68 dist = -5;
ashankar35 0:350246c72962 69 moved = true;
ashankar35 0:350246c72962 70 }
ashankar35 0:350246c72962 71 }
ashankar35 0:350246c72962 72
ashankar35 0:350246c72962 73 void game_init(){
ashankar35 0:350246c72962 74 lcd_mutex.lock();
ashankar35 0:350246c72962 75 uLCD.cls();
ashankar35 0:350246c72962 76 const unsigned ImageHeight=128;
ashankar35 0:350246c72962 77 const unsigned ImageWidth=128;
ashankar35 0:350246c72962 78 //"c" region to display
ashankar35 0:350246c72962 79 double MinRe = -0.75104;
ashankar35 0:350246c72962 80 double MaxRe = -0.7408;
ashankar35 0:350246c72962 81 double MinIm = 0.10511;
ashankar35 0:350246c72962 82 double MaxIm = MinIm+(MaxRe-MinRe)*ImageHeight/ImageWidth;
ashankar35 0:350246c72962 83 double Re_factor = (MaxRe-MinRe)/(ImageWidth-1);
ashankar35 0:350246c72962 84 double Im_factor = (MaxIm-MinIm)/(ImageHeight-1);
ashankar35 0:350246c72962 85 unsigned MaxIterations = 2048;
ashankar35 0:350246c72962 86 for(unsigned y=0; y<ImageHeight; ++y) {
ashankar35 0:350246c72962 87 double c_im = MaxIm - y*Im_factor;
ashankar35 0:350246c72962 88 for(unsigned x=0; x<ImageWidth; ++x) {
ashankar35 0:350246c72962 89 double c_re = MinRe + x*Re_factor;
ashankar35 0:350246c72962 90 double Z_re = c_re, Z_im = c_im;
ashankar35 0:350246c72962 91 int niterations=0;
ashankar35 0:350246c72962 92 for(unsigned n=0; n<MaxIterations; ++n) {
ashankar35 0:350246c72962 93 double Z_re2 = Z_re*Z_re, Z_im2 = Z_im*Z_im;
ashankar35 0:350246c72962 94 if(Z_re2 + Z_im2 > 4) {
ashankar35 0:350246c72962 95 niterations = n;
ashankar35 0:350246c72962 96 break;
ashankar35 0:350246c72962 97 }
ashankar35 0:350246c72962 98 Z_im = 2*Z_re*Z_im + c_im;
ashankar35 0:350246c72962 99 Z_re = Z_re2 - Z_im2 + c_re;
ashankar35 0:350246c72962 100 }
ashankar35 0:350246c72962 101 if (niterations!=(MaxIterations-1))
ashankar35 0:350246c72962 102 uLCD.pixel(x,y,((niterations & 0xF00)<<12)+((niterations & 0xF0)<<8)+((niterations & 0x0F)<<4) );
ashankar35 0:350246c72962 103 }
ashankar35 0:350246c72962 104 }
ashankar35 0:350246c72962 105 uLCD.cls();
ashankar35 0:350246c72962 106 lcd_mutex.unlock();
ashankar35 0:350246c72962 107 led1 = 0; led2 = 0; led3 = 0; led4 = 0;
ashankar35 0:350246c72962 108 for(int i = 0 ; i <15; i++ ){
ashankar35 0:350246c72962 109 balls_x[i] = rand() % 120 + 5;
ashankar35 0:350246c72962 110 balls_y[i] = 3;
ashankar35 0:350246c72962 111 balls_color[i] = rand() % 2 +1;
ashankar35 0:350246c72962 112 }
ashankar35 0:350246c72962 113 tank_x= 60;
ashankar35 0:350246c72962 114 tank_y= 122;
ashankar35 0:350246c72962 115 //uLCD.background_color(SKY_COLOR);
ashankar35 0:350246c72962 116 lcd_mutex.lock();
ashankar35 0:350246c72962 117 uLCD.filled_circle(tank_x+2, tank_y, 3, BLUE);
ashankar35 0:350246c72962 118 uLCD.filled_circle(tank_x+9, tank_y, 3, BLUE);
ashankar35 0:350246c72962 119 uLCD.filled_rectangle(tank_x+6,tank_y-11,tank_x+7,tank_y-14, RED);
ashankar35 0:350246c72962 120 uLCD.filled_rectangle(tank_x, tank_y, tank_x+12, tank_y-10, RED);
ashankar35 0:350246c72962 121 lcd_mutex.unlock();
ashankar35 0:350246c72962 122
ashankar35 0:350246c72962 123 }
ashankar35 0:350246c72962 124
ashankar35 0:350246c72962 125 void moveBall(){
ashankar35 0:350246c72962 126 uLCD.filled_rectangle(balls_x[ballNum], balls_y[ballNum],balls_x[ballNum]+3, balls_y[ballNum]+3, BLACK);
ashankar35 0:350246c72962 127 balls_y[ballNum] = balls_y[ballNum] + 2;
ashankar35 0:350246c72962 128 if(balls_color[ballNum] == 1){
ashankar35 0:350246c72962 129 uLCD.filled_rectangle(balls_x[ballNum], balls_y[ballNum],balls_x[ballNum]+3, balls_y[ballNum]+3, BLUE);
ashankar35 0:350246c72962 130 } else {
ashankar35 0:350246c72962 131 uLCD.filled_rectangle(balls_x[ballNum], balls_y[ballNum],balls_x[ballNum]+3, balls_y[ballNum]+3, RED);
ashankar35 0:350246c72962 132 }
ashankar35 0:350246c72962 133 }
ashankar35 0:350246c72962 134
ashankar35 0:350246c72962 135 void thread1(void const *args)
ashankar35 0:350246c72962 136 {
ashankar35 0:350246c72962 137 while(balls_y[ballNum] < 116){
ashankar35 0:350246c72962 138 lcd_mutex.lock();
ashankar35 0:350246c72962 139 moveBall();
ashankar35 0:350246c72962 140 lcd_mutex.unlock();
ashankar35 0:350246c72962 141 if(balls_y[ballNum] >= 116){
ashankar35 0:350246c72962 142 lcd_mutex.lock();
ashankar35 0:350246c72962 143 uLCD.filled_rectangle(balls_x[ballNum], balls_y[ballNum],balls_x[ballNum]+3, balls_y[ballNum]+3, BLACK);
ashankar35 0:350246c72962 144 lcd_mutex.unlock();
ashankar35 0:350246c72962 145 ballNum++;
ashankar35 0:350246c72962 146 }
ashankar35 0:350246c72962 147 }
ashankar35 0:350246c72962 148 Thread::wait(1000);
ashankar35 0:350246c72962 149 }
ashankar35 0:350246c72962 150
ashankar35 0:350246c72962 151 void thread2(void const *args){
ashankar35 0:350246c72962 152 FILE *wave_file;
ashankar35 0:350246c72962 153 wave_file=fopen("/sd/wavfiles/sweeper.wav","r");
ashankar35 0:350246c72962 154 if(wave_file == NULL) {
ashankar35 0:350246c72962 155 led1 =1;
ashankar35 0:350246c72962 156 } else {
ashankar35 0:350246c72962 157 player.play(wave_file);
ashankar35 0:350246c72962 158 led1 =0;
ashankar35 0:350246c72962 159 }
ashankar35 0:350246c72962 160 fclose(wave_file);
ashankar35 0:350246c72962 161 }
ashankar35 0:350246c72962 162
ashankar35 0:350246c72962 163 void thread3(void const *args)
ashankar35 0:350246c72962 164 {
ashankar35 0:350246c72962 165 while(playing){
ashankar35 0:350246c72962 166 interrupt.fall(&tankMove);
ashankar35 0:350246c72962 167 interrupt.mode(PullUp);
ashankar35 0:350246c72962 168 while(!moved){}
ashankar35 0:350246c72962 169 lcd_mutex.lock();
ashankar35 0:350246c72962 170 uLCD.filled_circle(tank_x+2, tank_y, 3, BLACK);
ashankar35 0:350246c72962 171 uLCD.filled_circle(tank_x+9, tank_y, 3, BLACK);
ashankar35 0:350246c72962 172 uLCD.filled_rectangle(tank_x+6,tank_y-11,tank_x+7,tank_y-14, BLACK);
ashankar35 0:350246c72962 173 uLCD.filled_rectangle(tank_x, tank_y, tank_x+12, tank_y-10, BLACK);
ashankar35 0:350246c72962 174
ashankar35 0:350246c72962 175 tank_x = tank_x + dist;
ashankar35 0:350246c72962 176
ashankar35 0:350246c72962 177 uLCD.filled_circle(tank_x+2, tank_y, 3, BLUE);
ashankar35 0:350246c72962 178 uLCD.filled_circle(tank_x+9, tank_y, 3, BLUE);
ashankar35 0:350246c72962 179 uLCD.filled_rectangle(tank_x+6,tank_y-11,tank_x+7,tank_y-14, RED);
ashankar35 0:350246c72962 180 uLCD.filled_rectangle(tank_x, tank_y, tank_x+12, tank_y-10, RED);
ashankar35 0:350246c72962 181 lcd_mutex.unlock();
ashankar35 0:350246c72962 182 moved = false;
ashankar35 0:350246c72962 183 }
ashankar35 0:350246c72962 184 //Thread::wait(1000);
ashankar35 0:350246c72962 185 }
ashankar35 0:350246c72962 186
ashankar35 0:350246c72962 187 void gameover(){
ashankar35 0:350246c72962 188 uLCD.cls();
ashankar35 0:350246c72962 189 led1=1;
ashankar35 0:350246c72962 190 uLCD.locate(0,10);
ashankar35 0:350246c72962 191 if(win){
ashankar35 0:350246c72962 192 uLCD.printf("Win");
ashankar35 0:350246c72962 193 } else {
ashankar35 0:350246c72962 194 uLCD.printf("Lose");
ashankar35 0:350246c72962 195 }
ashankar35 0:350246c72962 196 }
ashankar35 0:350246c72962 197
ashankar35 0:350246c72962 198 int main() {
ashankar35 0:350246c72962 199
ashankar35 0:350246c72962 200 Thread t2(thread2);
ashankar35 0:350246c72962 201 lcd_mutex.lock();
ashankar35 0:350246c72962 202 uLCD.locate(0,5);
ashankar35 0:350246c72962 203 uLCD.printf("Touch to Start");
ashankar35 0:350246c72962 204 lcd_mutex.unlock();
ashankar35 0:350246c72962 205 interrupt.fall(&fallInterrupt);
ashankar35 0:350246c72962 206 interrupt.mode(PullUp);
ashankar35 0:350246c72962 207 while(!chosen){};
ashankar35 0:350246c72962 208 //t2.terminate();
ashankar35 0:350246c72962 209 game_init();
ashankar35 0:350246c72962 210 Thread t1(thread1);
ashankar35 0:350246c72962 211 Thread t3(thread3);
ashankar35 0:350246c72962 212 while(ballNum < 15) {
ashankar35 0:350246c72962 213 Thread::wait(50);
ashankar35 0:350246c72962 214 lcd_mutex.lock();
ashankar35 0:350246c72962 215 uLCD.locate(0,0);
ashankar35 0:350246c72962 216 uLCD.printf("Lives: %d",lives);
ashankar35 0:350246c72962 217 lcd_mutex.unlock();
ashankar35 0:350246c72962 218 if((balls_x[ballNum] < tank_x+12) && (balls_x[ballNum]+3 > tank_x) &&
ashankar35 0:350246c72962 219 (balls_y[ballNum] > tank_y-10)){
ashankar35 0:350246c72962 220 lcd_mutex.lock();
ashankar35 0:350246c72962 221 uLCD.filled_rectangle(balls_x[ballNum], balls_y[ballNum],balls_x[ballNum]+3, balls_y[ballNum]+3, BLACK);
ashankar35 0:350246c72962 222 lcd_mutex.unlock();
ashankar35 0:350246c72962 223 if(balls_color[ballNum] == 1){
ashankar35 0:350246c72962 224 lives--;
ashankar35 0:350246c72962 225 } else {
ashankar35 0:350246c72962 226 lives++;
ashankar35 0:350246c72962 227 }
ashankar35 0:350246c72962 228 //ballNum++;
ashankar35 0:350246c72962 229 }
ashankar35 0:350246c72962 230 if(lives == 0){
ashankar35 0:350246c72962 231 playing = false;
ashankar35 0:350246c72962 232 t1.terminate();
ashankar35 0:350246c72962 233 t3.terminate();
ashankar35 0:350246c72962 234 gameover();
ashankar35 0:350246c72962 235 break;
ashankar35 0:350246c72962 236 } else if(lives ==3){
ashankar35 0:350246c72962 237 playing = false;
ashankar35 0:350246c72962 238 win= true;
ashankar35 0:350246c72962 239 t1.terminate();
ashankar35 0:350246c72962 240 t3.terminate();
ashankar35 0:350246c72962 241 gameover();
ashankar35 0:350246c72962 242 break;
ashankar35 0:350246c72962 243 }
ashankar35 0:350246c72962 244 }
ashankar35 0:350246c72962 245 t1.terminate();
ashankar35 0:350246c72962 246 t3.terminate();
ashankar35 0:350246c72962 247 gameover();
ashankar35 0:350246c72962 248 }