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@10:e81aacef805b, 2018-05-06 (annotated)
- Committer:
- el16a2t
- Date:
- Sun May 06 21:45:41 2018 +0000
- Revision:
- 10:e81aacef805b
- Parent:
- 9:514c6f98ca5a
- Child:
- 11:4907e6e7e855
randomised when the next car spawns down the screen by using a range of values in an array that selects at which y value the next car spawns
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 | 8:8d25574b14cd | 50 | |
| el16a2t | 7:d1a1f7c5eb0d | 51 | |
| el16a2t | 8:8d25574b14cd | 52 | |
| el16a2t | 7:d1a1f7c5eb0d | 53 | x_car = 4; |
| el16a2t | 7:d1a1f7c5eb0d | 54 | y_car = 0; |
| el16a2t | 8:8d25574b14cd | 55 | x_car2 = 24; |
| el16a2t | 10:e81aacef805b | 56 | y_car2 = -50; |
| el16a2t | 7:d1a1f7c5eb0d | 57 | |
| el16a2t | 7:d1a1f7c5eb0d | 58 | |
| el16a2t | 7:d1a1f7c5eb0d | 59 | //(re)set score to 0 |
| el16a2t | 7:d1a1f7c5eb0d | 60 | score = 0; |
| el16a2t | 2:a48df109588e | 61 | } |
| el16a2t | 1:a3c9025e0dad | 62 | |
| el16a2t | 2:a48df109588e | 63 | |
| el16a2t | 2:a48df109588e | 64 | void startUp() |
| el16a2t | 2:a48df109588e | 65 | { |
| el16a2t | 2:a48df109588e | 66 | //print start screen |
| el16a2t | 9:514c6f98ca5a | 67 | lcd.drawSprite (1,1,20,70,(int*) titlescreen); |
| el16a2t | 9:514c6f98ca5a | 68 | lcd.printString ("PRESS START", 3,4); |
| el16a2t | 2:a48df109588e | 69 | lcd.refresh(); |
| el16a2t | 2:a48df109588e | 70 | while ( pad.check_event(Gamepad::START_PRESSED) == false) { |
| el16a2t | 2:a48df109588e | 71 | |
| el16a2t | 2:a48df109588e | 72 | } |
| el16a2t | 2:a48df109588e | 73 | } |
| el16a2t | 2:a48df109588e | 74 | |
| el16a2t | 4:a6ca44e29e97 | 75 | |
| el16a2t | 2:a48df109588e | 76 | |
| el16a2t | 8:8d25574b14cd | 77 | void newGame() |
| el16a2t | 8:8d25574b14cd | 78 | { |
| el16a2t | 8:8d25574b14cd | 79 | printf("newgamereached\n"); //checking if new game function reached |
| el16a2t | 2:a48df109588e | 80 | |
| el16a2t | 8:8d25574b14cd | 81 | int Index = rand() % 3; //picks a random number between 1 and 3 |
| el16a2t | 8:8d25574b14cd | 82 | printf ("Index = %d\n", Index); |
| el16a2t | 8:8d25574b14cd | 83 | int arr[3] = {4, 24, 44}; //array corresponding to the x values of the 3 lanes of traffic |
| el16a2t | 8:8d25574b14cd | 84 | int random_number = arr[Index]; //pick number at Index value from array, assign to random_number |
| el16a2t | 8:8d25574b14cd | 85 | printf ("random_number = %d\n", random_number); |
| el16a2t | 10:e81aacef805b | 86 | |
| el16a2t | 10:e81aacef805b | 87 | |
| el16a2t | 1:a3c9025e0dad | 88 | |
| el16a2t | 10:e81aacef805b | 89 | |
| el16a2t | 1:a3c9025e0dad | 90 | lcd.clear(); |
| el16a2t | 1:a3c9025e0dad | 91 | |
| el16a2t | 8:8d25574b14cd | 92 | lcd.drawSprite(x_player,y_player,20,15,(int*) player); //print the player sprite |
| el16a2t | 8:8d25574b14cd | 93 | |
| el16a2t | 7:d1a1f7c5eb0d | 94 | //if X pressed, move player left, if B pressed, move player right |
| el16a2t | 2:a48df109588e | 95 | if ( pad.check_event(Gamepad::X_PRESSED) == true) { |
| el16a2t | 1:a3c9025e0dad | 96 | |
| el16a2t | 1:a3c9025e0dad | 97 | x_player = x_player-20; |
| el16a2t | 1:a3c9025e0dad | 98 | } |
| el16a2t | 7:d1a1f7c5eb0d | 99 | //car cannot go further left than the left lane etc |
| el16a2t | 1:a3c9025e0dad | 100 | if (x_player <4) { |
| el16a2t | 1:a3c9025e0dad | 101 | x_player = 4; |
| el16a2t | 1:a3c9025e0dad | 102 | } |
| el16a2t | 2:a48df109588e | 103 | if ( pad.check_event(Gamepad::B_PRESSED) == true) { |
| el16a2t | 1:a3c9025e0dad | 104 | |
| el16a2t | 1:a3c9025e0dad | 105 | x_player = x_player+20; |
| el16a2t | 1:a3c9025e0dad | 106 | } |
| el16a2t | 1:a3c9025e0dad | 107 | if (x_player >44) { |
| el16a2t | 1:a3c9025e0dad | 108 | x_player = 44; |
| el16a2t | 1:a3c9025e0dad | 109 | } |
| el16a2t | 1:a3c9025e0dad | 110 | |
| el16a2t | 7:d1a1f7c5eb0d | 111 | |
| el16a2t | 8:8d25574b14cd | 112 | //print road lines |
| el16a2t | 7:d1a1f7c5eb0d | 113 | lcd.drawLine(1,1,1,1500,2); |
| el16a2t | 1:a3c9025e0dad | 114 | |
| el16a2t | 7:d1a1f7c5eb0d | 115 | lcd.drawLine(21,1,21,1500,2); |
| el16a2t | 1:a3c9025e0dad | 116 | |
| el16a2t | 7:d1a1f7c5eb0d | 117 | lcd.drawLine(41,1,41,1500,2); |
| el16a2t | 1:a3c9025e0dad | 118 | |
| el16a2t | 7:d1a1f7c5eb0d | 119 | lcd.drawLine(61,1,61,1500,2); |
| el16a2t | 2:a48df109588e | 120 | |
| el16a2t | 2:a48df109588e | 121 | |
| el16a2t | 2:a48df109588e | 122 | |
| el16a2t | 2:a48df109588e | 123 | |
| el16a2t | 8:8d25574b14cd | 124 | //cars move down the road |
| el16a2t | 2:a48df109588e | 125 | |
| el16a2t | 2:a48df109588e | 126 | lcd.drawSprite(x_car,y_car,20,15,(int*) car); |
| el16a2t | 2:a48df109588e | 127 | y_car++; |
| el16a2t | 4:a6ca44e29e97 | 128 | lcd.drawSprite(x_car2,y_car2,20,15,(int*) car2); |
| el16a2t | 4:a6ca44e29e97 | 129 | y_car2++; |
| el16a2t | 7:d1a1f7c5eb0d | 130 | |
| el16a2t | 8:8d25574b14cd | 131 | // re-generate cars continously |
| el16a2t | 7:d1a1f7c5eb0d | 132 | |
| el16a2t | 10:e81aacef805b | 133 | |
| el16a2t | 10:e81aacef805b | 134 | int YIndex = rand() % 4; |
| el16a2t | 10:e81aacef805b | 135 | int array[5] = {50, 55, 60, 65, 70}; |
| el16a2t | 10:e81aacef805b | 136 | int nextCar = array[YIndex]; |
| el16a2t | 10:e81aacef805b | 137 | |
| el16a2t | 10:e81aacef805b | 138 | if (y_car2 == nextCar) { |
| el16a2t | 8:8d25574b14cd | 139 | x_car2 = random_number; |
| el16a2t | 7:d1a1f7c5eb0d | 140 | y_car2 = -24; |
| el16a2t | 7:d1a1f7c5eb0d | 141 | |
| el16a2t | 7:d1a1f7c5eb0d | 142 | |
| el16a2t | 10:e81aacef805b | 143 | } |
| el16a2t | 10:e81aacef805b | 144 | |
| el16a2t | 10:e81aacef805b | 145 | if (y_car == nextCar) { |
| el16a2t | 8:8d25574b14cd | 146 | x_car = random_number; |
| el16a2t | 7:d1a1f7c5eb0d | 147 | y_car = -24; |
| el16a2t | 7:d1a1f7c5eb0d | 148 | |
| el16a2t | 7:d1a1f7c5eb0d | 149 | |
| el16a2t | 7:d1a1f7c5eb0d | 150 | } |
| el16a2t | 7:d1a1f7c5eb0d | 151 | |
| el16a2t | 7:d1a1f7c5eb0d | 152 | |
| el16a2t | 1:a3c9025e0dad | 153 | |
| el16a2t | 8:8d25574b14cd | 154 | |
| el16a2t | 8:8d25574b14cd | 155 | score++;//increase score |
| el16a2t | 1:a3c9025e0dad | 156 | |
| el16a2t | 2:a48df109588e | 157 | // difficulty = read_pot(); |
| el16a2t | 8:8d25574b14cd | 158 | sprintf (str, "%d", score); //convert an integer to pointer |
| el16a2t | 2:a48df109588e | 159 | lcd.printString(str,64,1); |
| el16a2t | 7:d1a1f7c5eb0d | 160 | |
| el16a2t | 7:d1a1f7c5eb0d | 161 | |
| el16a2t | 8:8d25574b14cd | 162 | //if there is a collision, display "game over" screen |
| el16a2t | 8:8d25574b14cd | 163 | if (x_car == x_player && y_car > 12 && y_car < 50) { |
| el16a2t | 8:8d25574b14cd | 164 | printf("collision1\n");// so i can tell which car sprite the collision was with |
| el16a2t | 7:d1a1f7c5eb0d | 165 | y_car = y_car; |
| el16a2t | 6:933bb2b03b38 | 166 | y_car2 = y_car2; |
| el16a2t | 6:933bb2b03b38 | 167 | score=score; |
| el16a2t | 7:d1a1f7c5eb0d | 168 | lives--; |
| el16a2t | 7:d1a1f7c5eb0d | 169 | printf("lives=%d\n", lives); |
| el16a2t | 7:d1a1f7c5eb0d | 170 | |
| el16a2t | 7:d1a1f7c5eb0d | 171 | } |
| el16a2t | 8:8d25574b14cd | 172 | if (x_car2 == x_player && y_car2 > 12 && y_car2 < 50) { |
| el16a2t | 7:d1a1f7c5eb0d | 173 | printf("collision2\n"); |
| el16a2t | 7:d1a1f7c5eb0d | 174 | y_car2 = y_car2; |
| el16a2t | 6:933bb2b03b38 | 175 | y_car = y_car; |
| el16a2t | 4:a6ca44e29e97 | 176 | score=score; |
| el16a2t | 7:d1a1f7c5eb0d | 177 | lives--; |
| el16a2t | 7:d1a1f7c5eb0d | 178 | printf("lives=%d\n", lives); |
| el16a2t | 7:d1a1f7c5eb0d | 179 | |
| el16a2t | 7:d1a1f7c5eb0d | 180 | } |
| el16a2t | 7:d1a1f7c5eb0d | 181 | |
| el16a2t | 7:d1a1f7c5eb0d | 182 | if ( pad.check_event(Gamepad::X_PRESSED) == true) { |
| el16a2t | 2:a48df109588e | 183 | |
| el16a2t | 7:d1a1f7c5eb0d | 184 | x_player = x_player-20; |
| el16a2t | 7:d1a1f7c5eb0d | 185 | } |
| el16a2t | 7:d1a1f7c5eb0d | 186 | //car cannot go further left than the left lane etc |
| el16a2t | 7:d1a1f7c5eb0d | 187 | if (x_player <4) { |
| el16a2t | 7:d1a1f7c5eb0d | 188 | x_player = 4; |
| el16a2t | 7:d1a1f7c5eb0d | 189 | } |
| el16a2t | 7:d1a1f7c5eb0d | 190 | if ( pad.check_event(Gamepad::B_PRESSED) == true) { |
| el16a2t | 7:d1a1f7c5eb0d | 191 | |
| el16a2t | 7:d1a1f7c5eb0d | 192 | x_player = x_player+20; |
| el16a2t | 7:d1a1f7c5eb0d | 193 | } |
| el16a2t | 7:d1a1f7c5eb0d | 194 | if (x_player >44) { |
| el16a2t | 7:d1a1f7c5eb0d | 195 | x_player = 44; |
| el16a2t | 7:d1a1f7c5eb0d | 196 | } |
| el16a2t | 2:a48df109588e | 197 | |
| el16a2t | 2:a48df109588e | 198 | |
| el16a2t | 2:a48df109588e | 199 | |
| el16a2t | 2:a48df109588e | 200 | |
| el16a2t | 1:a3c9025e0dad | 201 | |
| el16a2t | 1:a3c9025e0dad | 202 | |
| el16a2t | 1:a3c9025e0dad | 203 | lcd.refresh(); |
| el16a2t | 6:933bb2b03b38 | 204 | //control the wait time using the potentiometer value to control difficulty |
| el16a2t | 6:933bb2b03b38 | 205 | //lower potentiometer = easier difficulty = longer wait time = cars and score move slower |
| el16a2t | 7:d1a1f7c5eb0d | 206 | //e.g - use wait(1-potentiometer value) where potentiometer value 0<x<1 is difficulty |
| el16a2t | 2:a48df109588e | 207 | wait(0.1); |
| el16a2t | 1:a3c9025e0dad | 208 | |
| el16a2t | 1:a3c9025e0dad | 209 | |
| el16a2t | 1:a3c9025e0dad | 210 | |
| el16a2t | 1:a3c9025e0dad | 211 | |
| el16a2t | 1:a3c9025e0dad | 212 | |
| el16a2t | 1:a3c9025e0dad | 213 | |
| el16a2t | 1:a3c9025e0dad | 214 | |
| el16a2t | 4:a6ca44e29e97 | 215 | |
| el16a2t | 7:d1a1f7c5eb0d | 216 | |
| el16a2t | 7:d1a1f7c5eb0d | 217 | |
| el16a2t | 2:a48df109588e | 218 | } |
| el16a2t | 1:a3c9025e0dad | 219 | |
| el16a2t | 7:d1a1f7c5eb0d | 220 | void gameOver() |
| el16a2t | 7:d1a1f7c5eb0d | 221 | { |
| el16a2t | 7:d1a1f7c5eb0d | 222 | printf("reached gameover\n"); |
| el16a2t | 7:d1a1f7c5eb0d | 223 | if (lives ==0){ |
| el16a2t | 7:d1a1f7c5eb0d | 224 | |
| el16a2t | 7:d1a1f7c5eb0d | 225 | |
| el16a2t | 7:d1a1f7c5eb0d | 226 | while ( pad.check_event(Gamepad::START_PRESSED) == false) { |
| el16a2t | 7:d1a1f7c5eb0d | 227 | |
| el16a2t | 7:d1a1f7c5eb0d | 228 | printf("gameoverlives=%d\n", lives); |
| el16a2t | 4:a6ca44e29e97 | 229 | lcd.clear(); |
| el16a2t | 10:e81aacef805b | 230 | |
| el16a2t | 4:a6ca44e29e97 | 231 | lcd.printString(str,64,1); |
| el16a2t | 4:a6ca44e29e97 | 232 | lcd.printString ("GAME OVER", 3,1); |
| el16a2t | 7:d1a1f7c5eb0d | 233 | lcd.printString ("PRESS START", 3,3); |
| el16a2t | 10:e81aacef805b | 234 | lcd.refresh(); |
| el16a2t | 7:d1a1f7c5eb0d | 235 | wait(0.2); |
| el16a2t | 7:d1a1f7c5eb0d | 236 | } |
| el16a2t | 7:d1a1f7c5eb0d | 237 | init (); |
| el16a2t | 7:d1a1f7c5eb0d | 238 | }} |