This is our rendition of popular labyrinth games. We use readings from the IMU accelerometer to move a little yellow ball around the screen. We have created a maze of walls and holes that will end the game if the user runs into either of these.
Dependencies: 4DGL-uLCD-SE mbed
main.cpp@1:2250e33823e2, 2015-10-20 (annotated)
- Committer:
- dbegasse
- Date:
- Tue Oct 20 18:34:56 2015 +0000
- Revision:
- 1:2250e33823e2
- Parent:
- 0:7b4bbd744f6d
ECE4180 Lab 4 to_publish
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
dbegasse | 1:2250e33823e2 | 1 | //Daniel Begasse |
dbegasse | 1:2250e33823e2 | 2 | //Kieth Nga |
dbegasse | 1:2250e33823e2 | 3 | //ECE 4180 Lab 4 |
dbegasse | 1:2250e33823e2 | 4 | //This game uses reading from the accelerometer on an IMU sensor to move a ball through a maze |
dbegasse | 1:2250e33823e2 | 5 | //The goal of the game is to move to yellow ball through the maze, avoiding walls and obstacles along the way |
dbegasse | 1:2250e33823e2 | 6 | |
dbegasse | 0:7b4bbd744f6d | 7 | #include "LSM9DS0.h" |
dbegasse | 0:7b4bbd744f6d | 8 | #include "mbed.h" |
dbegasse | 0:7b4bbd744f6d | 9 | #include "uLCD_4DGL.h" |
dbegasse | 0:7b4bbd744f6d | 10 | #include <stdio.h> |
dbegasse | 0:7b4bbd744f6d | 11 | #include <stdlib.h> |
dbegasse | 0:7b4bbd744f6d | 12 | |
dbegasse | 0:7b4bbd744f6d | 13 | // SDO_XM and SDO_G are both grounded, so our addresses are: |
dbegasse | 0:7b4bbd744f6d | 14 | #define LSM9DS0_XM 0x1D // Would be 0x1E if SDO_XM is LOW |
dbegasse | 0:7b4bbd744f6d | 15 | #define LSM9DS0_G 0x6B // Would be 0x6A if SDO_G is LOW |
dbegasse | 0:7b4bbd744f6d | 16 | |
dbegasse | 0:7b4bbd744f6d | 17 | |
dbegasse | 0:7b4bbd744f6d | 18 | LSM9DS0 dof(p9, p10,LSM9DS0_G, LSM9DS0_XM); |
dbegasse | 0:7b4bbd744f6d | 19 | uLCD_4DGL uLCD(p28, p27, p30); //create a global lcd project |
dbegasse | 1:2250e33823e2 | 20 | Serial pc(USBTX, USBRX); // tx, rx |
dbegasse | 0:7b4bbd744f6d | 21 | |
dbegasse | 0:7b4bbd744f6d | 22 | #define PRINT_CALCULATED |
dbegasse | 0:7b4bbd744f6d | 23 | #define PRINT_SPEED 500 // 500 ms between prints |
dbegasse | 0:7b4bbd744f6d | 24 | |
dbegasse | 0:7b4bbd744f6d | 25 | //Init Serial port and LSM9DS0 chip |
dbegasse | 0:7b4bbd744f6d | 26 | void setup() |
dbegasse | 0:7b4bbd744f6d | 27 | { |
dbegasse | 1:2250e33823e2 | 28 | pc.baud(9600);//Had to update the baud rate to match tera term |
dbegasse | 0:7b4bbd744f6d | 29 | uint16_t status = dof.begin(); |
dbegasse | 0:7b4bbd744f6d | 30 | |
dbegasse | 0:7b4bbd744f6d | 31 | } |
dbegasse | 0:7b4bbd744f6d | 32 | |
dbegasse | 0:7b4bbd744f6d | 33 | |
dbegasse | 1:2250e33823e2 | 34 | |
dbegasse | 1:2250e33823e2 | 35 | void drawMaze(){ |
dbegasse | 1:2250e33823e2 | 36 | |
dbegasse | 1:2250e33823e2 | 37 | uLCD.filled_rectangle(20, 0, 23, 40 , 0x00FF00); //Wall 1 |
dbegasse | 1:2250e33823e2 | 38 | uLCD.filled_rectangle(0, 105, 40, 108 , 0x00FF00); //Wall 2 |
dbegasse | 1:2250e33823e2 | 39 | uLCD.filled_rectangle(25, 70, 127, 73 , 0x00FF00); //Wall 3 |
dbegasse | 1:2250e33823e2 | 40 | uLCD.filled_rectangle(45, 40, 48, 70 , 0x00FF00); //Wall 4 |
dbegasse | 1:2250e33823e2 | 41 | uLCD.filled_rectangle(45, 40, 75, 43 , 0x00FF00); //Wall 5 |
dbegasse | 1:2250e33823e2 | 42 | uLCD.filled_rectangle(75, 73, 78, 108 , 0x00FF00); //Wall 6 |
dbegasse | 1:2250e33823e2 | 43 | uLCD.filled_rectangle(90, 15, 127, 18 , 0x00FF00); //Wall 7 |
dbegasse | 1:2250e33823e2 | 44 | uLCD.filled_circle(100, 100, 5, BLUE);//End destination |
dbegasse | 1:2250e33823e2 | 45 | uLCD.filled_circle(100, 50, 7, DGREY); //Hole #1 |
dbegasse | 1:2250e33823e2 | 46 | uLCD.filled_circle(60, 90, 7, DGREY); //Hole #2 |
dbegasse | 1:2250e33823e2 | 47 | |
dbegasse | 1:2250e33823e2 | 48 | } |
dbegasse | 1:2250e33823e2 | 49 | |
dbegasse | 1:2250e33823e2 | 50 | void displayRules(){ |
dbegasse | 1:2250e33823e2 | 51 | |
dbegasse | 1:2250e33823e2 | 52 | uLCD.printf(" Labyrinth Danger!\n\n\n"); |
dbegasse | 1:2250e33823e2 | 53 | wait(3); |
dbegasse | 1:2250e33823e2 | 54 | uLCD.locate(5,3); |
dbegasse | 1:2250e33823e2 | 55 | uLCD.printf("THE RULES\n"); |
dbegasse | 1:2250e33823e2 | 56 | wait(1.5); |
dbegasse | 1:2250e33823e2 | 57 | uLCD.printf("1.)Avoid the walls\n"); |
dbegasse | 1:2250e33823e2 | 58 | wait(1.5); |
dbegasse | 1:2250e33823e2 | 59 | uLCD.printf("2.)Avoid the holes\n"); |
dbegasse | 1:2250e33823e2 | 60 | wait(1.5); |
dbegasse | 1:2250e33823e2 | 61 | uLCD.printf("3.)Get the yellow ball in the blue hole to win"); |
dbegasse | 1:2250e33823e2 | 62 | wait(6); |
dbegasse | 1:2250e33823e2 | 63 | uLCD.cls(); |
dbegasse | 1:2250e33823e2 | 64 | |
dbegasse | 1:2250e33823e2 | 65 | } |
dbegasse | 1:2250e33823e2 | 66 | |
dbegasse | 1:2250e33823e2 | 67 | void youLose(){ |
dbegasse | 1:2250e33823e2 | 68 | |
dbegasse | 1:2250e33823e2 | 69 | uLCD.cls(); |
dbegasse | 1:2250e33823e2 | 70 | uLCD.locate(1,4); |
dbegasse | 1:2250e33823e2 | 71 | uLCD.text_width(2); |
dbegasse | 1:2250e33823e2 | 72 | uLCD.text_height(2); |
dbegasse | 1:2250e33823e2 | 73 | uLCD.printf("YOU LOSE\n"); |
dbegasse | 1:2250e33823e2 | 74 | } |
dbegasse | 1:2250e33823e2 | 75 | |
dbegasse | 1:2250e33823e2 | 76 | void youWin(){ |
dbegasse | 1:2250e33823e2 | 77 | |
dbegasse | 1:2250e33823e2 | 78 | uLCD.cls(); |
dbegasse | 1:2250e33823e2 | 79 | uLCD.locate(1,4); |
dbegasse | 1:2250e33823e2 | 80 | uLCD.text_width(2); |
dbegasse | 1:2250e33823e2 | 81 | uLCD.text_height(2); |
dbegasse | 1:2250e33823e2 | 82 | uLCD.printf("YOU WIN!\n"); |
dbegasse | 1:2250e33823e2 | 83 | } |
dbegasse | 1:2250e33823e2 | 84 | |
dbegasse | 0:7b4bbd744f6d | 85 | int main() |
dbegasse | 0:7b4bbd744f6d | 86 | { |
dbegasse | 1:2250e33823e2 | 87 | displayRules();//Show the rules before the start of the game |
dbegasse | 0:7b4bbd744f6d | 88 | setup(); //Setup sensor and Serial |
dbegasse | 1:2250e33823e2 | 89 | drawMaze(); //Draw the maze |
dbegasse | 0:7b4bbd744f6d | 90 | |
dbegasse | 0:7b4bbd744f6d | 91 | int circlex = 0; |
dbegasse | 1:2250e33823e2 | 92 | int circley = 0; |
dbegasse | 1:2250e33823e2 | 93 | int circler = 3; |
dbegasse | 1:2250e33823e2 | 94 | int last_circlex = 64; |
dbegasse | 1:2250e33823e2 | 95 | int last_circley = 64; |
dbegasse | 1:2250e33823e2 | 96 | float accelx; |
dbegasse | 1:2250e33823e2 | 97 | float accely; |
dbegasse | 0:7b4bbd744f6d | 98 | |
dbegasse | 0:7b4bbd744f6d | 99 | |
dbegasse | 0:7b4bbd744f6d | 100 | |
dbegasse | 0:7b4bbd744f6d | 101 | while (true) |
dbegasse | 0:7b4bbd744f6d | 102 | { |
dbegasse | 0:7b4bbd744f6d | 103 | |
dbegasse | 0:7b4bbd744f6d | 104 | dof.readAccel(); |
dbegasse | 1:2250e33823e2 | 105 | accelx = dof.calcAccel(dof.ax) - dof.abias[0]; |
dbegasse | 1:2250e33823e2 | 106 | accely = dof.calcAccel(dof.ay) - dof.abias[1]; |
dbegasse | 0:7b4bbd744f6d | 107 | //pc.printf("%2f\n", accel); |
dbegasse | 0:7b4bbd744f6d | 108 | wait(0.05); |
dbegasse | 0:7b4bbd744f6d | 109 | |
dbegasse | 1:2250e33823e2 | 110 | |
dbegasse | 1:2250e33823e2 | 111 | //Get rid of the old circle |
dbegasse | 1:2250e33823e2 | 112 | uLCD.filled_circle(last_circlex, last_circley, circler, BLACK); |
dbegasse | 1:2250e33823e2 | 113 | |
dbegasse | 1:2250e33823e2 | 114 | circlex = 128 - ((1 + accelx) * 64); |
dbegasse | 1:2250e33823e2 | 115 | circley = (1 + accely) * 64; |
dbegasse | 1:2250e33823e2 | 116 | |
dbegasse | 1:2250e33823e2 | 117 | |
dbegasse | 1:2250e33823e2 | 118 | //This checks if the game has been won |
dbegasse | 1:2250e33823e2 | 119 | if( (circlex >= 96 && circlex <= 104) && (circley >= 96 && circley <= 104) ){ |
dbegasse | 1:2250e33823e2 | 120 | |
dbegasse | 1:2250e33823e2 | 121 | youWin(); |
dbegasse | 1:2250e33823e2 | 122 | break; |
dbegasse | 1:2250e33823e2 | 123 | } |
dbegasse | 1:2250e33823e2 | 124 | |
dbegasse | 0:7b4bbd744f6d | 125 | |
dbegasse | 1:2250e33823e2 | 126 | //This checks if the ball has hit wall number 1 |
dbegasse | 1:2250e33823e2 | 127 | if( (circlex >= 18 && circlex <= 25) && (circley >= 0 && circley <=42) ){ |
dbegasse | 1:2250e33823e2 | 128 | |
dbegasse | 1:2250e33823e2 | 129 | youLose(); |
dbegasse | 1:2250e33823e2 | 130 | break; |
dbegasse | 1:2250e33823e2 | 131 | } |
dbegasse | 1:2250e33823e2 | 132 | //This checks if the ball has hit wall number 2 |
dbegasse | 1:2250e33823e2 | 133 | if( (circlex >= 0 && circlex <= 42) && (circley >= 103 && circley <= 110) ){ |
dbegasse | 1:2250e33823e2 | 134 | |
dbegasse | 1:2250e33823e2 | 135 | youLose(); |
dbegasse | 1:2250e33823e2 | 136 | break; |
dbegasse | 1:2250e33823e2 | 137 | } |
dbegasse | 1:2250e33823e2 | 138 | |
dbegasse | 1:2250e33823e2 | 139 | //This checks if the ball has hit wall number 3 |
dbegasse | 1:2250e33823e2 | 140 | if( (circlex >= 23 && circlex <= 129) && (circley >= 68 && circley <=75) ){ |
dbegasse | 1:2250e33823e2 | 141 | |
dbegasse | 1:2250e33823e2 | 142 | youLose(); |
dbegasse | 1:2250e33823e2 | 143 | break; |
dbegasse | 1:2250e33823e2 | 144 | } |
dbegasse | 1:2250e33823e2 | 145 | |
dbegasse | 1:2250e33823e2 | 146 | //This checks if the ball has hit wall number 4 |
dbegasse | 1:2250e33823e2 | 147 | if( (circlex >= 43 && circlex <= 50) && (circley >= 38 && circley <= 72) ){ |
dbegasse | 1:2250e33823e2 | 148 | |
dbegasse | 1:2250e33823e2 | 149 | youLose(); |
dbegasse | 1:2250e33823e2 | 150 | break; |
dbegasse | 1:2250e33823e2 | 151 | } |
dbegasse | 1:2250e33823e2 | 152 | |
dbegasse | 1:2250e33823e2 | 153 | //This checks if the ball has hit wall number 5 |
dbegasse | 1:2250e33823e2 | 154 | if( (circlex >= 43 && circlex <= 77) && (circley >= 38 && circley <= 45) ){ |
dbegasse | 1:2250e33823e2 | 155 | |
dbegasse | 1:2250e33823e2 | 156 | youLose(); |
dbegasse | 1:2250e33823e2 | 157 | break; |
dbegasse | 1:2250e33823e2 | 158 | } |
dbegasse | 1:2250e33823e2 | 159 | |
dbegasse | 1:2250e33823e2 | 160 | //This checks if the ball has hit wall number 6 |
dbegasse | 1:2250e33823e2 | 161 | if( (circlex >= 73 && circlex <= 80) && (circley >= 72 && circley <= 110) ){ |
dbegasse | 1:2250e33823e2 | 162 | |
dbegasse | 1:2250e33823e2 | 163 | youLose(); |
dbegasse | 1:2250e33823e2 | 164 | break; |
dbegasse | 1:2250e33823e2 | 165 | } |
dbegasse | 1:2250e33823e2 | 166 | |
dbegasse | 1:2250e33823e2 | 167 | //This checks if the ball has hit wall number 7 |
dbegasse | 1:2250e33823e2 | 168 | if( (circlex >= 88 && circlex <= 129) && (circley >= 13 && circley <= 20) ){ |
dbegasse | 1:2250e33823e2 | 169 | |
dbegasse | 1:2250e33823e2 | 170 | youLose(); |
dbegasse | 1:2250e33823e2 | 171 | break; |
dbegasse | 1:2250e33823e2 | 172 | } |
dbegasse | 1:2250e33823e2 | 173 | |
dbegasse | 1:2250e33823e2 | 174 | //This checks if the ball fell into hole #1 |
dbegasse | 1:2250e33823e2 | 175 | if( (circlex >= 95 && circlex <= 105) && (circley >= 45 && circley <= 55) ){ |
dbegasse | 1:2250e33823e2 | 176 | |
dbegasse | 1:2250e33823e2 | 177 | youLose(); |
dbegasse | 1:2250e33823e2 | 178 | break; |
dbegasse | 1:2250e33823e2 | 179 | } |
dbegasse | 1:2250e33823e2 | 180 | |
dbegasse | 1:2250e33823e2 | 181 | //This checks if the ball fell into hole #2 |
dbegasse | 1:2250e33823e2 | 182 | if( (circlex >= 55 && circlex <= 65) && (circley >= 85 && circley <= 95) ){ |
dbegasse | 1:2250e33823e2 | 183 | |
dbegasse | 1:2250e33823e2 | 184 | youLose(); |
dbegasse | 1:2250e33823e2 | 185 | break; |
dbegasse | 1:2250e33823e2 | 186 | } |
dbegasse | 1:2250e33823e2 | 187 | |
dbegasse | 1:2250e33823e2 | 188 | //If the player has not won or hit a wall, update the location of the ball |
dbegasse | 1:2250e33823e2 | 189 | else{ |
dbegasse | 1:2250e33823e2 | 190 | |
dbegasse | 0:7b4bbd744f6d | 191 | last_circlex = circlex; |
dbegasse | 1:2250e33823e2 | 192 | last_circley = circley; |
dbegasse | 0:7b4bbd744f6d | 193 | uLCD.filled_circle(circlex, circley, circler, 0xFFFF00); |
dbegasse | 1:2250e33823e2 | 194 | } |
dbegasse | 0:7b4bbd744f6d | 195 | |
dbegasse | 0:7b4bbd744f6d | 196 | } |
dbegasse | 0:7b4bbd744f6d | 197 | |
dbegasse | 1:2250e33823e2 | 198 | |
dbegasse | 0:7b4bbd744f6d | 199 | } |
dbegasse | 0:7b4bbd744f6d | 200 |