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
engine/main.cpp@13:61aeeb4e4e47, 2018-05-07 (annotated)
- Committer:
- el16a2t
- Date:
- Mon May 07 18:28:51 2018 +0000
- Revision:
- 13:61aeeb4e4e47
- Parent:
- 12:c36bc59d120e
made it so that randomly spawned car sprites can't overlap, by forcing one to change lanes before appearing on screen if overlap conditions fulfilled. Also introduced cars occasionally changing lanes when player reaches certain score(makes it harder)
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 | 13:61aeeb4e4e47 | 160 | if (y_car2>y_car-20 && y_car2<y_car+20 && x_car == x_car2) { |
| el16a2t | 13:61aeeb4e4e47 | 161 | x_car2 = random_number; |
| el16a2t | 13:61aeeb4e4e47 | 162 | } |
| el16a2t | 13:61aeeb4e4e47 | 163 | |
| el16a2t | 13:61aeeb4e4e47 | 164 | // make it so that when the player reaches a certain score, occasionally |
| el16a2t | 13:61aeeb4e4e47 | 165 | //(when both oncoming cars in the same lane) one of them changes lane |
| el16a2t | 13:61aeeb4e4e47 | 166 | //this makes it harder for the player |
| el16a2t | 13:61aeeb4e4e47 | 167 | if (score > 500 && y_car>5 && x_car == x_car2) { |
| el16a2t | 13:61aeeb4e4e47 | 168 | x_car = random_number2; |
| el16a2t | 13:61aeeb4e4e47 | 169 | } |
| el16a2t | 13:61aeeb4e4e47 | 170 | |
| el16a2t | 13:61aeeb4e4e47 | 171 | |
| el16a2t | 2:a48df109588e | 172 | |
| el16a2t | 2:a48df109588e | 173 | |
| el16a2t | 2:a48df109588e | 174 | |
| el16a2t | 11:4907e6e7e855 | 175 | score++;//increase score |
| el16a2t | 11:4907e6e7e855 | 176 | |
| el16a2t | 11:4907e6e7e855 | 177 | // difficulty = read_pot(); |
| el16a2t | 13:61aeeb4e4e47 | 178 | sprintf (str, "%d", (score/10)); //convert an integer to pointer |
| el16a2t | 11:4907e6e7e855 | 179 | lcd.printString(str,64,1); |
| el16a2t | 1:a3c9025e0dad | 180 | |
| el16a2t | 1:a3c9025e0dad | 181 | |
| el16a2t | 11:4907e6e7e855 | 182 | //if there is a collision, display "game over" screen |
| el16a2t | 11:4907e6e7e855 | 183 | if (x_car == x_player && y_car > 12 && y_car < 50) { |
| el16a2t | 13:61aeeb4e4e47 | 184 | printf("collision1\n");// to tell with which sprite the collision was |
| el16a2t | 11:4907e6e7e855 | 185 | y_car = y_car; |
| el16a2t | 11:4907e6e7e855 | 186 | y_car2 = y_car2; |
| el16a2t | 11:4907e6e7e855 | 187 | score=score; |
| el16a2t | 11:4907e6e7e855 | 188 | lives--; |
| el16a2t | 11:4907e6e7e855 | 189 | printf("lives=%d\n", lives); |
| el16a2t | 11:4907e6e7e855 | 190 | |
| el16a2t | 11:4907e6e7e855 | 191 | } |
| el16a2t | 11:4907e6e7e855 | 192 | if (x_car2 == x_player && y_car2 > 12 && y_car2 < 50) { |
| el16a2t | 11:4907e6e7e855 | 193 | printf("collision2\n"); |
| el16a2t | 11:4907e6e7e855 | 194 | y_car2 = y_car2; |
| el16a2t | 11:4907e6e7e855 | 195 | y_car = y_car; |
| el16a2t | 11:4907e6e7e855 | 196 | score=score; |
| el16a2t | 11:4907e6e7e855 | 197 | lives--; |
| el16a2t | 11:4907e6e7e855 | 198 | printf("lives=%d\n", lives); |
| el16a2t | 11:4907e6e7e855 | 199 | |
| el16a2t | 11:4907e6e7e855 | 200 | } |
| el16a2t | 11:4907e6e7e855 | 201 | |
| el16a2t | 11:4907e6e7e855 | 202 | if ( pad.check_event(Gamepad::X_PRESSED) == true) { |
| el16a2t | 11:4907e6e7e855 | 203 | |
| el16a2t | 11:4907e6e7e855 | 204 | x_player = x_player-20; |
| el16a2t | 11:4907e6e7e855 | 205 | } |
| el16a2t | 11:4907e6e7e855 | 206 | //car cannot go further left than the left lane etc |
| el16a2t | 11:4907e6e7e855 | 207 | if (x_player <4) { |
| el16a2t | 11:4907e6e7e855 | 208 | x_player = 4; |
| el16a2t | 11:4907e6e7e855 | 209 | } |
| el16a2t | 11:4907e6e7e855 | 210 | if ( pad.check_event(Gamepad::B_PRESSED) == true) { |
| el16a2t | 11:4907e6e7e855 | 211 | |
| el16a2t | 11:4907e6e7e855 | 212 | x_player = x_player+20; |
| el16a2t | 11:4907e6e7e855 | 213 | } |
| el16a2t | 11:4907e6e7e855 | 214 | if (x_player >44) { |
| el16a2t | 11:4907e6e7e855 | 215 | x_player = 44; |
| el16a2t | 11:4907e6e7e855 | 216 | } |
| el16a2t | 11:4907e6e7e855 | 217 | |
| el16a2t | 11:4907e6e7e855 | 218 | pot_value = pad.read_pot(); |
| el16a2t | 11:4907e6e7e855 | 219 | printf("pot_value = %f\n", pot_value); |
| el16a2t | 11:4907e6e7e855 | 220 | float wait_time = pot_value/10; |
| el16a2t | 11:4907e6e7e855 | 221 | |
| el16a2t | 11:4907e6e7e855 | 222 | lcd.refresh(); |
| el16a2t | 11:4907e6e7e855 | 223 | |
| el16a2t | 11:4907e6e7e855 | 224 | wait(0.1-wait_time); |
| el16a2t | 1:a3c9025e0dad | 225 | |
| 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 | 11:4907e6e7e855 | 232 | |
| el16a2t | 7:d1a1f7c5eb0d | 233 | |
| el16a2t | 7:d1a1f7c5eb0d | 234 | |
| el16a2t | 2:a48df109588e | 235 | } |
| el16a2t | 1:a3c9025e0dad | 236 | |
| el16a2t | 7:d1a1f7c5eb0d | 237 | void gameOver() |
| el16a2t | 7:d1a1f7c5eb0d | 238 | { |
| el16a2t | 7:d1a1f7c5eb0d | 239 | printf("reached gameover\n"); |
| el16a2t | 11:4907e6e7e855 | 240 | if (lives ==0) { |
| el16a2t | 11:4907e6e7e855 | 241 | |
| el16a2t | 7:d1a1f7c5eb0d | 242 | |
| el16a2t | 11:4907e6e7e855 | 243 | while ( pad.check_event(Gamepad::START_PRESSED) == false) { |
| el16a2t | 11:4907e6e7e855 | 244 | |
| el16a2t | 11:4907e6e7e855 | 245 | printf("gameoverlives=%d\n", lives); |
| el16a2t | 11:4907e6e7e855 | 246 | lcd.clear(); |
| el16a2t | 10:e81aacef805b | 247 | |
| el16a2t | 11:4907e6e7e855 | 248 | lcd.printString(str,64,1); |
| el16a2t | 11:4907e6e7e855 | 249 | lcd.printString ("GAME OVER", 3,1); |
| el16a2t | 11:4907e6e7e855 | 250 | lcd.printString ("PRESS START", 3,3); |
| el16a2t | 11:4907e6e7e855 | 251 | lcd.refresh(); |
| el16a2t | 11:4907e6e7e855 | 252 | wait(0.2); |
| el16a2t | 11:4907e6e7e855 | 253 | } |
| el16a2t | 11:4907e6e7e855 | 254 | init (); |
| el16a2t | 7:d1a1f7c5eb0d | 255 | } |
| el16a2t | 11:4907e6e7e855 | 256 | } |