Snake vs Block Game to be run upon K64F.

Dependencies:   mbed

Committer:
AhmedPlaymaker
Date:
Mon Apr 29 12:09:31 2019 +0000
Revision:
59:c65a2e933c47
Parent:
58:affb42c56cf8
Child:
60:d3a9e0e4a0de
Changed Winning criteria and level progression in general, also fixed an error with motion control in menu and joystick misbehavior problem, next is tutorials.

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