ELEC2645 (2019/20) / Mbed 2 deprecated ELEC2645_Project_el18ac

Dependencies:   mbed

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?

UserRevisionLine numberNew 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 }