Snake vs Block Game to be run upon K64F.

Dependencies:   mbed

Committer:
AhmedPlaymaker
Date:
Fri Apr 26 18:04:19 2019 +0000
Revision:
50:3cf9a94a264e
Parent:
49:441c32f6603e
Solved a problem caused by the previous update of level not progressing, the problem of show credits not working still persists.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
AhmedPlaymaker 7:48ba87cd79b5 1 #include "SnakevsBlock.h"
AhmedPlaymaker 7:48ba87cd79b5 2
AhmedPlaymaker 7:48ba87cd79b5 3 SnakevsBlock::SnakevsBlock()
AhmedPlaymaker 7:48ba87cd79b5 4 {
AhmedPlaymaker 7:48ba87cd79b5 5
AhmedPlaymaker 7:48ba87cd79b5 6 }
AhmedPlaymaker 7:48ba87cd79b5 7
AhmedPlaymaker 7:48ba87cd79b5 8 SnakevsBlock::~SnakevsBlock()
AhmedPlaymaker 7:48ba87cd79b5 9 {
AhmedPlaymaker 7:48ba87cd79b5 10
AhmedPlaymaker 7:48ba87cd79b5 11 }
AhmedPlaymaker 7:48ba87cd79b5 12
AhmedPlaymaker 7:48ba87cd79b5 13 void SnakevsBlock::init()
AhmedPlaymaker 7:48ba87cd79b5 14 {
AhmedPlaymaker 41:4edac50f010d 15 //The level initialisation and all the other initial information passing will be done here
AhmedPlaymaker 19:05cc9f801468 16 level = 1;
AhmedPlaymaker 41:4edac50f010d 17 garbage = 0; //this is to allow the user to change the position of reference for motion control by saving the absolute angle.
AhmedPlaymaker 41:4edac50f010d 18 foodbuff = 0; //this makes the food fall at diffrent times when a particular level starts.
AhmedPlaymaker 42:973bb6036f81 19 send_block_number = 0;
AhmedPlaymaker 44:cd10d07ea1e5 20 blockgap = 300;
AhmedPlaymaker 32:3a3bdeffdf62 21 blockbuff = -50;
AhmedPlaymaker 49:441c32f6603e 22 for(int i=0; i<=14; i++) {b[i] = 1;} //makes all the snake beads move by default.
AhmedPlaymaker 49:441c32f6603e 23 SnakevsBlock::object_initialisations();
AhmedPlaymaker 7:48ba87cd79b5 24 }
AhmedPlaymaker 7:48ba87cd79b5 25
AhmedPlaymaker 41:4edac50f010d 26 void SnakevsBlock::reset()
AhmedPlaymaker 41:4edac50f010d 27 {
AhmedPlaymaker 41:4edac50f010d 28 //This prepares the game for the next level by reseting certain variables.
AhmedPlaymaker 41:4edac50f010d 29 foodbuff = 0;
AhmedPlaymaker 44:cd10d07ea1e5 30 for(int i=0; i<=2; i++) {
AhmedPlaymaker 44:cd10d07ea1e5 31 food_pos[i].x = 0;
AhmedPlaymaker 44:cd10d07ea1e5 32 food_pos[i].y = 0;
AhmedPlaymaker 44:cd10d07ea1e5 33 }
AhmedPlaymaker 46:dc7dccae9f9e 34 if(blockgap >= 50) {blockgap -= 40;} //to make progressive levels harder by making the blocks drop more frequently.
AhmedPlaymaker 49:441c32f6603e 35 SnakevsBlock::object_initialisations();
AhmedPlaymaker 49:441c32f6603e 36 }
AhmedPlaymaker 49:441c32f6603e 37
AhmedPlaymaker 49:441c32f6603e 38 void SnakevsBlock::object_initialisations()
AhmedPlaymaker 49:441c32f6603e 39 {
AhmedPlaymaker 49:441c32f6603e 40 _l.init(); //length calc object initialisation.
AhmedPlaymaker 49:441c32f6603e 41 _s.init(); //snake object initialisation.
AhmedPlaymaker 49:441c32f6603e 42 _f.init(); //food 1 object initialisation.
AhmedPlaymaker 49:441c32f6603e 43 _ff.init(); //food 2 object initialisation.
AhmedPlaymaker 49:441c32f6603e 44 _fff.init(); //food 3 object initialisation.
AhmedPlaymaker 49:441c32f6603e 45 _b.init(); //block object initialisation.
AhmedPlaymaker 41:4edac50f010d 46 }
AhmedPlaymaker 7:48ba87cd79b5 47
AhmedPlaymaker 39:210ac915e0a0 48 void SnakevsBlock::read_input(Gamepad &pad, FXOS8700CQ &device, int g_mode)
AhmedPlaymaker 7:48ba87cd79b5 49 {
AhmedPlaymaker 38:30e4e6191762 50 device.get_values();
AhmedPlaymaker 38:30e4e6191762 51 angle = -device.get_roll_angle();
AhmedPlaymaker 38:30e4e6191762 52 //if button A is pressed then reset that particular position to center
AhmedPlaymaker 38:30e4e6191762 53 if (pad.check_event(Gamepad::A_PRESSED) == true) {
AhmedPlaymaker 38:30e4e6191762 54 garbage = angle;
AhmedPlaymaker 38:30e4e6191762 55 }
AhmedPlaymaker 38:30e4e6191762 56 device.get_values();
AhmedPlaymaker 38:30e4e6191762 57 angle = -device.get_roll_angle() - garbage;
AhmedPlaymaker 39:210ac915e0a0 58 if(g_mode == 1) { //this condition returns the relevant working directions if we select joystick in StartScreen.
AhmedPlaymaker 38:30e4e6191762 59 _d = pad.get_direction(); //Obtains Direction pushed towards on Joystick.
AhmedPlaymaker 38:30e4e6191762 60 _mag = pad.get_mag(); //Obtains Magnitude of Joystick.
AhmedPlaymaker 38:30e4e6191762 61 }
AhmedPlaymaker 39:210ac915e0a0 62 else if(g_mode == 2) { //this condition returns the relevant working directions if we select motion control in StartScreen.
AhmedPlaymaker 38:30e4e6191762 63 if (angle >= 8) {
AhmedPlaymaker 38:30e4e6191762 64 _d = E;
AhmedPlaymaker 38:30e4e6191762 65 }
AhmedPlaymaker 38:30e4e6191762 66 else if (angle <= -8) {
AhmedPlaymaker 38:30e4e6191762 67 _d = W;
AhmedPlaymaker 38:30e4e6191762 68 }
AhmedPlaymaker 38:30e4e6191762 69 else {
AhmedPlaymaker 38:30e4e6191762 70 _d = CENTRE;
AhmedPlaymaker 38:30e4e6191762 71 }
AhmedPlaymaker 38:30e4e6191762 72 }
AhmedPlaymaker 38:30e4e6191762 73 device.get_values();
AhmedPlaymaker 38:30e4e6191762 74 //printf("%d",gm);
AhmedPlaymaker 38:30e4e6191762 75 //printf("%f",angle);
AhmedPlaymaker 38:30e4e6191762 76 //printf("%f",device.get_roll_angle());
AhmedPlaymaker 7:48ba87cd79b5 77 }
AhmedPlaymaker 7:48ba87cd79b5 78
AhmedPlaymaker 49:441c32f6603e 79 void SnakevsBlock::draw(N5110 &lcd, Gamepad &pad) {
AhmedPlaymaker 41:4edac50f010d 80 _length = _l._getLength();
AhmedPlaymaker 41:4edac50f010d 81 _s.draw(pad, lcd, _length, level); //Draws the Snake. //Make these snake buffs relative to the snake drops which in turn relate to the game speed
AhmedPlaymaker 41:4edac50f010d 82 if(foodbuff >= 0) {
AhmedPlaymaker 36:dfdd619874ae 83 _f.draw(lcd, blockbuff); //Draws the first food.
AhmedPlaymaker 39:210ac915e0a0 84 }
AhmedPlaymaker 41:4edac50f010d 85 if(foodbuff >= 50) {
AhmedPlaymaker 39:210ac915e0a0 86 _ff.draw(lcd, blockbuff); //Draws the second food.
AhmedPlaymaker 9:d1d79d4ee673 87 }
AhmedPlaymaker 41:4edac50f010d 88 if(foodbuff >= 80) {
AhmedPlaymaker 39:210ac915e0a0 89 _fff.draw(lcd, blockbuff); //Draws the third food.
AhmedPlaymaker 39:210ac915e0a0 90 }
AhmedPlaymaker 39:210ac915e0a0 91 foodbuff +=1;
AhmedPlaymaker 41:4edac50f010d 92 if(foodbuff >= 8) {
AhmedPlaymaker 48:d774bb162c61 93 _b.draw(lcd, _length);
AhmedPlaymaker 19:05cc9f801468 94 }
AhmedPlaymaker 36:dfdd619874ae 95 if(foodbuff == 8) {
AhmedPlaymaker 38:30e4e6191762 96 blockbuff = -10;
AhmedPlaymaker 13:9785f2404045 97 }
AhmedPlaymaker 7:48ba87cd79b5 98 //Code to print length on game screen.
AhmedPlaymaker 41:4edac50f010d 99 _l.print_length_on_screen(lcd);
AhmedPlaymaker 41:4edac50f010d 100 }
AhmedPlaymaker 39:210ac915e0a0 101
AhmedPlaymaker 49:441c32f6603e 102 int SnakevsBlock::update(N5110 &lcd, Gamepad &pad, SDFileSystem &sd) //Updates objects on screen.
AhmedPlaymaker 39:210ac915e0a0 103 {
AhmedPlaymaker 42:973bb6036f81 104 send_block_number = 0; //this is for the game to decide wether to remember the number on the block for the current itteration.
AhmedPlaymaker 42:973bb6036f81 105 //we dont need to remember if it has already gone past the screen.
AhmedPlaymaker 43:233f93860d08 106 CheckSnakeFoodCollision(pad); //Function checks for when the snake collides with it's food.
AhmedPlaymaker 18:b391caa5754c 107 CheckSnakeBlockCollision(pad); //Function checks for when the snake collides with any of the blocks.
AhmedPlaymaker 38:30e4e6191762 108 CheckSnakeBlockSidesCollision(pad); //Function checks for when the snake collides with any of the blocks' sides.
AhmedPlaymaker 41:4edac50f010d 109 _s.update(_d, b); //_d is the direction of joystick and b controls the motion of a section of the snake relative to obstruction
AhmedPlaymaker 9:d1d79d4ee673 110 _f.update();
AhmedPlaymaker 9:d1d79d4ee673 111 _ff.update();
AhmedPlaymaker 9:d1d79d4ee673 112 _fff.update();
AhmedPlaymaker 48:d774bb162c61 113 _b.update(blocknum, blockgap, srn, send_block_number);
AhmedPlaymaker 19:05cc9f801468 114 blockbuff++;
AhmedPlaymaker 41:4edac50f010d 115 if(blockbuff >= blockgap) { //this makes blockbuff reset every time the new set of blocks appear.
AhmedPlaymaker 36:dfdd619874ae 116 blockbuff = -11;
AhmedPlaymaker 19:05cc9f801468 117 }
AhmedPlaymaker 49:441c32f6603e 118 //_statset.read(sd); //to read the currently stored value.
AhmedPlaymaker 49:441c32f6603e 119 if(_length == 0) {
AhmedPlaymaker 49:441c32f6603e 120 _wl.GameOver(lcd,pad);
AhmedPlaymaker 49:441c32f6603e 121 }
AhmedPlaymaker 49:441c32f6603e 122 if((pad.check_event(Gamepad::BACK_PRESSED))||(_length == 0)){ //Waits for Back button to be pressed.
AhmedPlaymaker 25:e827f1a8fadc 123 back = 1;
AhmedPlaymaker 25:e827f1a8fadc 124 SnakevsBlock::init();
AhmedPlaymaker 25:e827f1a8fadc 125 }
AhmedPlaymaker 25:e827f1a8fadc 126 else {
AhmedPlaymaker 25:e827f1a8fadc 127 back = 0;
AhmedPlaymaker 25:e827f1a8fadc 128 }
AhmedPlaymaker 50:3cf9a94a264e 129 printf("%d\n",_length);
AhmedPlaymaker 50:3cf9a94a264e 130 if(_length >= 20) {
AhmedPlaymaker 50:3cf9a94a264e 131 level = _wl.LevelComplete(lcd, pad, level);
AhmedPlaymaker 50:3cf9a94a264e 132 _Setstats.write(level, sd);
AhmedPlaymaker 50:3cf9a94a264e 133 SnakevsBlock::reset();
AhmedPlaymaker 50:3cf9a94a264e 134 }
AhmedPlaymaker 25:e827f1a8fadc 135 return back;
AhmedPlaymaker 7:48ba87cd79b5 136 }
AhmedPlaymaker 7:48ba87cd79b5 137
AhmedPlaymaker 7:48ba87cd79b5 138 void SnakevsBlock::get_pos()
AhmedPlaymaker 7:48ba87cd79b5 139 {
AhmedPlaymaker 7:48ba87cd79b5 140 //printf("player pos = %f %f \n", player_pos.x, player_pos.y); //top left of player sprite
AhmedPlaymaker 7:48ba87cd79b5 141 // 81.000000 0.000000 top right
AhmedPlaymaker 7:48ba87cd79b5 142 // 0.000000 0.000000 is top left
AhmedPlaymaker 7:48ba87cd79b5 143 // 81.000000 45.000000 bottom right
AhmedPlaymaker 43:233f93860d08 144 snakex = _s.get_pos().x; //this could be snake_pos[0].x or simply snake_pos[0] to represent both x&y but as it is used the most, it improves readability.
AhmedPlaymaker 43:233f93860d08 145 snakey = _s.get_pos().y; //this could be snake_pos[0].y or simply snake_pos[0] to represent both x&y but as it is used the most, it improves readability.
AhmedPlaymaker 7:48ba87cd79b5 146 //printf("snakexy in GAME = %d %d \n", snakex, snakey);
AhmedPlaymaker 41:4edac50f010d 147 //Obtains all required coordinates.
AhmedPlaymaker 41:4edac50f010d 148 food_pos[0] = _f.get_pos();
AhmedPlaymaker 41:4edac50f010d 149 food_pos[1] = _ff.get_pos();
AhmedPlaymaker 41:4edac50f010d 150 food_pos[2] = _fff.get_pos();
AhmedPlaymaker 41:4edac50f010d 151 //obtains origin cordinates of block.
AhmedPlaymaker 41:4edac50f010d 152 b_pos = _b.get_pos();
AhmedPlaymaker 41:4edac50f010d 153 //this saves the positions of each snake beed (the first to the last) in a single array. Element[0] is the top beed and soo on.
AhmedPlaymaker 41:4edac50f010d 154 snake_pos[0] = _s.get_pos(); //gets the position of the top beed and saves in array.
AhmedPlaymaker 41:4edac50f010d 155 snake_pos[1] = _s.get_pos_before1(); //gets the position of the second beed and saves in array.
AhmedPlaymaker 41:4edac50f010d 156 snake_pos[2] = _s.get_pos_before2(); //gets the position of the third beed and saves in array.
AhmedPlaymaker 41:4edac50f010d 157 snake_pos[3] = _s.get_pos_before3(); //gets the position of the fourth beed and saves in array.
AhmedPlaymaker 41:4edac50f010d 158 snake_pos[4] = _s.get_pos_before4(); //gets the position of the fifth beed and saves in array.
AhmedPlaymaker 41:4edac50f010d 159 snake_pos[5] = _s.get_pos_before5(); //gets the position of the sixth beed and saves in array.
AhmedPlaymaker 41:4edac50f010d 160 snake_pos[6] = _s.get_pos_before6(); //gets the position of the seventh beed and saves in array.
AhmedPlaymaker 41:4edac50f010d 161 snake_pos[7] = _s.get_pos_before7(); //gets the position of the eight beed and saves in array.
AhmedPlaymaker 41:4edac50f010d 162 snake_pos[8] = _s.get_pos_before8(); //gets the position of the ninth beed and saves in array.
AhmedPlaymaker 41:4edac50f010d 163 snake_pos[9] = _s.get_pos_before9(); //gets the position of the last beed and saves in array.
AhmedPlaymaker 7:48ba87cd79b5 164 }
AhmedPlaymaker 7:48ba87cd79b5 165
AhmedPlaymaker 9:d1d79d4ee673 166
AhmedPlaymaker 27:3b4775a0d0bb 167 void SnakevsBlock::CheckSnakeFoodCollision(Gamepad &pad) {
AhmedPlaymaker 32:3a3bdeffdf62 168 //If statements check if the snake sprite has collided with any
AhmedPlaymaker 32:3a3bdeffdf62 169 //of the three food sprites, if so then the food location is reset and
AhmedPlaymaker 32:3a3bdeffdf62 170 //length of the snake is increased using the length variable.
AhmedPlaymaker 29:c6358c39a70e 171 for(int y=0; y<=2; y++) { //this loop automatically detects each combination of collision in the y postion
AhmedPlaymaker 29:c6358c39a70e 172 for(int x=0; x<=2; x++) { //this loop automatically detects each combination of collision in the x postion
AhmedPlaymaker 29:c6358c39a70e 173 for(int food_sr=0; food_sr<=2; food_sr++) { //this loop automatically detects which food we are interacting with.
AhmedPlaymaker 29:c6358c39a70e 174 if (
AhmedPlaymaker 41:4edac50f010d 175 ((snakey + y == food_pos[food_sr].y) ||
AhmedPlaymaker 41:4edac50f010d 176 (snakey + y == food_pos[food_sr].y + 1) ||
AhmedPlaymaker 41:4edac50f010d 177 (snakey + y == food_pos[food_sr].y + 2)) &&
AhmedPlaymaker 41:4edac50f010d 178 ((snakex + x == food_pos[food_sr].x) ||
AhmedPlaymaker 41:4edac50f010d 179 (snakex + x == food_pos[food_sr].x + 1) ||
AhmedPlaymaker 41:4edac50f010d 180 (snakex + x == food_pos[food_sr].x + 2))
AhmedPlaymaker 29:c6358c39a70e 181 ) {
AhmedPlaymaker 29:c6358c39a70e 182 //printf("snake feast working \n");
AhmedPlaymaker 29:c6358c39a70e 183 //audio feedback
AhmedPlaymaker 46:dc7dccae9f9e 184 pad.tone(786.0,0.1);
AhmedPlaymaker 38:30e4e6191762 185 food_pos[food_sr].x = (rand() % 82); //this makes the food pop up at a random, unspecified location in the x axis.
AhmedPlaymaker 38:30e4e6191762 186 food_pos[food_sr].y = -3;
AhmedPlaymaker 41:4edac50f010d 187 _l.PlusLength();
AhmedPlaymaker 29:c6358c39a70e 188 }
AhmedPlaymaker 25:e827f1a8fadc 189 }
AhmedPlaymaker 25:e827f1a8fadc 190 }
AhmedPlaymaker 9:d1d79d4ee673 191 }
AhmedPlaymaker 29:c6358c39a70e 192 _f.set_pos(food_pos[0]);
AhmedPlaymaker 29:c6358c39a70e 193 _ff.set_pos(food_pos[1]);
AhmedPlaymaker 29:c6358c39a70e 194 _fff.set_pos(food_pos[2]);
AhmedPlaymaker 29:c6358c39a70e 195 }
AhmedPlaymaker 12:1e601b176437 196
AhmedPlaymaker 39:210ac915e0a0 197 void SnakevsBlock::CheckSnakeBlockCollision(Gamepad &pad) {
AhmedPlaymaker 41:4edac50f010d 198 //Obtains the numbers inside the block.
AhmedPlaymaker 39:210ac915e0a0 199 b_number = _b.get_number();
AhmedPlaymaker 39:210ac915e0a0 200 //If statements check if the snake sprite has collided with any
AhmedPlaymaker 39:210ac915e0a0 201 //of the blocks which are a maximum of 5, if so then the snake length reduces and the block number reduces
AhmedPlaymaker 39:210ac915e0a0 202 //the block has to move slower and come down after every 2/3 iterations(dependent on the snake size.(think about this)
AhmedPlaymaker 39:210ac915e0a0 203 for(int block=0; block<=83; block+=1) { //this loop automatically detects for each section of block and each combination of collision
AhmedPlaymaker 43:233f93860d08 204 if (((snakey == b_pos.y + 11)||(snakey == b_pos.y + 10)||(snakey == b_pos.y + 9)) && (snakex + 1 == b_pos.x + block)) {
AhmedPlaymaker 43:233f93860d08 205 //the or for the block's y position is due to the fact the exact y co-ordinate might not be collided if the snake's length has increased in the same itteration.
AhmedPlaymaker 39:210ac915e0a0 206 //printf("snake collision working \n");
AhmedPlaymaker 39:210ac915e0a0 207 //audio feedback
AhmedPlaymaker 39:210ac915e0a0 208 if(blocknum > 0) {b_pos.y = 0;} //change this to speed y = 0 when length = 10.
AhmedPlaymaker 39:210ac915e0a0 209 srn = CheckBlock(block); //this tells us which of the 5 blocks we are colliding with
AhmedPlaymaker 39:210ac915e0a0 210 blocknum = b_number[srn];
AhmedPlaymaker 41:4edac50f010d 211 if((_length>=10)&&(b_number[srn]>0)) { //this makes the block stop moving down if it's length is more than 10 and still collides.
AhmedPlaymaker 39:210ac915e0a0 212 velocity = 0;
AhmedPlaymaker 33:249cf423fb18 213 }
AhmedPlaymaker 39:210ac915e0a0 214 else {
AhmedPlaymaker 39:210ac915e0a0 215 velocity = 1;
AhmedPlaymaker 39:210ac915e0a0 216 }
AhmedPlaymaker 47:b448ffd073e7 217 ImplementCollision(pad);
AhmedPlaymaker 39:210ac915e0a0 218 SnakevsBlock::_set_velocity();
AhmedPlaymaker 12:1e601b176437 219 }
AhmedPlaymaker 39:210ac915e0a0 220 }
AhmedPlaymaker 39:210ac915e0a0 221 }
AhmedPlaymaker 39:210ac915e0a0 222
AhmedPlaymaker 39:210ac915e0a0 223 void SnakevsBlock::_set_velocity() {
AhmedPlaymaker 39:210ac915e0a0 224 _b.velocity.y = velocity;
AhmedPlaymaker 39:210ac915e0a0 225 _f.velocity.y = velocity;
AhmedPlaymaker 39:210ac915e0a0 226 _ff.velocity.y = velocity;
AhmedPlaymaker 39:210ac915e0a0 227 _fff.velocity.y = velocity;
AhmedPlaymaker 27:3b4775a0d0bb 228 }
AhmedPlaymaker 29:c6358c39a70e 229
AhmedPlaymaker 29:c6358c39a70e 230 int SnakevsBlock::CheckBlock(int block) {
AhmedPlaymaker 29:c6358c39a70e 231 int srn;
AhmedPlaymaker 29:c6358c39a70e 232 if((block>=0)&&(block<=18)) {srn = 0;}
AhmedPlaymaker 29:c6358c39a70e 233 if((block>=19)&&(block<=34)) {srn = 1;}
AhmedPlaymaker 29:c6358c39a70e 234 if((block>=35)&&(block<=50)) {srn = 2;}
AhmedPlaymaker 29:c6358c39a70e 235 if((block>=51)&&(block<=66)) {srn = 3;}
AhmedPlaymaker 29:c6358c39a70e 236 if((block>=67)&&(block<=83)) {srn = 4;}
AhmedPlaymaker 29:c6358c39a70e 237 return srn;
AhmedPlaymaker 29:c6358c39a70e 238 }
AhmedPlaymaker 27:3b4775a0d0bb 239
AhmedPlaymaker 27:3b4775a0d0bb 240 void SnakevsBlock::ImplementCollision(Gamepad &pad) {
AhmedPlaymaker 42:973bb6036f81 241 send_block_number = 1;
AhmedPlaymaker 44:cd10d07ea1e5 242 if(blocknum > 0) { // to make sure that snake doesn't decrease in _length if number on the block is less than 1;
AhmedPlaymaker 41:4edac50f010d 243 _l.MinusLength();
AhmedPlaymaker 27:3b4775a0d0bb 244 pad.tone(1000.0,0.1);
AhmedPlaymaker 29:c6358c39a70e 245 wait(0.04);
AhmedPlaymaker 12:1e601b176437 246 }
AhmedPlaymaker 44:cd10d07ea1e5 247 blocknum-=1;
AhmedPlaymaker 13:9785f2404045 248 }
AhmedPlaymaker 13:9785f2404045 249
AhmedPlaymaker 38:30e4e6191762 250 void SnakevsBlock::CheckSnakeBlockSidesCollision(Gamepad &pad)
AhmedPlaymaker 42:973bb6036f81 251 {
AhmedPlaymaker 42:973bb6036f81 252 //If statements check if the snake sprite has collided with any
AhmedPlaymaker 42:973bb6036f81 253 //of the blocks' sides and then stop the snake moving in x axis
AhmedPlaymaker 50:3cf9a94a264e 254 int length = _length;
AhmedPlaymaker 50:3cf9a94a264e 255 if(_length>=10) {length = 10;} //to stop the snake length virtually at 10 when it goes past it.
AhmedPlaymaker 37:ee47699915b8 256
AhmedPlaymaker 42:973bb6036f81 257 for(int i=0; i<=9; i++) {
AhmedPlaymaker 42:973bb6036f81 258 b[i] = 1;
AhmedPlaymaker 42:973bb6036f81 259 }
AhmedPlaymaker 37:ee47699915b8 260 for(int i=0; i<=9; i++) { //i checks for all possible collisions with the snake respective to it's length.
AhmedPlaymaker 36:dfdd619874ae 261 for(int b_y_combination=0; b_y_combination<=10; b_y_combination++) {
AhmedPlaymaker 26:3495f7b0ede7 262 if (
AhmedPlaymaker 36:dfdd619874ae 263 (snake_pos[i].y == b_pos.y + b_y_combination) ||
AhmedPlaymaker 36:dfdd619874ae 264 (snake_pos[i].y + 1 == b_pos.y + b_y_combination) ||
AhmedPlaymaker 36:dfdd619874ae 265 (snake_pos[i].y + 2 == b_pos.y + b_y_combination)) {
AhmedPlaymaker 36:dfdd619874ae 266 for(int b_x_combination=2; b_x_combination<=82; b_x_combination+=16) {
AhmedPlaymaker 36:dfdd619874ae 267 //For West side of walls
AhmedPlaymaker 36:dfdd619874ae 268 if(
AhmedPlaymaker 36:dfdd619874ae 269 ((snake_pos[i].x == b_pos.x + b_x_combination+2) || //W
AhmedPlaymaker 50:3cf9a94a264e 270 (snake_pos[i].x + 1 == b_x_combination+2))&&(_d != E)&&(length > i) //W
AhmedPlaymaker 36:dfdd619874ae 271 ) {
AhmedPlaymaker 36:dfdd619874ae 272 //code makes sure that the colliding part doesn't move in x axis.
AhmedPlaymaker 37:ee47699915b8 273 for(int snake_beed_num=0; snake_beed_num<=10; snake_beed_num++) {
AhmedPlaymaker 50:3cf9a94a264e 274 if(length == snake_beed_num + i) {
AhmedPlaymaker 36:dfdd619874ae 275 b[snake_beed_num - 1] = 0;
AhmedPlaymaker 36:dfdd619874ae 276 }
AhmedPlaymaker 26:3495f7b0ede7 277 }
AhmedPlaymaker 25:e827f1a8fadc 278 }
AhmedPlaymaker 36:dfdd619874ae 279 //for East side of walls
AhmedPlaymaker 36:dfdd619874ae 280 else if (
AhmedPlaymaker 36:dfdd619874ae 281 ((snake_pos[i].x + 1 == b_x_combination) || //E
AhmedPlaymaker 50:3cf9a94a264e 282 (snake_pos[i].x + 2 == b_x_combination))&&(_d != W)&&(length > i) //E
AhmedPlaymaker 36:dfdd619874ae 283 ) {
AhmedPlaymaker 36:dfdd619874ae 284 //code makes sure that the colliding part doesn't move in x axis.
AhmedPlaymaker 37:ee47699915b8 285 for(int snake_beed_num=0; snake_beed_num<=10; snake_beed_num++) {
AhmedPlaymaker 50:3cf9a94a264e 286 if(length == snake_beed_num + i) {
AhmedPlaymaker 36:dfdd619874ae 287 b[snake_beed_num - 1] = 0;
AhmedPlaymaker 36:dfdd619874ae 288 }
AhmedPlaymaker 32:3a3bdeffdf62 289 }
AhmedPlaymaker 32:3a3bdeffdf62 290 }
AhmedPlaymaker 26:3495f7b0ede7 291 }
AhmedPlaymaker 25:e827f1a8fadc 292 }
AhmedPlaymaker 24:1c118b071430 293 }
AhmedPlaymaker 15:f4d069da093d 294 }
AhmedPlaymaker 22:ee698f66146f 295 }