Snake vs Block Game to be run upon K64F.

Dependencies:   mbed

Snake/Snake.cpp

Committer:
AhmedPlaymaker
Date:
2019-04-25
Revision:
43:233f93860d08
Parent:
41:4edac50f010d
Child:
44:cd10d07ea1e5

File content as of revision 43:233f93860d08:

#include "Snake.h"

Snake::Snake()
{

}

Snake::~Snake()
{

}

//The Snake Sprite.
int snake_sprite[3][3] = {
    {0,1,0},
    {1,0,1},
    {0,1,0},
};

void Snake::init()
{
    _speed = 1;// change this according to the options selected
    m = 0; //Variable used to allow a starting location for the player.
}


void Snake::draw(Gamepad &pad, N5110 &lcd, int length, int level)
{
    _length = length;
    if(m == 0){
        _x[0] = WIDTH/2;  //Spawns player sprite near the middle of the screen.
        _y[0] = HEIGHT - 3;
        
        for(int i=0; i<=13; i++)  {
            _x[i+1] = _x[i];
            _y[i+1] = _y[i] - 3;
            b[i] = 1;
        }
        b[14] = 1;
        m = m+1;
    }
    //printf("SPRITE %d %d \n", _x[0], _y[0]); 
    if(_length == 0)  {
        pad.init();
        while ((pad.check_event(Gamepad::BACK_PRESSED) == false)) {
            lcd.clear();
            lcd.printString("Game",33,1);
            lcd.printString("Over",33,3);
            lcd.printString("Press Back",14,5); //Function used to promt the user to Restart.
            lcd.refresh();
            wait(0.1);
       }
        NVIC_SystemReset(); //Software Reset. //change this condition to loosing screen.
    }
    
    for(int a=1; a<=10; a++)  {
        if(_length == a)  {
            for(int i=0; i<=a-1; i++)  {
                lcd.drawSprite(_x[i],_y[i],3,3,(int *)snake_sprite); //Function used to draw the sprite.
            }
        }
    }
    if(_length >= 10) {
        for(int a=1; a<=10; a++)  {
            for(int i=0; i<=a-1; i++)  {
                lcd.drawSprite(_x[i],_y[i],3,3,(int *)snake_sprite); //Function used to draw the sprite.
            }
        }
    }
}


Vector2D Snake::get_pos()
{
    for(int i=1; i<=10; i++)  {
        if(_length == i)  {
            Vector2D snakepos = {_x[i-1],_y[i-1]}; //Obtains the snake position.
            return snakepos;
        }
    }
    if(_length >= 10)  {
            Vector2D snakepos = {_x[9],_y[9]}; //Obtains the snake position.
            return snakepos;
    }
    Vector2D snakepos = {-20,-20}; //Obtains the snake position.
    return snakepos;
    //printf("snakepos from player = %f %f \n", snakepos.x, snakepos.y);
}

Vector2D Snake::get_pos_before1()  //this sends data of following sprites.
{
    for(int i=2; i<=10; i++)  {
        if(_length == i)  {
            Vector2D snakepos_b1 = {_x[i-2],_y[i-2]}; //Obtains the snake position.
            return snakepos_b1;
        }
    }
    if(_length >= 10)  {
            Vector2D snakepos_b1 = {_x[8],_y[8]}; //Obtains the snake position.
            return snakepos_b1;
    }
    Vector2D snakepos_b1 = {-20,-20}; //Obtains the snake position.
    return snakepos_b1;
    //printf("snakepos_b1 from player = %f %f \n", snakepos_b1.x, snakepos_b1.y);
}

Vector2D Snake::get_pos_before2()  //this sends data of following sprites.
{
    for(int i=3; i<=10; i++)  {
        if(_length == i)  {
            Vector2D snakepos_b2 = {_x[i-3],_y[i-3]}; //Obtains the snake position.
            return snakepos_b2;
        }
    }
    if(_length >= 10)  {
            Vector2D snakepos_b2 = {_x[7],_y[7]}; //Obtains the snake position.
            return snakepos_b2;
    }
    Vector2D snakepos_b2 = {-20,-20}; //Obtains the snake position.
    return snakepos_b2;
    //printf("snakepos_b2 from player = %f %f \n", snakepos_b2.x, snakepos_b2.y);
}

Vector2D Snake::get_pos_before3()  //this sends data of following sprites.
{
    for(int i=4; i<=10; i++)  {
        if(_length == i)  {
            Vector2D snakepos_b3 = {_x[i-4],_y[i-4]}; //Obtains the snake position.
            return snakepos_b3;
        }
    }
    if(_length >= 10)  {
            Vector2D snakepos_b3 = {_x[6],_y[6]}; //Obtains the snake position.
            return snakepos_b3;
    }
    Vector2D snakepos_b3 = {-20,-20}; //Obtains the snake position.
    return snakepos_b3;
    //printf("snakepos_b3 from player = %f %f \n", snakepos_b3.x, snakepos_b3.y);
}

Vector2D Snake::get_pos_before4()  //this sends data of following sprites.
{
    for(int i=5; i<=10; i++)  {
        if(_length == i)  {
            Vector2D snakepos_b4 = {_x[i-5],_y[i-5]}; //Obtains the snake position.
            return snakepos_b4;
        }
    }
    if(_length >= 10)  {
            Vector2D snakepos_b4 = {_x[5],_y[5]}; //Obtains the snake position.
            return snakepos_b4;
    }
    Vector2D snakepos_b4 = {-20,-20}; //Obtains the snake position.
    return snakepos_b4;
    //printf("snakepos_b4 from player = %f %f \n", snakepos_b4.x, snakepos_b4.y);
}

