ELEC2645 (2019/20) / Mbed 2 deprecated ELEC2645_Project_el18ac

Dependencies:   mbed

Committer:
ale_carb0ni
Date:
Tue May 26 16:52:17 2020 +0000
Revision:
3:c61d0c70eda4
Parent:
2:7fa08670b1fc
Child:
4:17d5b53b8815
fast snake, working good

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