Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed
main/main.cpp@14:ce231137d2f2, 2018-05-07 (annotated)
- Committer:
- el16a2t
- Date:
- Mon May 07 21:40:16 2018 +0000
- Revision:
- 14:ce231137d2f2
- Parent:
- engine/main.cpp@13:61aeeb4e4e47
- Child:
- 15:2b98d03e7ab6
added in comments explaining the difficulty adjustment and the function which stops sprites overlapping
Who changed what in which revision?
| User | Revision | Line number | New contents of line |
|---|---|---|---|
| el16a2t | 1:a3c9025e0dad | 1 | /* |
| el16a2t | 1:a3c9025e0dad | 2 | ELEC2645 Embedded Systems Project |
| el16a2t | 1:a3c9025e0dad | 3 | School of Electronic & Electrical Engineering |
| el16a2t | 1:a3c9025e0dad | 4 | University of Leeds |
| el16a2t | 1:a3c9025e0dad | 5 | Name: Adam Thompson |
| el16a2t | 1:a3c9025e0dad | 6 | Username: el16a2t |
| el16a2t | 1:a3c9025e0dad | 7 | Student ID Number: 201047832 |
| el16a2t | 1:a3c9025e0dad | 8 | Date: 17/4/18 |
| el16a2t | 1:a3c9025e0dad | 9 | */ |
| el16a2t | 1:a3c9025e0dad | 10 | #include "mbed.h" |
| el16a2t | 1:a3c9025e0dad | 11 | #include "Gamepad.h" |
| el16a2t | 1:a3c9025e0dad | 12 | #include "N5110.h" |
| el16a2t | 1:a3c9025e0dad | 13 | #include "sprites.h" |
| el16a2t | 1:a3c9025e0dad | 14 | #include "main.h" |
| el16a2t | 1:a3c9025e0dad | 15 | |
| el16a2t | 1:a3c9025e0dad | 16 | |
| el16a2t | 1:a3c9025e0dad | 17 | N5110 lcd(PTC9, PTC0, PTC7, PTD2, PTD1, PTC11); |
| el16a2t | 1:a3c9025e0dad | 18 | Gamepad pad; |
| el16a2t | 1:a3c9025e0dad | 19 | |
| el16a2t | 2:a48df109588e | 20 | void init(); |
| el16a2t | 2:a48df109588e | 21 | void startUp(); |
| el16a2t | 2:a48df109588e | 22 | void newGame(); |
| el16a2t | 2:a48df109588e | 23 | void gameOver(); |
| el16a2t | 1:a3c9025e0dad | 24 | |
| el16a2t | 1:a3c9025e0dad | 25 | |
| el16a2t | 1:a3c9025e0dad | 26 | int main() |
| el16a2t | 2:a48df109588e | 27 | { |
| el16a2t | 1:a3c9025e0dad | 28 | |
| el16a2t | 2:a48df109588e | 29 | init(); |
| el16a2t | 2:a48df109588e | 30 | startUp(); |
| el16a2t | 7:d1a1f7c5eb0d | 31 | while (1) { |
| el16a2t | 7:d1a1f7c5eb0d | 32 | |
| el16a2t | 7:d1a1f7c5eb0d | 33 | newGame(); |
| el16a2t | 7:d1a1f7c5eb0d | 34 | gameOver(); |
| el16a2t | 7:d1a1f7c5eb0d | 35 | } |
| el16a2t | 2:a48df109588e | 36 | } |
| el16a2t | 1:a3c9025e0dad | 37 | |
| el16a2t | 2:a48df109588e | 38 | void init() |
| el16a2t | 1:a3c9025e0dad | 39 | { |
| el16a2t | 1:a3c9025e0dad | 40 | |
| el16a2t | 1:a3c9025e0dad | 41 | // initialise the lcd and gamepad |
| el16a2t | 1:a3c9025e0dad | 42 | lcd.init(); |
| el16a2t | 7:d1a1f7c5eb0d | 43 | lcd.setContrast(0.3); |
| el16a2t | 1:a3c9025e0dad | 44 | pad.init (); |
| el16a2t | 7:d1a1f7c5eb0d | 45 | //set initial number of lives to 1 |
| el16a2t | 7:d1a1f7c5eb0d | 46 | lives = 1; |
| el16a2t | 7:d1a1f7c5eb0d | 47 | //set initial location conditions for the player and car(s) and score |
| el16a2t | 7:d1a1f7c5eb0d | 48 | x_player = 24; |
| el16a2t | 7:d1a1f7c5eb0d | 49 | y_player = 29; |
| el16a2t | 11:4907e6e7e855 | 50 | |
| el16a2t | 7:d1a1f7c5eb0d | 51 | x_car = 4; |
| el16a2t | 7:d1a1f7c5eb0d | 52 | y_car = 0; |
| el16a2t | 8:8d25574b14cd | 53 | x_car2 = 24; |
| el16a2t | 13:61aeeb4e4e47 | 54 | y_car2 = -40; |
| el16a2t | 7:d1a1f7c5eb0d | 55 | |
| el16a2t | 7:d1a1f7c5eb0d | 56 | //(re)set score to 0 |
| el16a2t | 7:d1a1f7c5eb0d | 57 | score = 0; |
| el16a2t | 13:61aeeb4e4e47 | 58 | |
| el16a2t | 13:61aeeb4e4e47 | 59 | srand(time(NULL)); |
| el16a2t | 2:a48df109588e | 60 | } |
| el16a2t | 1:a3c9025e0dad | 61 | |
| el16a2t | 2:a48df109588e | 62 | |
| el16a2t | 2:a48df109588e | 63 | void startUp() |
| el16a2t | 2:a48df109588e | 64 | { |
| el16a2t | 2:a48df109588e | 65 | //print start screen |
| el16a2t | 2:a48df109588e | 66 | while ( pad.check_event(Gamepad::START_PRESSED) == false) { |
| el16a2t | 11:4907e6e7e855 | 67 | lcd.drawSprite (1,1,20,70,(int*) titlescreen); |
| el16a2t | 11:4907e6e7e855 | 68 | lcd.printString ("PRESS START", 3,5); |
| el16a2t | 11:4907e6e7e855 | 69 | lcd.printString ("SPEED", 3,3); |
| el16a2t | 11:4907e6e7e855 | 70 | pot_value = pad.read_pot(); |
| el16a2t | 11:4907e6e7e855 | 71 | sprintf (speed, "%.1f", (pot_value*10)); //convert an integer to pointer |
| el16a2t | 11:4907e6e7e855 | 72 | lcd.printString(speed,55,3); |
| el16a2t | 13:61aeeb4e4e47 | 73 | |
| el16a2t | 11:4907e6e7e855 | 74 | lcd.refresh(); |
| el16a2t | 11:4907e6e7e855 | 75 | wait(0.2); |
| el16a2t | 2:a48df109588e | 76 | } |
| el16a2t | 2:a48df109588e | 77 | } |
| el16a2t | 2:a48df109588e | 78 | |
| el16a2t | 4:a6ca44e29e97 | 79 | |
| el16a2t | 8:8d25574b14cd | 80 | void newGame() |
| el16a2t | 8:8d25574b14cd | 81 | { |
| el16a2t | 11:4907e6e7e855 | 82 | printf("newgamereached\n"); //checking if new game function reached |
| el16a2t | 1:a3c9025e0dad | 83 | |
| el16a2t | 11:4907e6e7e855 | 84 | lcd.clear(); |
| el16a2t | 11:4907e6e7e855 | 85 | |
| el16a2t | 11:4907e6e7e855 | 86 | lcd.drawSprite(x_player,y_player,20,15,(int*) player); //print the player sprite |
| el16a2t | 11:4907e6e7e855 | 87 | |
| el16a2t | 11:4907e6e7e855 | 88 | //if X pressed, move player left, if B pressed, move player right |
| el16a2t | 11:4907e6e7e855 | 89 | if ( pad.check_event(Gamepad::X_PRESSED) == true) { |
| el16a2t | 11:4907e6e7e855 | 90 | |
| el16a2t | 11:4907e6e7e855 | 91 | x_player = x_player-20; |
| el16a2t | 11:4907e6e7e855 | 92 | } |
| el16a2t | 11:4907e6e7e855 | 93 | //car cannot go further left than the left lane etc |
| el16a2t | 11:4907e6e7e855 | 94 | if (x_player <4) { |
| el16a2t | 11:4907e6e7e855 | 95 | x_player = 4; |
| el16a2t | 11:4907e6e7e855 | 96 | } |
| el16a2t | 11:4907e6e7e855 | 97 | if ( pad.check_event(Gamepad::B_PRESSED) == true) { |
| el16a2t | 1:a3c9025e0dad | 98 | |
| el16a2t | 11:4907e6e7e855 | 99 | x_player = x_player+20; |
| el16a2t | 11:4907e6e7e855 | 100 | } |
| el16a2t | 11:4907e6e7e855 | 101 | if (x_player >44) { |
| el16a2t | 11:4907e6e7e855 | 102 | x_player = 44; |
| el16a2t | 11:4907e6e7e855 | 103 | } |
| el16a2t | 11:4907e6e7e855 | 104 | |
| el16a2t | 1:a3c9025e0dad | 105 | |
| el16a2t | 11:4907e6e7e855 | 106 | //print road lines |
| el16a2t | 11:4907e6e7e855 | 107 | lcd.drawLine(1,1,1,1500,2); |
| el16a2t | 1:a3c9025e0dad | 108 | |
| el16a2t | 11:4907e6e7e855 | 109 | lcd.drawLine(21,1,21,1500,2); |
| el16a2t | 11:4907e6e7e855 | 110 | |
| el16a2t | 11:4907e6e7e855 | 111 | lcd.drawLine(41,1,41,1500,2); |
| el16a2t | 11:4907e6e7e855 | 112 | |
| el16a2t | 11:4907e6e7e855 | 113 | lcd.drawLine(61,1,61,1500,2); |
| el16a2t | 2:a48df109588e | 114 | |
| el16a2t | 2:a48df109588e | 115 | |
| el16a2t | 2:a48df109588e | 116 | |
| el16a2t | 2:a48df109588e | 117 | |
| el16a2t | 13:61aeeb4e4e47 | 118 | //cars move down the road: |
| el16a2t | 10:e81aacef805b | 119 | |
| el16a2t | 11:4907e6e7e855 | 120 | lcd.drawSprite(x_car,y_car,20,15,(int*) car); |
| el16a2t | 11:4907e6e7e855 | 121 | y_car++; |
| el16a2t | 11:4907e6e7e855 | 122 | lcd.drawSprite(x_car2,y_car2,20,15,(int*) car2); |
| el16a2t | 11:4907e6e7e855 | 123 | y_car2++; |
| el16a2t | 7:d1a1f7c5eb0d | 124 | |
| el16a2t | 13:61aeeb4e4e47 | 125 | // re-generate cars continously: |
| el16a2t | 13:61aeeb4e4e47 | 126 | |
| el16a2t | 13:61aeeb4e4e47 | 127 | int Index = rand() % 3; //picks a random number between 1 and 3 |
| el16a2t | 13:61aeeb4e4e47 | 128 | printf ("Index = %d\n", Index); |
| el16a2t | 13:61aeeb4e4e47 | 129 | int arr[3] = {4, 24, 44}; //array corresponding to the x values of the 3 lanes of traffic |
| el16a2t | 13:61aeeb4e4e47 | 130 | int random_number = arr[Index]; //pick number at Index value from array, assign to random_number |
| el16a2t | 13:61aeeb4e4e47 | 131 | printf ("random_number = %d\n", random_number); |
| el16a2t | 13:61aeeb4e4e47 | 132 | |
| el16a2t | 13:61aeeb4e4e47 | 133 | int Index2 = rand() % 3; |
| el16a2t | 13:61aeeb4e4e47 | 134 | int arr2[3] = {4, 24, 44}; |
| el16a2t | 13:61aeeb4e4e47 | 135 | int random_number2 = arr2[Index2]; |
| el16a2t | 7:d1a1f7c5eb0d | 136 | |
| el16a2t | 1:a3c9025e0dad | 137 | |
| el16a2t | 13:61aeeb4e4e47 | 138 | int YIndex = rand() % 5; |
| el16a2t | 13:61aeeb4e4e47 | 139 | int array[5] = {-20, -24, -28, -32, -36}; |
| el16a2t | 11:4907e6e7e855 | 140 | int nextCar = array[YIndex]; |
| el16a2t | 1:a3c9025e0dad | 141 | |
| el16a2t | 13:61aeeb4e4e47 | 142 | if (y_car == 50) { |
| el16a2t | 11:4907e6e7e855 | 143 | x_car = random_number; |
| el16a2t | 13:61aeeb4e4e47 | 144 | y_car = nextCar; |
| el16a2t | 7:d1a1f7c5eb0d | 145 | |
| el16a2t | 7:d1a1f7c5eb0d | 146 | |
| el16a2t | 11:4907e6e7e855 | 147 | } |
| el16a2t | 7:d1a1f7c5eb0d | 148 | |
| el16a2t | 13:61aeeb4e4e47 | 149 | int YIndex2 = rand() % 5; |
| el16a2t | 13:61aeeb4e4e47 | 150 | int array2[5] = {-20, -24, -28, -32, -36}; |
| el16a2t | 11:4907e6e7e855 | 151 | int nextCar2 = array2[YIndex2]; |
| el16a2t | 7:d1a1f7c5eb0d | 152 | |
| el16a2t | 13:61aeeb4e4e47 | 153 | if (y_car2 == 50) { |
| el16a2t | 11:4907e6e7e855 | 154 | x_car2 = random_number2; |
| el16a2t | 13:61aeeb4e4e47 | 155 | y_car2 = nextCar2; |
| el16a2t | 2:a48df109588e | 156 | |
| el16a2t | 7:d1a1f7c5eb0d | 157 | |
| el16a2t | 11:4907e6e7e855 | 158 | } |
| el16a2t | 2:a48df109588e | 159 | |
| el16a2t | 14:ce231137d2f2 | 160 | //following if statement stops the car sprites overlapping |
| el16a2t | 14:ce231137d2f2 | 161 | if (y_car2>y_car-20 && y_car2<y_car+20 && x_car == x_car2 && y_car2>49) { |
| el16a2t | 13:61aeeb4e4e47 | 162 | x_car2 = random_number; |
| el16a2t | 13:61aeeb4e4e47 | 163 | } |
| el16a2t | 13:61aeeb4e4e47 | 164 | |
| el16a2t | 14:ce231137d2f2 | 165 | // make it so that after the player reaches a certain score, occasionally |
| el16a2t | 14:ce231137d2f2 | 166 | //(when both oncoming cars in the same lane) one car changes lane |
| el16a2t | 14:ce231137d2f2 | 167 | //this makes it harder for the player: |
| el16a2t | 13:61aeeb4e4e47 | 168 | if (score > 500 && y_car>5 && x_car == x_car2) { |
| el16a2t | 13:61aeeb4e4e47 | 169 | x_car = random_number2; |
| el16a2t | 13:61aeeb4e4e47 | 170 | } |
| el16a2t | 13:61aeeb4e4e47 | 171 | |
| el16a2t | 13:61aeeb4e4e47 | 172 | |
| el16a2t | 2:a48df109588e | 173 | |
| el16a2t | 2:a48df109588e | 174 | |
| el16a2t | 2:a48df109588e | 175 | |
| el16a2t | 11:4907e6e7e855 | 176 | score++;//increase score |
| el16a2t | 11:4907e6e7e855 | 177 | |
| el16a2t | 11:4907e6e7e855 | 178 | // difficulty = read_pot(); |
| el16a2t | 13:61aeeb4e4e47 | 179 | sprintf (str, "%d", (score/10)); //convert an integer to pointer |
| el16a2t | 11:4907e6e7e855 | 180 | lcd.printString(str,64,1); |
| el16a2t | 1:a3c9025e0dad | 181 | |
| el16a2t | 1:a3c9025e0dad | 182 | |
| el16a2t | 11:4907e6e7e855 | 183 | //if there is a collision, display "game over" screen |
| el16a2t | 11:4907e6e7e855 | 184 | if (x_car == x_player && y_car > 12 && y_car < 50) { |
| el16a2t | 13:61aeeb4e4e47 | 185 | printf("collision1\n");// to tell with which sprite the collision was |
| el16a2t | 11:4907e6e7e855 | 186 | y_car = y_car; |
| el16a2t | 11:4907e6e7e855 | 187 | y_car2 = y_car2; |
| el16a2t | 11:4907e6e7e855 | 188 | score=score; |
| el16a2t | 11:4907e6e7e855 | 189 | lives--; |
| el16a2t | 11:4907e6e7e855 | 190 | printf("lives=%d\n", lives); |
| el16a2t | 11:4907e6e7e855 | 191 | |
| el16a2t | 11:4907e6e7e855 | 192 | } |
| el16a2t | 11:4907e6e7e855 | 193 | if (x_car2 == x_player && y_car2 > 12 && y_car2 < 50) { |
| el16a2t | 11:4907e6e7e855 | 194 | printf("collision2\n"); |
| el16a2t | 11:4907e6e7e855 | 195 | y_car2 = y_car2; |
| el16a2t | 11:4907e6e7e855 | 196 | y_car = y_car; |
| el16a2t | 11:4907e6e7e855 | 197 | score=score; |
| el16a2t | 11:4907e6e7e855 | 198 | lives--; |
| el16a2t | 11:4907e6e7e855 | 199 | printf("lives=%d\n", lives); |
| el16a2t | 11:4907e6e7e855 | 200 | |
| el16a2t | 11:4907e6e7e855 | 201 | } |
| el16a2t | 11:4907e6e7e855 | 202 | |
| el16a2t | 11:4907e6e7e855 | 203 | if ( pad.check_event(Gamepad::X_PRESSED) == true) { |
| el16a2t | 11:4907e6e7e855 | 204 | |
| el16a2t | 11:4907e6e7e855 | 205 | x_player = x_player-20; |
| el16a2t | 11:4907e6e7e855 | 206 | } |
| el16a2t | 11:4907e6e7e855 | 207 | //car cannot go further left than the left lane etc |
| el16a2t | 11:4907e6e7e855 | 208 | if (x_player <4) { |
| el16a2t | 11:4907e6e7e855 | 209 | x_player = 4; |
| el16a2t | 11:4907e6e7e855 | 210 | } |
| el16a2t | 11:4907e6e7e855 | 211 | if ( pad.check_event(Gamepad::B_PRESSED) == true) { |
| el16a2t | 11:4907e6e7e855 | 212 | |
| el16a2t | 11:4907e6e7e855 | 213 | x_player = x_player+20; |
| el16a2t | 11:4907e6e7e855 | 214 | } |
| el16a2t | 11:4907e6e7e855 | 215 | if (x_player >44) { |
| el16a2t | 11:4907e6e7e855 | 216 | x_player = 44; |
| el16a2t | 11:4907e6e7e855 | 217 | } |
| el16a2t | 11:4907e6e7e855 | 218 | |
| el16a2t | 11:4907e6e7e855 | 219 | pot_value = pad.read_pot(); |
| el16a2t | 11:4907e6e7e855 | 220 | printf("pot_value = %f\n", pot_value); |
| el16a2t | 11:4907e6e7e855 | 221 | float wait_time = pot_value/10; |
| el16a2t | 11:4907e6e7e855 | 222 | |
| el16a2t | 11:4907e6e7e855 | 223 | lcd.refresh(); |
| el16a2t | 11:4907e6e7e855 | 224 | |
| el16a2t | 11:4907e6e7e855 | 225 | wait(0.1-wait_time); |
| el16a2t | 1:a3c9025e0dad | 226 | |
| el16a2t | 1:a3c9025e0dad | 227 | |
| el16a2t | 1:a3c9025e0dad | 228 | |
| el16a2t | 1:a3c9025e0dad | 229 | |
| el16a2t | 1:a3c9025e0dad | 230 | |
| el16a2t | 1:a3c9025e0dad | 231 | |
| el16a2t | 1:a3c9025e0dad | 232 | |
| el16a2t | 11:4907e6e7e855 | 233 | |
| el16a2t | 7:d1a1f7c5eb0d | 234 | |
| el16a2t | 7:d1a1f7c5eb0d | 235 | |
| el16a2t | 2:a48df109588e | 236 | } |
| el16a2t | 1:a3c9025e0dad | 237 | |
| el16a2t | 7:d1a1f7c5eb0d | 238 | void gameOver() |
| el16a2t | 7:d1a1f7c5eb0d | 239 | { |
| el16a2t | 7:d1a1f7c5eb0d | 240 | printf("reached gameover\n"); |
| el16a2t | 11:4907e6e7e855 | 241 | if (lives ==0) { |
| el16a2t | 11:4907e6e7e855 | 242 | |
| el16a2t | 7:d1a1f7c5eb0d | 243 | |
| el16a2t | 11:4907e6e7e855 | 244 | while ( pad.check_event(Gamepad::START_PRESSED) == false) { |
| el16a2t | 11:4907e6e7e855 | 245 | |
| el16a2t | 11:4907e6e7e855 | 246 | printf("gameoverlives=%d\n", lives); |
| el16a2t | 11:4907e6e7e855 | 247 | lcd.clear(); |
| el16a2t | 10:e81aacef805b | 248 | |
| el16a2t | 11:4907e6e7e855 | 249 | lcd.printString(str,64,1); |
| el16a2t | 11:4907e6e7e855 | 250 | lcd.printString ("GAME OVER", 3,1); |
| el16a2t | 11:4907e6e7e855 | 251 | lcd.printString ("PRESS START", 3,3); |
| el16a2t | 11:4907e6e7e855 | 252 | lcd.refresh(); |
| el16a2t | 11:4907e6e7e855 | 253 | wait(0.2); |
| el16a2t | 11:4907e6e7e855 | 254 | } |
| el16a2t | 11:4907e6e7e855 | 255 | init (); |
| el16a2t | 7:d1a1f7c5eb0d | 256 | } |
| el16a2t | 11:4907e6e7e855 | 257 | } |