Vector2D Snake::get_pos_before5()  //this sends data of following sprites.
{
    for(int i=6; i<=10; i++)  {
        if(_length == i)  {
            Vector2D snakepos_b5 = {_x[i-6],_y[i-6]}; //Obtains the snake position.
            return snakepos_b5;
        }
    }
    if(_length >= 10)  {
            Vector2D snakepos_b5 = {_x[4],_y[4]}; //Obtains the snake position.
            return snakepos_b5;
    }
    Vector2D snakepos_b5 = {-20,-20}; //Obtains the snake position.
    return snakepos_b5;
    //printf("snakepos_b5 from player = %f %f \n", snakepos_b5.x, snakepos_b5.y);
}

Vector2D Snake::get_pos_before6()  //this sends data of following sprites.
{
    for(int i=7; i<=10; i++)  {
        if(_length == i)  {
            Vector2D snakepos_b6 = {_x[i-7],_y[i-7]}; //Obtains the snake position.
            return snakepos_b6;
        }
    }
    if(_length >= 10)  {
            Vector2D snakepos_b6 = {_x[3],_y[3]}; //Obtains the snake position.
            return snakepos_b6;
    }
    Vector2D snakepos_b6 = {-20,-20}; //Obtains the snake position.
    return snakepos_b6;
    //printf("snakepos_b6 from player = %f %f \n", snakepos_b6.x, snakepos_b6.y);
}

Vector2D Snake::get_pos_before7()  //this sends data of following sprites.
{
    for(int i=8; i<=10; i++)  {
        if(_length == i)  {
            Vector2D snakepos_b7 = {_x[i-8],_y[i-8]}; //Obtains the snake position.
            return snakepos_b7;
        }
    }
    if(_length >= 10)  {
        Vector2D snakepos_b7 = {_x[2],_y[2]}; //Obtains the snake position.
        return snakepos_b7;
    }
    Vector2D snakepos_b7 = {-20,-20}; //Obtains the snake position.
    return snakepos_b7;
    //printf("snakepos_b7 from player = %f %f \n", snakepos_b7.x, snakepos_b7.y);
}

Vector2D Snake::get_pos_before8()  //this sends data of following sprites.
{
    for(int i=9; i<=10; i++)  {
        if(_length == i)  {
            Vector2D snakepos_b8 = {_x[i-9],_y[i-9]}; //Obtains the snake position.
            return snakepos_b8;
        }
    }
    if(_length >= 10)  {
        Vector2D snakepos_b8 = {_x[1],_y[1]}; //Obtains the snake position.
        return snakepos_b8;
    }
    Vector2D snakepos_b8 = {-20,-20}; //Obtains the snake position.
    return snakepos_b8;
    //printf("snakepos_b8 from player = %f %f \n", snakepos_b8.x, snakepos_b8.y);
}

Vector2D Snake::get_pos_before9()  //this sends data of following sprites.
{
    for(int i=10; i<=10; i++)  {
        if(_length == i)  {
            Vector2D snakepos_b9 = {_x[i-10],_y[i-10]}; //Obtains the snake position.
            return snakepos_b9;
        }
    }
    if(_length >= 10)  {
        Vector2D snakepos_b9 = {_x[0],_y[0]}; //Obtains the snake position.
        return snakepos_b9;
    }
    Vector2D snakepos_b9 = {-20,-20}; //Obtains the snake position.
    return snakepos_b9;
    //printf("snakepos_b9 from player = %f %f \n", snakepos_b9.x, snakepos_b9.y);
}

void Snake::update(Direction d, int* b)
{
    if(_length >= 10) {_length = 10;} //to stop the snake length virtually at 10 when it goes past it.
    
    //this makes all of the snake beeds chained together by making the lower ones drag towards where the top one was in the previous loop
    //the b[i] makes sure that the snake beed doesn't move if that beed is deactivated by colliding with a barrier. b[i] also signifies the specific beed number by i.
    for(int i=0; i<=13; i++)  {
        if((_length > i+1)&&(_x[i] != _x[i+1]))  {
            if ((_x[i] > _x[i+1])&&(b[i+1] == 1)&&(b[i] == 1))  {
                _x[i]-=_speed;    
            }
            if ((_x[i] < _x[i+1])&&(b[i+1] == 1)&&(b[i] == 1))  {
                _x[i]+=_speed;    
            }
        }
    }
   //this makes the controls of W/E directions only exclusive to the top beed in the snake
    for(int i=14; i>=0; i--)  {
            if((_length == i+1)&&(b[i] == 1))  {
                
                if (d == E) {_x[i]+= _speed;}
                
                if (d == W) {_x[i]-= _speed;}
                
            }
    }

// the following makes sure that when the length is increased, the snake stays where it was when it ate food.

    for(int i=2; i<=15; i++)  {
            
            if(_length < i)  {_x[i-1] = _x[i-2];}
    }
    
    //Limits set so that the snake does not travel off the screen.
    for(int i=0; i<=14; i++)  {
            
            if (_x[i] <= 0) {_x[i] = 0;}
            
            if (_x[i] > 81) {_x[i] = 81;}
    }
}