Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependencies: mbed ll16j23s_test_docs
SnakeBody/SnakeBody.cpp
- Committer:
- JoeShotton
- Date:
- 2020-05-25
- Revision:
- 8:bcc3403d7e79
- Parent:
- 7:dd84e0fab346
- Child:
- 9:0571880085cc
File content as of revision 8:bcc3403d7e79:
#include "SnakeBody.h"
SnakeBody::SnakeBody()
{
_x_head = 42;
_y_head = 24;
_length = 4;
_angle = -1.0;
_state = 0;
_d = 0;
}
SnakeBody::~SnakeBody()
{
//destructor
}
void SnakeBody::init() {
_body_x.clear();
_body_x.push_back(42);
_body_y.clear();
_body_y.push_back(24);
}
int SnakeBody::update_direction(float _angle, int _x_head, int _y_head) {
if ((_x_head % 2) + (_y_head % 2) == 0) { // only allows changing movement when the snake is cell-aligned (ie x and y are even)
// partition 360 into segments and check which segment the angle is in
if (_angle < 0.0f) { //check for -1.0 angle
_d = 0;
} else if (_angle < 45.0f) { //North quadrant
_d = 1;
} else if (_angle < 135.0f) { //East quadrant
_d = 2;
} else if (_angle < 225.0f) { //South quadrant
_d = 3;
} else if (_angle < 315.0f) { //West quadrant
_d = 4;
} else { //NW half - quadrant
_d = 1;
}
}
//printf("D: %d\n", _d);
return _d; //returns quadrant, represented by direction integer
};
void SnakeBody::update_position() {
Direction _fsm[5] = {
{0, 0, {0,1,2,3,4}}, // Centred
{0, -1, {1,1,2,1,4}}, // North, will not go to centre or south
{1, 0, {2,1,2,3,2}}, // East, will not go to centre or west
{0, 1, {3,3,2,3,4}}, // South, will not go to centre or north
{-1, 0, {4,1,4,3,4}} // West, will not go to centre or east
};
_state = _fsm[_state].nextState[_d]; // adjusts direction fsm state based on direction
//printf("State: %d\n", _state);
_x_head += _fsm[_state].delta_x; // increments x value based on fsm state value
_y_head += _fsm[_state].delta_y; // increments y value based on fsm state value
_x_head = ((_x_head % 84) + 84) % 84; // wraps x back to within range 0-83
_y_head = ((_y_head % 48) + 48) % 48; // wraps y back to within range 0-47
//printf("x_head: %d\n", _x_head);
//printf("y_head: %d\n", _y_head);
};
void SnakeBody::snake_movement(Gamepad &pad) {
float _angle = pad.get_angle(); //finds joystick angle
//printf("Joystick angle: %f\n", _angle);
_d = update_direction(_angle, _x_head, _y_head); //converts angle into a integer direction
update_position(); //takes integer direction and feeds it into FSM to move snake in correct direction
update_body();
}
void SnakeBody::update_body() {
if ((_x_head % 2) + (_y_head % 2) == 0) { //only updates body when cell aligned
_body_x.insert(_body_x.begin(), _x_head); //sets first array element to head coordinates
_body_y.insert(_body_y.begin(), _y_head);
_body_x.erase(_body_x.begin() + _length, _body_x.end());
_body_y.erase(_body_y.begin() + _length, _body_y.end());
}
}
void SnakeBody::draw_body(N5110 &lcd){
lcd.drawRect(_x_head,_y_head,2,2,FILL_BLACK);
for(int i = 0; i < _length; i++) {
lcd.drawRect(_body_x[i],_body_y[i],2,2,FILL_BLACK);
}
}
bool SnakeBody::snake_snake_collision(Gamepad &pad){
if (_state > 0) {
for(int i = 3; i < _length; i++) {
if (_x_head == _body_x[i] && _y_head == _body_y[i]) { //checks if head coord is the same as any of the body coords
pad.led(1,0.9);
//printf("DEAD \n");
_state = 0;
return true;
} else {
//pad.led(1,0.0);
//printf("ALIVE \n");
//return false;
}
}
}
}