ELEC2645 (2019/20) / Mbed 2 deprecated ELEC2645_Project_el18ac

Dependencies:   mbed

Committer:
ale_carb0ni
Date:
Tue May 26 17:13:20 2020 +0000
Revision:
4:17d5b53b8815
Parent:
3:c61d0c70eda4
Child:
6:a2c72def99f9
working game

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 2:7fa08670b1fc 7
ale_carb0ni 2:7fa08670b1fc 8 Game::Game()
ale_carb0ni 2:7fa08670b1fc 9 {
ale_carb0ni 2:7fa08670b1fc 10 x = 4;
ale_carb0ni 2:7fa08670b1fc 11 y = 4;
ale_carb0ni 2:7fa08670b1fc 12 for (int i = 0; i < 16; i++) {
ale_carb0ni 2:7fa08670b1fc 13 fruitX[i] = 3 + i*5;
ale_carb0ni 2:7fa08670b1fc 14 }
ale_carb0ni 2:7fa08670b1fc 15 for (int i = 0; i < 9; i++) {
ale_carb0ni 2:7fa08670b1fc 16 fruitY[i] = 3 + i*5;
ale_carb0ni 2:7fa08670b1fc 17 }
ale_carb0ni 2:7fa08670b1fc 18 score = 0;
ale_carb0ni 2:7fa08670b1fc 19 a = 0; //used to select the direction based ont what button is pressed
ale_carb0ni 2:7fa08670b1fc 20 ntail = 0; //used to increase lenght of the tail
ale_carb0ni 2:7fa08670b1fc 21 k = 0;
ale_carb0ni 2:7fa08670b1fc 22 rx = rand() % 16;
ale_carb0ni 2:7fa08670b1fc 23 ry = rand() % 9;
ale_carb0ni 2:7fa08670b1fc 24 fruitX1 = fruitX[rx]+1;
ale_carb0ni 2:7fa08670b1fc 25 fruitY1 = fruitY[ry]+1;
ale_carb0ni 2:7fa08670b1fc 26 x_pos.push_back(4);
ale_carb0ni 2:7fa08670b1fc 27 y_pos.push_back(4);
ale_carb0ni 2:7fa08670b1fc 28 }
ale_carb0ni 2:7fa08670b1fc 29
ale_carb0ni 2:7fa08670b1fc 30 void Game::movement(Gamepad &pad)
ale_carb0ni 2:7fa08670b1fc 31 {
ale_carb0ni 2:7fa08670b1fc 32 if (pad.Y_held() && !(a == 2)) {
ale_carb0ni 2:7fa08670b1fc 33 a = 1;
ale_carb0ni 2:7fa08670b1fc 34 }
ale_carb0ni 2:7fa08670b1fc 35 if (pad.A_held() && !(a == 1)) {
ale_carb0ni 2:7fa08670b1fc 36 a = 2;
ale_carb0ni 2:7fa08670b1fc 37 }
ale_carb0ni 2:7fa08670b1fc 38 if (pad.X_held() && !(a == 4)) {
ale_carb0ni 2:7fa08670b1fc 39 a = 3;
ale_carb0ni 2:7fa08670b1fc 40 }
ale_carb0ni 2:7fa08670b1fc 41 if (pad.B_held() && !(a == 3)) {
ale_carb0ni 2:7fa08670b1fc 42 a = 4;
ale_carb0ni 2:7fa08670b1fc 43 }
ale_carb0ni 4:17d5b53b8815 44 }
ale_carb0ni 4:17d5b53b8815 45
ale_carb0ni 4:17d5b53b8815 46 void Game::updating_position()
ale_carb0ni 4:17d5b53b8815 47 {
ale_carb0ni 4:17d5b53b8815 48 if (a == 1) {
ale_carb0ni 2:7fa08670b1fc 49 x += -5;
ale_carb0ni 2:7fa08670b1fc 50 //wait(0.25);
ale_carb0ni 2:7fa08670b1fc 51 }
ale_carb0ni 2:7fa08670b1fc 52 if (a == 2) {
ale_carb0ni 2:7fa08670b1fc 53 x += 5;
ale_carb0ni 2:7fa08670b1fc 54 //wait(0.25);
ale_carb0ni 2:7fa08670b1fc 55 }
ale_carb0ni 2:7fa08670b1fc 56 if (a == 3) {
ale_carb0ni 2:7fa08670b1fc 57 y += -5;
ale_carb0ni 2:7fa08670b1fc 58 //wait(0.25);
ale_carb0ni 2:7fa08670b1fc 59 }
ale_carb0ni 2:7fa08670b1fc 60 if (a == 4) {
ale_carb0ni 2:7fa08670b1fc 61 y += 5;
ale_carb0ni 2:7fa08670b1fc 62 //wait(0.25);
ale_carb0ni 2:7fa08670b1fc 63 }
ale_carb0ni 2:7fa08670b1fc 64
ale_carb0ni 2:7fa08670b1fc 65 int prevX = x_pos[0];
ale_carb0ni 2:7fa08670b1fc 66 int prevY = y_pos[0];
ale_carb0ni 2:7fa08670b1fc 67
ale_carb0ni 2:7fa08670b1fc 68 x_pos[0] = x;
ale_carb0ni 2:7fa08670b1fc 69 y_pos[0] = y;
ale_carb0ni 2:7fa08670b1fc 70
ale_carb0ni 2:7fa08670b1fc 71 if (!(ntail + 1 == x_pos.size())) {
ale_carb0ni 2:7fa08670b1fc 72 x_pos.push_back(x_pos[ntail - 1]);
ale_carb0ni 2:7fa08670b1fc 73 y_pos.push_back(y_pos[ntail - 1]);
ale_carb0ni 2:7fa08670b1fc 74 }
ale_carb0ni 2:7fa08670b1fc 75
ale_carb0ni 2:7fa08670b1fc 76 if (x_pos.size() > 0) {
ale_carb0ni 2:7fa08670b1fc 77 for (int i = 0; i < x_pos.size() - 1; i++) {
ale_carb0ni 2:7fa08670b1fc 78 x_pos[x_pos.size() - i - 1] = x_pos[x_pos.size() - i - 2];
ale_carb0ni 2:7fa08670b1fc 79 y_pos[y_pos.size() - i - 1] = y_pos[y_pos.size() - i - 2];
ale_carb0ni 2:7fa08670b1fc 80 }
ale_carb0ni 2:7fa08670b1fc 81 x_pos[1] = prevX;
ale_carb0ni 2:7fa08670b1fc 82 y_pos[1] = prevY;
ale_carb0ni 2:7fa08670b1fc 83 }
ale_carb0ni 2:7fa08670b1fc 84 }
ale_carb0ni 2:7fa08670b1fc 85
ale_carb0ni 3:c61d0c70eda4 86 int Game::death(N5110 &lcd,Gamepad &pad)
ale_carb0ni 2:7fa08670b1fc 87 {
ale_carb0ni 2:7fa08670b1fc 88 if (x < 1 || x > WIDTH-2) { //if you hit the side walls you die
ale_carb0ni 2:7fa08670b1fc 89 while (1) {
ale_carb0ni 2:7fa08670b1fc 90 gameover(lcd, pad);
ale_carb0ni 2:7fa08670b1fc 91 if (pad.B_held()) {
ale_carb0ni 3:c61d0c70eda4 92 return 2;
ale_carb0ni 2:7fa08670b1fc 93 }
ale_carb0ni 2:7fa08670b1fc 94 if (pad.start_held()) {
ale_carb0ni 3:c61d0c70eda4 95 return 1;
ale_carb0ni 2:7fa08670b1fc 96 }
ale_carb0ni 2:7fa08670b1fc 97 }
ale_carb0ni 2:7fa08670b1fc 98 }
ale_carb0ni 2:7fa08670b1fc 99
ale_carb0ni 2:7fa08670b1fc 100 if (y < 1 || y > HEIGHT) { //if you hit the top or bottom walls you die
ale_carb0ni 2:7fa08670b1fc 101 while (1) {
ale_carb0ni 2:7fa08670b1fc 102 gameover(lcd, pad);
ale_carb0ni 2:7fa08670b1fc 103 if (pad.B_held()) {
ale_carb0ni 3:c61d0c70eda4 104 return 2;
ale_carb0ni 2:7fa08670b1fc 105 }
ale_carb0ni 2:7fa08670b1fc 106 if (pad.start_held()) {
ale_carb0ni 3:c61d0c70eda4 107 return 1;
ale_carb0ni 2:7fa08670b1fc 108 }
ale_carb0ni 2:7fa08670b1fc 109 }
ale_carb0ni 2:7fa08670b1fc 110 }
ale_carb0ni 2:7fa08670b1fc 111 for (int i = 1; i < x_pos.size(); i++) { //if you hit your tail you die
ale_carb0ni 2:7fa08670b1fc 112 if (x_pos[0] == x_pos[i] && y_pos[0] == y_pos[i]) {
ale_carb0ni 2:7fa08670b1fc 113 while (1) {
ale_carb0ni 2:7fa08670b1fc 114 gameover(lcd, pad);
ale_carb0ni 2:7fa08670b1fc 115 if (pad.B_held()) {
ale_carb0ni 3:c61d0c70eda4 116 return 2;
ale_carb0ni 2:7fa08670b1fc 117 }
ale_carb0ni 2:7fa08670b1fc 118 if (pad.start_held()) {
ale_carb0ni 3:c61d0c70eda4 119 return 1;
ale_carb0ni 2:7fa08670b1fc 120 }
ale_carb0ni 2:7fa08670b1fc 121 }
ale_carb0ni 2:7fa08670b1fc 122 }
ale_carb0ni 2:7fa08670b1fc 123 }
ale_carb0ni 3:c61d0c70eda4 124 return 0;
ale_carb0ni 2:7fa08670b1fc 125 }
ale_carb0ni 2:7fa08670b1fc 126
ale_carb0ni 2:7fa08670b1fc 127 void Game::draw(N5110 &lcd,Gamepad &pad)
ale_carb0ni 2:7fa08670b1fc 128 {
ale_carb0ni 2:7fa08670b1fc 129 lcd.clear();
ale_carb0ni 2:7fa08670b1fc 130 lcd.drawRect(1,1,WIDTH-2,HEIGHT-1,FILL_TRANSPARENT); //rectangle around border of field
ale_carb0ni 2:7fa08670b1fc 131 lcd.drawRect(fruitX[rx],fruitY[ry],3,3,FILL_BLACK); //fruit on the field
ale_carb0ni 2:7fa08670b1fc 132 lcd.drawCircle(x,y,2,FILL_TRANSPARENT); //initial snake design
ale_carb0ni 2:7fa08670b1fc 133 //printf("size of vector %d\n", x_pos.size());
ale_carb0ni 2:7fa08670b1fc 134 for (k = 1; k <= ntail; k++) {
ale_carb0ni 2:7fa08670b1fc 135 lcd.drawCircle(x_pos[k],y_pos[k],2,FILL_TRANSPARENT);
ale_carb0ni 2:7fa08670b1fc 136 //printf("draw \n");
ale_carb0ni 2:7fa08670b1fc 137 }
ale_carb0ni 2:7fa08670b1fc 138 //printf("/////////////// \n");
ale_carb0ni 2:7fa08670b1fc 139 //printf("Fruit x coordinate: %d\n", fruitX1);
ale_carb0ni 2:7fa08670b1fc 140 //printf("Fruit y coordinate: %d\n", fruitY1);
ale_carb0ni 2:7fa08670b1fc 141 //printf("Snake x: %d\n", x);
ale_carb0ni 2:7fa08670b1fc 142 //printf("Snake y: %d\n", y);
ale_carb0ni 2:7fa08670b1fc 143 //printf("seg1 x: %d\n", x_pos[1]);
ale_carb0ni 2:7fa08670b1fc 144 //printf("seg1 y: %d\n", y_pos[1]);
ale_carb0ni 2:7fa08670b1fc 145 lcd.refresh();
ale_carb0ni 2:7fa08670b1fc 146 }
ale_carb0ni 2:7fa08670b1fc 147
ale_carb0ni 2:7fa08670b1fc 148 void Game::gameover(N5110 &lcd,Gamepad &pad)
ale_carb0ni 2:7fa08670b1fc 149 {
ale_carb0ni 2:7fa08670b1fc 150 lcd.clear();
ale_carb0ni 2:7fa08670b1fc 151 //while (1) {
ale_carb0ni 2:7fa08670b1fc 152 lcd.printString("GAME OVER",WIDTH/2-25,0);
ale_carb0ni 2:7fa08670b1fc 153 sprintf (buffer, "Score: %d",score);
ale_carb0ni 2:7fa08670b1fc 154 lcd.printString(buffer,WIDTH/2-26,2);
ale_carb0ni 2:7fa08670b1fc 155 lcd.printString("TO PLAY AGAIN",3,4);
ale_carb0ni 2:7fa08670b1fc 156 lcd.printString("PRESS B",17,5);
ale_carb0ni 2:7fa08670b1fc 157 pad.leds_on();
ale_carb0ni 2:7fa08670b1fc 158 wait(0.1);
ale_carb0ni 2:7fa08670b1fc 159 pad.leds_off();
ale_carb0ni 2:7fa08670b1fc 160 wait(0.1);
ale_carb0ni 2:7fa08670b1fc 161 pad.tone(500.0,1);
ale_carb0ni 2:7fa08670b1fc 162 lcd.refresh();
ale_carb0ni 2:7fa08670b1fc 163 wait(1/6);
ale_carb0ni 2:7fa08670b1fc 164 // if ( _pad.B_held()) {
ale_carb0ni 2:7fa08670b1fc 165 //break;
ale_carb0ni 2:7fa08670b1fc 166 //}
ale_carb0ni 2:7fa08670b1fc 167 //}
ale_carb0ni 2:7fa08670b1fc 168 /*wait(1/6);
ale_carb0ni 2:7fa08670b1fc 169 _lcd.clear();
ale_carb0ni 2:7fa08670b1fc 170 //_menu.menu_screen();
ale_carb0ni 2:7fa08670b1fc 171 _lcd.refresh();
ale_carb0ni 2:7fa08670b1fc 172 wait(1/6);*/
ale_carb0ni 2:7fa08670b1fc 173 }
ale_carb0ni 2:7fa08670b1fc 174
ale_carb0ni 2:7fa08670b1fc 175 void Game::point(N5110 &lcd,Gamepad &pad)
ale_carb0ni 2:7fa08670b1fc 176 {
ale_carb0ni 2:7fa08670b1fc 177 if (x == fruitX1 && y == fruitY1) { //if central coordinate of the snake head is equal to the central coordinate of the food:
ale_carb0ni 2:7fa08670b1fc 178 //printf("Snake x: %d\n", x);
ale_carb0ni 2:7fa08670b1fc 179 //printf("Snake y: %d\n", y);
ale_carb0ni 2:7fa08670b1fc 180 //printf("seg1 x: %d\n", x_pos[1]);
ale_carb0ni 2:7fa08670b1fc 181 //printf("seg1 y: %d\n", y_pos[1]);
ale_carb0ni 2:7fa08670b1fc 182 //printf("Fruit x coordinate: %d\n", fruitX1);
ale_carb0ni 2:7fa08670b1fc 183 //printf("Fruit y coordinate: %d\n", fruitY1);
ale_carb0ni 2:7fa08670b1fc 184 score = score + 10;
ale_carb0ni 2:7fa08670b1fc 185 pad.tone(750.0,1);
ale_carb0ni 2:7fa08670b1fc 186 rx = rand() % 16; //generates a new random coordinate for the food
ale_carb0ni 2:7fa08670b1fc 187 ry = rand() % 9;
ale_carb0ni 2:7fa08670b1fc 188 //printf("rx: %d\n", rx);
ale_carb0ni 2:7fa08670b1fc 189 //printf("ry: %d\n", ry);
ale_carb0ni 2:7fa08670b1fc 190 fruitX1 = fruitX[rx]+1;
ale_carb0ni 2:7fa08670b1fc 191 fruitY1 = fruitY[ry]+1;
ale_carb0ni 2:7fa08670b1fc 192 for (int i = 0; i < x_pos.size(); i++) {
ale_carb0ni 2:7fa08670b1fc 193 if (fruitX1 == x_pos[i] && fruitY1 == y_pos[i]) {
ale_carb0ni 2:7fa08670b1fc 194 rx = rand() % 16;
ale_carb0ni 2:7fa08670b1fc 195 ry = rand() % 9;
ale_carb0ni 2:7fa08670b1fc 196 fruitX1 = fruitX[rx]+1;
ale_carb0ni 2:7fa08670b1fc 197 fruitY1 = fruitY[ry]+1;
ale_carb0ni 2:7fa08670b1fc 198 }
ale_carb0ni 2:7fa08670b1fc 199 }
ale_carb0ni 2:7fa08670b1fc 200 ntail++;
ale_carb0ni 2:7fa08670b1fc 201 lcd.drawRect(fruitX[rx],fruitY[ry],3,3,FILL_BLACK);
ale_carb0ni 2:7fa08670b1fc 202 //_lcd.refresh();
ale_carb0ni 2:7fa08670b1fc 203 //wait(1/6);
ale_carb0ni 2:7fa08670b1fc 204 }
ale_carb0ni 2:7fa08670b1fc 205 }