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
Game/Game.cpp@7:8d381315f72c, 2020-05-26 (annotated)
- Committer:
- ale_carb0ni
- Date:
- Tue May 26 22:53:42 2020 +0000
- Revision:
- 7:8d381315f72c
- Parent:
- 6:a2c72def99f9
Final Submission. I have read and agreed with Statement of Academic Integrity.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
ale_carb0ni | 2:7fa08670b1fc | 1 | #include "Game.h" |
ale_carb0ni | 2:7fa08670b1fc | 2 | #include "mbed.h" |
ale_carb0ni | 2:7fa08670b1fc | 3 | #include "Gamepad.h" |
ale_carb0ni | 2:7fa08670b1fc | 4 | #include "N5110.h" |
ale_carb0ni | 2:7fa08670b1fc | 5 | #include "Menu.h" |
ale_carb0ni | 2:7fa08670b1fc | 6 | |
ale_carb0ni | 7:8d381315f72c | 7 | //initialise the game |
ale_carb0ni | 2:7fa08670b1fc | 8 | Game::Game() |
ale_carb0ni | 2:7fa08670b1fc | 9 | { |
ale_carb0ni | 7:8d381315f72c | 10 | x = 4; //sets initial x position to 4 |
ale_carb0ni | 7:8d381315f72c | 11 | y = 4; //sets initial y position to 4 |
ale_carb0ni | 7:8d381315f72c | 12 | /*creates the array for the possible x coordinates the fruit can have |
ale_carb0ni | 7:8d381315f72c | 13 | in order to be always alligned with the snake and stay inside the field*/ |
ale_carb0ni | 7:8d381315f72c | 14 | for (int i = 0; i < 16; i++) { |
ale_carb0ni | 7:8d381315f72c | 15 | fruitX[i] = 3 + i*5; |
ale_carb0ni | 2:7fa08670b1fc | 16 | } |
ale_carb0ni | 7:8d381315f72c | 17 | /*creates the array for the possible y coordinates the fruit can have |
ale_carb0ni | 7:8d381315f72c | 18 | in order to be always alligned with the snake and stay inside the field*/ |
ale_carb0ni | 7:8d381315f72c | 19 | for (int i = 0; i < 9; i++) { |
ale_carb0ni | 7:8d381315f72c | 20 | fruitY[i] = 3 + i*5; |
ale_carb0ni | 7:8d381315f72c | 21 | } |
ale_carb0ni | 7:8d381315f72c | 22 | score = 0; //initial score is 0 |
ale_carb0ni | 7:8d381315f72c | 23 | a = 0; //used to select the direction based ont what button is pressed |
ale_carb0ni | 7:8d381315f72c | 24 | ntail = 0; //used to increase lenght of the tail, initially set to 0 |
ale_carb0ni | 2:7fa08670b1fc | 25 | k = 0; |
ale_carb0ni | 7:8d381315f72c | 26 | rx = rand() % 16; //choses a random number between 1 and 16, assigning it to the corresponding value in the for loop (x axis) |
ale_carb0ni | 7:8d381315f72c | 27 | ry = rand() % 9; //same as the previous line but between 1 and 9 for the y axis |
ale_carb0ni | 7:8d381315f72c | 28 | fruitX1 = fruitX[rx]+1; //this line and the following calculate the center |
ale_carb0ni | 7:8d381315f72c | 29 | fruitY1 = fruitY[ry]+1; // point of the fruit needed to register the overlap with the head |
ale_carb0ni | 7:8d381315f72c | 30 | x_pos.push_back(4); //adds initial x coordinate to the movement vector |
ale_carb0ni | 7:8d381315f72c | 31 | y_pos.push_back(4); //adds initial y coordinate to the movement vector |
ale_carb0ni | 2:7fa08670b1fc | 32 | } |
ale_carb0ni | 2:7fa08670b1fc | 33 | |
ale_carb0ni | 2:7fa08670b1fc | 34 | void Game::movement(Gamepad &pad) |
ale_carb0ni | 2:7fa08670b1fc | 35 | { |
ale_carb0ni | 7:8d381315f72c | 36 | /*registers what button is being pressed, |
ale_carb0ni | 7:8d381315f72c | 37 | associating it to an integer value |
ale_carb0ni | 7:8d381315f72c | 38 | between 1 and 4 |
ale_carb0ni | 7:8d381315f72c | 39 | the second condition in each loop |
ale_carb0ni | 7:8d381315f72c | 40 | is needed to prevent the snake from |
ale_carb0ni | 7:8d381315f72c | 41 | going backwards on itself*/ |
ale_carb0ni | 7:8d381315f72c | 42 | if (pad.Y_held() && !(a == 2)) { |
ale_carb0ni | 7:8d381315f72c | 43 | a = 1; |
ale_carb0ni | 7:8d381315f72c | 44 | } |
ale_carb0ni | 7:8d381315f72c | 45 | if (pad.A_held() && !(a == 1)) { |
ale_carb0ni | 7:8d381315f72c | 46 | a = 2; |
ale_carb0ni | 7:8d381315f72c | 47 | } |
ale_carb0ni | 2:7fa08670b1fc | 48 | if (pad.X_held() && !(a == 4)) { |
ale_carb0ni | 2:7fa08670b1fc | 49 | a = 3; |
ale_carb0ni | 2:7fa08670b1fc | 50 | } |
ale_carb0ni | 2:7fa08670b1fc | 51 | if (pad.B_held() && !(a == 3)) { |
ale_carb0ni | 2:7fa08670b1fc | 52 | a = 4; |
ale_carb0ni | 2:7fa08670b1fc | 53 | } |
ale_carb0ni | 4:17d5b53b8815 | 54 | } |
ale_carb0ni | 4:17d5b53b8815 | 55 | |
ale_carb0ni | 4:17d5b53b8815 | 56 | void Game::updating_position() |
ale_carb0ni | 4:17d5b53b8815 | 57 | { |
ale_carb0ni | 7:8d381315f72c | 58 | /*reads the integer value stored in the prevoius function |
ale_carb0ni | 7:8d381315f72c | 59 | and depending on its value decides which way the snake moves*/ |
ale_carb0ni | 7:8d381315f72c | 60 | if (a == 1) { |
ale_carb0ni | 7:8d381315f72c | 61 | x += -5; //left |
ale_carb0ni | 2:7fa08670b1fc | 62 | } |
ale_carb0ni | 2:7fa08670b1fc | 63 | if (a == 2) { |
ale_carb0ni | 7:8d381315f72c | 64 | x += 5; //right |
ale_carb0ni | 2:7fa08670b1fc | 65 | } |
ale_carb0ni | 2:7fa08670b1fc | 66 | if (a == 3) { |
ale_carb0ni | 7:8d381315f72c | 67 | y += -5; //up |
ale_carb0ni | 2:7fa08670b1fc | 68 | } |
ale_carb0ni | 2:7fa08670b1fc | 69 | if (a == 4) { |
ale_carb0ni | 7:8d381315f72c | 70 | y += 5; //down |
ale_carb0ni | 2:7fa08670b1fc | 71 | } |
ale_carb0ni | 2:7fa08670b1fc | 72 | |
ale_carb0ni | 2:7fa08670b1fc | 73 | int prevX = x_pos[0]; |
ale_carb0ni | 2:7fa08670b1fc | 74 | int prevY = y_pos[0]; |
ale_carb0ni | 2:7fa08670b1fc | 75 | |
ale_carb0ni | 2:7fa08670b1fc | 76 | x_pos[0] = x; |
ale_carb0ni | 2:7fa08670b1fc | 77 | y_pos[0] = y; |
ale_carb0ni | 2:7fa08670b1fc | 78 | |
ale_carb0ni | 7:8d381315f72c | 79 | /*adds each new segment's coordinates to the |
ale_carb0ni | 7:8d381315f72c | 80 | movement vector in order to give each |
ale_carb0ni | 7:8d381315f72c | 81 | section the same movement*/ |
ale_carb0ni | 7:8d381315f72c | 82 | if (!(ntail + 1 == x_pos.size())) { |
ale_carb0ni | 7:8d381315f72c | 83 | x_pos.push_back(x_pos[ntail - 1]); |
ale_carb0ni | 7:8d381315f72c | 84 | y_pos.push_back(y_pos[ntail - 1]); |
ale_carb0ni | 2:7fa08670b1fc | 85 | } |
ale_carb0ni | 2:7fa08670b1fc | 86 | |
ale_carb0ni | 2:7fa08670b1fc | 87 | if (x_pos.size() > 0) { |
ale_carb0ni | 7:8d381315f72c | 88 | /*regulates the movement of the snake |
ale_carb0ni | 7:8d381315f72c | 89 | having each section move to the previous |
ale_carb0ni | 7:8d381315f72c | 90 | coordinates of the segment in front of it*/ |
ale_carb0ni | 7:8d381315f72c | 91 | for (int i = 0; i < x_pos.size() - 1; i++) { |
ale_carb0ni | 7:8d381315f72c | 92 | x_pos[x_pos.size() - i - 1] = x_pos[x_pos.size() - i - 2]; |
ale_carb0ni | 7:8d381315f72c | 93 | y_pos[y_pos.size() - i - 1] = y_pos[y_pos.size() - i - 2]; |
ale_carb0ni | 2:7fa08670b1fc | 94 | } |
ale_carb0ni | 2:7fa08670b1fc | 95 | x_pos[1] = prevX; |
ale_carb0ni | 2:7fa08670b1fc | 96 | y_pos[1] = prevY; |
ale_carb0ni | 2:7fa08670b1fc | 97 | } |
ale_carb0ni | 2:7fa08670b1fc | 98 | } |
ale_carb0ni | 2:7fa08670b1fc | 99 | |
ale_carb0ni | 3:c61d0c70eda4 | 100 | int Game::death(N5110 &lcd,Gamepad &pad) |
ale_carb0ni | 2:7fa08670b1fc | 101 | { |
ale_carb0ni | 7:8d381315f72c | 102 | //if you hit the side walls you die |
ale_carb0ni | 7:8d381315f72c | 103 | if (x < 1 || x > WIDTH-2) { |
ale_carb0ni | 2:7fa08670b1fc | 104 | while (1) { |
ale_carb0ni | 2:7fa08670b1fc | 105 | gameover(lcd, pad); |
ale_carb0ni | 7:8d381315f72c | 106 | if (pad.B_held()) { |
ale_carb0ni | 7:8d381315f72c | 107 | //if you press start you will go back to the menu |
ale_carb0ni | 6:a2c72def99f9 | 108 | return 1; |
ale_carb0ni | 2:7fa08670b1fc | 109 | } |
ale_carb0ni | 7:8d381315f72c | 110 | if (pad.start_held()) { |
ale_carb0ni | 7:8d381315f72c | 111 | //if you press B, you will initiate a new game |
ale_carb0ni | 6:a2c72def99f9 | 112 | return 2; |
ale_carb0ni | 2:7fa08670b1fc | 113 | } |
ale_carb0ni | 2:7fa08670b1fc | 114 | } |
ale_carb0ni | 2:7fa08670b1fc | 115 | } |
ale_carb0ni | 7:8d381315f72c | 116 | |
ale_carb0ni | 7:8d381315f72c | 117 | //if you hit the top or bottom walls you die |
ale_carb0ni | 7:8d381315f72c | 118 | if (y < 1 || y > HEIGHT) { |
ale_carb0ni | 2:7fa08670b1fc | 119 | while (1) { |
ale_carb0ni | 2:7fa08670b1fc | 120 | gameover(lcd, pad); |
ale_carb0ni | 2:7fa08670b1fc | 121 | if (pad.B_held()) { |
ale_carb0ni | 6:a2c72def99f9 | 122 | return 1; |
ale_carb0ni | 2:7fa08670b1fc | 123 | } |
ale_carb0ni | 2:7fa08670b1fc | 124 | if (pad.start_held()) { |
ale_carb0ni | 6:a2c72def99f9 | 125 | return 2; |
ale_carb0ni | 2:7fa08670b1fc | 126 | } |
ale_carb0ni | 2:7fa08670b1fc | 127 | } |
ale_carb0ni | 2:7fa08670b1fc | 128 | } |
ale_carb0ni | 7:8d381315f72c | 129 | //if you hit any part of your tail you die |
ale_carb0ni | 7:8d381315f72c | 130 | for (int i = 1; i < x_pos.size(); i++) { |
ale_carb0ni | 2:7fa08670b1fc | 131 | if (x_pos[0] == x_pos[i] && y_pos[0] == y_pos[i]) { |
ale_carb0ni | 2:7fa08670b1fc | 132 | while (1) { |
ale_carb0ni | 2:7fa08670b1fc | 133 | gameover(lcd, pad); |
ale_carb0ni | 2:7fa08670b1fc | 134 | if (pad.B_held()) { |
ale_carb0ni | 6:a2c72def99f9 | 135 | return 1; |
ale_carb0ni | 2:7fa08670b1fc | 136 | } |
ale_carb0ni | 2:7fa08670b1fc | 137 | if (pad.start_held()) { |
ale_carb0ni | 6:a2c72def99f9 | 138 | return 2; |
ale_carb0ni | 2:7fa08670b1fc | 139 | } |
ale_carb0ni | 2:7fa08670b1fc | 140 | } |
ale_carb0ni | 2:7fa08670b1fc | 141 | } |
ale_carb0ni | 2:7fa08670b1fc | 142 | } |
ale_carb0ni | 7:8d381315f72c | 143 | return 0; //if 0 is returned, there is no gamover and the game goes on |
ale_carb0ni | 2:7fa08670b1fc | 144 | } |
ale_carb0ni | 2:7fa08670b1fc | 145 | |
ale_carb0ni | 2:7fa08670b1fc | 146 | void Game::draw(N5110 &lcd,Gamepad &pad) |
ale_carb0ni | 2:7fa08670b1fc | 147 | { |
ale_carb0ni | 2:7fa08670b1fc | 148 | lcd.clear(); |
ale_carb0ni | 7:8d381315f72c | 149 | lcd.drawRect(1,1,WIDTH-2,HEIGHT-1,FILL_TRANSPARENT); //rectangle around border of field |
ale_carb0ni | 7:8d381315f72c | 150 | lcd.drawRect(fruitX[rx],fruitY[ry],3,3,FILL_BLACK); //fruit on the field |
ale_carb0ni | 7:8d381315f72c | 151 | lcd.drawCircle(x,y,2,FILL_TRANSPARENT); //initial snake design |
ale_carb0ni | 2:7fa08670b1fc | 152 | //printf("size of vector %d\n", x_pos.size()); |
ale_carb0ni | 2:7fa08670b1fc | 153 | for (k = 1; k <= ntail; k++) { |
ale_carb0ni | 7:8d381315f72c | 154 | lcd.drawCircle(x_pos[k],y_pos[k],2,FILL_TRANSPARENT); //draws each new segment of the snake |
ale_carb0ni | 2:7fa08670b1fc | 155 | //printf("draw \n"); |
ale_carb0ni | 2:7fa08670b1fc | 156 | } |
ale_carb0ni | 6:a2c72def99f9 | 157 | lcd.refresh(); |
ale_carb0ni | 2:7fa08670b1fc | 158 | //printf("Fruit x coordinate: %d\n", fruitX1); |
ale_carb0ni | 2:7fa08670b1fc | 159 | //printf("Fruit y coordinate: %d\n", fruitY1); |
ale_carb0ni | 2:7fa08670b1fc | 160 | //printf("Snake x: %d\n", x); |
ale_carb0ni | 2:7fa08670b1fc | 161 | //printf("Snake y: %d\n", y); |
ale_carb0ni | 2:7fa08670b1fc | 162 | //printf("seg1 x: %d\n", x_pos[1]); |
ale_carb0ni | 2:7fa08670b1fc | 163 | //printf("seg1 y: %d\n", y_pos[1]); |
ale_carb0ni | 2:7fa08670b1fc | 164 | } |
ale_carb0ni | 2:7fa08670b1fc | 165 | |
ale_carb0ni | 2:7fa08670b1fc | 166 | void Game::gameover(N5110 &lcd,Gamepad &pad) |
ale_carb0ni | 2:7fa08670b1fc | 167 | { |
ale_carb0ni | 7:8d381315f72c | 168 | //display of the gameover screen |
ale_carb0ni | 2:7fa08670b1fc | 169 | lcd.clear(); |
ale_carb0ni | 7:8d381315f72c | 170 | lcd.printString("GAME OVER",WIDTH/2-25,0); |
ale_carb0ni | 2:7fa08670b1fc | 171 | sprintf (buffer, "Score: %d",score); |
ale_carb0ni | 7:8d381315f72c | 172 | lcd.printString(buffer,WIDTH/2-26,2); //displays your score |
ale_carb0ni | 7:8d381315f72c | 173 | lcd.printString("Play Again: B",0,4); //if you want to play again press B |
ale_carb0ni | 7:8d381315f72c | 174 | lcd.printString("Menu: Start",0,5); //if you want to access the main menu press start |
ale_carb0ni | 2:7fa08670b1fc | 175 | pad.leds_on(); |
ale_carb0ni | 2:7fa08670b1fc | 176 | wait(0.1); |
ale_carb0ni | 2:7fa08670b1fc | 177 | pad.leds_off(); |
ale_carb0ni | 2:7fa08670b1fc | 178 | wait(0.1); |
ale_carb0ni | 2:7fa08670b1fc | 179 | pad.tone(500.0,1); |
ale_carb0ni | 2:7fa08670b1fc | 180 | lcd.refresh(); |
ale_carb0ni | 2:7fa08670b1fc | 181 | wait(1/6); |
ale_carb0ni | 2:7fa08670b1fc | 182 | } |
ale_carb0ni | 2:7fa08670b1fc | 183 | |
ale_carb0ni | 2:7fa08670b1fc | 184 | void Game::point(N5110 &lcd,Gamepad &pad) |
ale_carb0ni | 2:7fa08670b1fc | 185 | { |
ale_carb0ni | 7:8d381315f72c | 186 | /*if central coordinate of the snake head |
ale_carb0ni | 7:8d381315f72c | 187 | is equal to the central coordinate of the food:*/ |
ale_carb0ni | 7:8d381315f72c | 188 | if (x == fruitX1 && y == fruitY1) { |
ale_carb0ni | 2:7fa08670b1fc | 189 | //printf("Snake x: %d\n", x); |
ale_carb0ni | 2:7fa08670b1fc | 190 | //printf("Snake y: %d\n", y); |
ale_carb0ni | 2:7fa08670b1fc | 191 | //printf("seg1 x: %d\n", x_pos[1]); |
ale_carb0ni | 2:7fa08670b1fc | 192 | //printf("seg1 y: %d\n", y_pos[1]); |
ale_carb0ni | 2:7fa08670b1fc | 193 | //printf("Fruit x coordinate: %d\n", fruitX1); |
ale_carb0ni | 2:7fa08670b1fc | 194 | //printf("Fruit y coordinate: %d\n", fruitY1); |
ale_carb0ni | 7:8d381315f72c | 195 | score = score + 10; //adds 10 to the score each time you eat a fruit |
ale_carb0ni | 2:7fa08670b1fc | 196 | pad.tone(750.0,1); |
ale_carb0ni | 7:8d381315f72c | 197 | rx = rand() % 16; //generates a new random x coordinate for the food |
ale_carb0ni | 7:8d381315f72c | 198 | ry = rand() % 9; //generates a new random x coordinate for the food |
ale_carb0ni | 2:7fa08670b1fc | 199 | //printf("rx: %d\n", rx); |
ale_carb0ni | 2:7fa08670b1fc | 200 | //printf("ry: %d\n", ry); |
ale_carb0ni | 2:7fa08670b1fc | 201 | fruitX1 = fruitX[rx]+1; |
ale_carb0ni | 2:7fa08670b1fc | 202 | fruitY1 = fruitY[ry]+1; |
ale_carb0ni | 2:7fa08670b1fc | 203 | for (int i = 0; i < x_pos.size(); i++) { |
ale_carb0ni | 7:8d381315f72c | 204 | /*if the random set of coordinates |
ale_carb0ni | 7:8d381315f72c | 205 | corresponds to the position of one of |
ale_carb0ni | 7:8d381315f72c | 206 | the segments of the snake it finds |
ale_carb0ni | 7:8d381315f72c | 207 | a new set of coordinates*/ |
ale_carb0ni | 7:8d381315f72c | 208 | if (fruitX1 == x_pos[i] && fruitY1 == y_pos[i]) { |
ale_carb0ni | 7:8d381315f72c | 209 | rx = rand() % 16; |
ale_carb0ni | 7:8d381315f72c | 210 | ry = rand() % 9; |
ale_carb0ni | 2:7fa08670b1fc | 211 | fruitX1 = fruitX[rx]+1; |
ale_carb0ni | 2:7fa08670b1fc | 212 | fruitY1 = fruitY[ry]+1; |
ale_carb0ni | 2:7fa08670b1fc | 213 | } |
ale_carb0ni | 2:7fa08670b1fc | 214 | } |
ale_carb0ni | 7:8d381315f72c | 215 | ntail++; //increases the lenght of the tail |
ale_carb0ni | 7:8d381315f72c | 216 | lcd.drawRect(fruitX[rx],fruitY[ry],3,3,FILL_BLACK); //draws the new fruit |
ale_carb0ni | 2:7fa08670b1fc | 217 | } |
ale_carb0ni | 2:7fa08670b1fc | 218 | } |