Snake game snake library

Snake.cpp

Committer:
Nefos
Date:
2017-05-05
Revision:
5:449858a54971
Parent:
4:c74ec3f409f9
Child:
6:cc8d2088f490

File content as of revision 5:449858a54971:

#include "Snake.h"


#define WIDTH 84
#define HEIGHT 48
#define CEILING 8
#define FLOOR 48

snakePart snek;



Snake::Snake()
{

}
Snake::~Snake()
{
  
}

void Snake::init(int x, int y, int lenght, int _live){
    
    
    
    //initalizing the starting variables
    //snek._x[0]=x;
    //snek._y[0]=y;
    startx=x;
    starty=y;
    startl=lenght;
    live=_live;
    /*if (live==0){
            live=3;
    }*/
    _length = lenght;
    
    _food.init();
    for (int i=0;_length>i;i++)
    {   
        snek._x[i]=x+i;
        snek._y[i]=y;
        snek._dir[i]=1;
    }
    snek._x[_length]=x+_length;
    snek._y[_length]=y;
    
   /* snek._y[0]=y;
    snek._y[1]=y+1;
    snek._y[2]=y+2;
    snek._y[3]=y+2;
    snek._y[4]=y+3;
    snek._y[5]=y+3;
    snek._y[6]=y+4;*/
    _direction = 1;//1 is East, 2 is South, 3 is West, 4 is North
    
    
    
    printf("xog is %d  ", snek._x[_length-1]);
    //printf("initalized");
    }

void Snake::draw(N5110 &lcd){
        checkWallCollision(lcd);
        checkTailCollision(lcd);
            if (live!=0){
                lcd.clear();
                waitCount=((float)_length/3)+5;
                waitTime=(1/waitCount);
                wait(waitTime);
                char buffer1[14];
                char buffer2[14];
                sprintf(buffer1,"%2d",live);
                sprintf(buffer2,"%2d",_length);
                lcd.printString(buffer1,25,0);
                lcd.printString(buffer2,70,0);
                _food.draw(lcd);
                lcd.drawRect(0,8,84,48-8,FILL_TRANSPARENT);
                lcd.printString("Life:",0,0);
                lcd.printString("Pts:",40,0);
                
                for ( int i=0; _length>i;i++){
                    if (snek._x!=0)
                        {
                            if (snek._y!=0)
                                {
                                    lcd.setPixel(snek._x[i],snek._y[i]);
                                }
                        }
                
               
                
                lcd.refresh();
                
                //printf("drawn");
                }
       }//live loop 
       
}
void Snake::update(Gamepad &pad){
     
     if (live!=0){
    
            d=pad.get_direction();
            startx=snek._x[0];
            
            printf("x+1 is %d", snek._x[_length+1]);
            printf("y+1 is %d", snek._y[_length+1]);
            printf("dir+1 is %d", snek._dir[_length+1]);
            printf("length is %d", _length);
    
             /*if ( pad.check_event(Gamepad::A_PRESSED) == true)//testing the add_point manually
            {
                snek._x[_length+1]=snek._x[_length];//-1
                snek._y[_length+1]=snek._y[_length];
                snek._dir[_length+1]=snek._dir[_length-1];
                _length=_length+1;
                printf("length+1 is %d", _length);
                
            }
            */
    
    
       //printf("x is %d  ", snek._x[_length-1]);
            if (snek._dir[_length-1]==1)
                {
                    snek._x[_length]++;                    
                }
            
            if (snek._dir[_length-1]==2)
                {
                    snek._y[_length]--;
                
                }
            
            if (snek._dir[_length-1]==3)
                {
                    snek._x[_length]--;                    
                }
                
            if (snek._dir[_length-1]==4)
                {
                    snek._y[_length]++;                                        
                }
            
            for (int i=0 ;_length<i ;i++)
                {                      
                    snek._x[i]=snek._x[i+1];
                    snek._y[i]=snek._y[i+1];
                    //printf("done");                    
                }
            
                                  
                    //check dpad which way it is pointing
                    //set direction accordingly, 1 is right, up is 2, 3 is left and 4 is down
                    //set a breakpoint at head by snakeX/Y[i]
                    //switch case to make sure direction is good
                    //if head == food, _length++, and -direction we add 1 length
                    // if head==wall game over
            if (d==N){
                
                        if (snek._dir[_length-1]!=4)
                            {
                                snek._dir[_length-1] = 2;                                
                            }

            }
            
            if (d==E){
                
                        if (snek._dir[_length-1]!=3)
                            {
                                snek._dir[_length-1] = 1;                                
                            }
                
                }
            if (d==W){
                
                        if (snek._dir[_length-1]!=1)
                            {
                                snek._dir[_length-1] = 3;
                            }
                
                
                }
            if (d==S){
                
                        if (snek._dir[_length-1]!=2)
                            {
                                snek._dir[_length-1] = 4;
                            }
                
                
                }
        
            printf("updated ");
            add_point();
        }//live loop
}

void Snake::add_point(){
    
    posXY foodPos = _food.returnPos();
    if(snek._x[_length-1]==foodPos.x && snek._y[_length-1]== foodPos.y)
        {
            snek._x[_length+1]=snek._x[_length];//-1
            snek._y[_length+1]=snek._y[_length];
            snek._dir[_length+1]=snek._dir[_length-1];
            _length=_length+1;
            _food.respawn();
        }
}//end of add_point

void Snake::deadSnake(N5110 &lcd){
        
       
        live--; 
        while (live==0){
            lcd.clear();
            lcd.printString("Game Over",0,1);
            lcd.printString("Press Start",0,2);
            lcd.printString("To restart",0,3);
            lcd.refresh(); 
          
        }
                //lcd.clear();
        //lcd.printString("Game Over",0,1);
        //lcd.refresh();    
        
        init(25,starty,startl,live);
        
}//end of deadSnake
        
void Snake::checkWallCollision(N5110 &lcd){
    
    if (snek._x[_length]==WIDTH||snek._x[_length]==0)//if snake head hits side walls
        {     
            deadSnake(lcd);
        }
    if (snek._y[_length]==CEILING||snek._y[_length]==FLOOR)//if snake hits top or bottom walls
        {     
            deadSnake(lcd);
        }
    
}//end of checkWallCollision

void Snake::checkTailCollision(N5110 &lcd){
    for (int i=0 ;_length<i ;i++){
                                          
                    if (snek._x[_length-1]==snek._x[i] && snek._y[_length-1]==snek._y[i])
                        {
                            deadSnake(lcd);
                        }
                }
    
    
}