Owen Cavender 201159294

Dependencies:   mbed Gamepad2

snake.cpp

Committer:
el17oc
Date:
2020-05-27
Revision:
5:d716013c6a18
Parent:
3:d17d712c2e45
Child:
6:bf90044188d0

File content as of revision 5:d716013c6a18:

#include "snake.h"

Snake::Snake()
{

}

Snake::~Snake()
{

}


void Snake::init (GameEngine &engine)
{

    //WIDTH =84 HEIGHT = 42 //snakebody[0] is initalised may have to initilaise the other 2 og snake parts
    Vector2D SnakeHead = engine.get_Snakehead();

    _length = 2;                                                //  how do i initalise
    _gameover = false;
    _score = 0;
    _direction = up;
    Vector2D S0 = SnakeHead;
    
    // Vector2D S1 = engine.get_oldSnakehead();
    // Vector2D &Snakehead = {42, 24};
    // Vector2D &oldSnakehead  = {42, 23};
}




void Snake::gameover_true(N5110 &lcd)      //taking action if crash has occured
{
    if (_gameover == true) {

        lcd.clear();
        lcd.refresh();
        lcd.printString( "  Game Over L ", 0, 2 );
        lcd.printString ("score: _score ",15, 15);    //Need to add button to return to main screen / restart  //NEED to return score without ruining structure of lcd.PrintString( "string", x, y)

    }

    else {


    }
}




void Snake::check_scored(N5110 &lcd, Gamepad &pad, GameEngine &engine)
{
   Vector2D Applepos = engine.get_Applepos();   
                            //need to code clear apple and make sure apple isnt spawning every time

    if(S0.x == Applepos.x && S0.y == Applepos.y) {

        lcd.setPixel(Applepos.x, Applepos.y, 0);   // Plem:: Wanted to make sure that this didnt clear the pixel of the snake as it passes through it
        _score++;                                 //by waiting unil the snake has passed through before clearing the old apple however the new apple spawn needs to be ASAP after collection
        _length = _length++;
        engine.set_Applepos(lcd);    //randomises new values for _apx,_apy and draws on lcd -- draws on next loop-- the position is not needed until we compare it to Snakehead
        pad.tone(1500.0,0.5);          //need to clear apple
        pad.leds_on();
        wait(0.5);
        pad.leds_off();

    }
    lcd.setPixel(Applepos.x, Applepos.y,1);
}



int Snake::set_direction(Gamepad &pad)     //int type as Directions is an enum
{

    Directions _direction;


    if (pad.A_pressed()) {
        _direction = right;
    }

    if (pad.B_pressed()) {
        _direction = left;     //check these are orrecrt
    }

    if (pad.X_pressed()) {
        _direction = up;
    }
    if (pad.Y_pressed()) {
        _direction = down;
    } else {
        _direction = _direction;
    }
    return _direction;
}



void Snake::move_snakebody(GameEngine &engine, N5110 &lcd)
{
    lcd.refresh();
    
    Vector2D *_snakebody = new Vector2D [_length];
    _snakebody[0].x = S0.x;           //assign _sb0[0] before changing value
    _snakebody[0].y = S0.y;           //engine.get_oldSnakehead;                                           // _engine.get_oldSnakehead();


    while(1) {
        if (_direction == up) {           //           /-/
            S0.y++;                           ///// alters Snakehead initial value
            //    Does this code look okay ? returning _direction in previous function and accessing it in this one - _direction should be member function
        }
        if (_direction == down) {             // Direction should remain  after button is pressed - should not just change the snakehead coordinate once
            S0.y--;
        }
        if (_direction == left) {
            S0.x--;
        }

        if (_direction == right) {
            S0.x++;
        }
        lcd.setPixel(S0.x, S0.y, 1);   
                                                            //updates the head position before rendering so when it draws i=1 the 0 position will be new
        for(int i=1; i<=_length; i++) {                     //0 being head of snake  so snakepos[1]=snakepos[0] which is the head - moving up one place
            _snakebody[i].x = _snakebody[i-1].x;
            _snakebody[i].y = _snakebody[i-1].y;             //plotting of snake
        
            lcd.setPixel(_snakebody->x, _snakebody->y, 1);  //pointer used - need to point to x and y
                                                                    //Snake needs to follow itself - low numbers lead the way

            if((_snakebody[i].x == _snakebody[0].x) && (_snakebody[i].x == _snakebody[0].x)) { //  Unsure how to initially define the snake with (3 bits, when score =0) starting position  *without* redeclaring Vector2D *snakebody = new Vector2D [_length];
                _gameover = true;
            }
        }

    }
}
void Snake::check_wall_collisions()     // Vector2D *&snakebody hopefully this points to values stored in snakebody then can compare to snakehead
{

    if (S0.x == 0 || S0.x == 84 || S0.y == 0 || S0.y == 42) {   //how do i access snakehead.headx

        _gameover = true;
    } else {
    
    _gameover = _gameover;
}
}