Tuesday, 13 July 2021

Snake game using C++

 Snake game using C++ Code.

#include <stdio.h>

#include <time.h>

#include <stdlib.h>

#include <conio.h>

#include<time.h>

#include<ctype.h>

#include <time.h>

#include <windows.h>

#include <process.h>


#define UP 72

#define DOWN 80

#define LEFT 75

#define RIGHT 77


int length;

int bend_no;

int len;

char key;

void record();

void load();

int life;

void Delay(long double);

void Move();

void Food();

int Score();

void Print();

void gotoxy(int x, int y);

void GotoXY(int x,int y);

void Bend();

void Boarder();

void Down();

void Left();

void Up();

void Right();

void ExitGame();

int Scoreonly();


struct coordinate{

    int x;

    int y;

    int direction;

};


typedef struct coordinate coordinate;


coordinate head, bend[500],food,body[30];


int main()

{


    char key;


    Print();


    system("cls");


    load();


    length=5;


    head.x=25;


    head.y=20;


    head.direction=RIGHT;


    Boarder();


    Food(); //to generate food coordinates initially


    life=3; //number of extra lives


    bend[0]=head;


    Move();   //initialing initial bend coordinate


    return 0;


}


void Move()

{

    int a,i;


    do{


        Food();

        fflush(stdin);


        len=0;


        for(i=0;i<30;i++)


        {


            body[i].x=0;


            body[i].y=0;


            if(i==length)


            break;


        }


        Delay(length);


        Boarder();


        if(head.direction==RIGHT)


            Right();


        else if(head.direction==LEFT)


            Left();


        else if(head.direction==DOWN)


            Down();


        else if(head.direction==UP)


            Up();


        ExitGame();


    }while(!kbhit());


    a=getch();


    if(a==27)


    {


        system("cls");


        exit(0);


    }

    key=getch();


    if((key==RIGHT&&head.direction!=LEFT&&head.direction!=RIGHT)||(key==LEFT&&head.direction!=RIGHT&&head.direction!=LEFT)||(key==UP&&head.direction!=DOWN&&head.direction!=UP)||(key==DOWN&&head.direction!=UP&&head.direction!=DOWN))


    {


        bend_no++;


        bend[bend_no]=head;


        head.direction=key;


        if(key==UP)


            head.y--;


        if(key==DOWN)


            head.y++;


        if(key==RIGHT)


            head.x++;


        if(key==LEFT)


            head.x--;


        Move();


    }


    else if(key==27)


    {


        system("cls");


        exit(0);


    }


    else


    {


        printf("\a");


        Move();


    }

}


void gotoxy(int x, int y)

{


 COORD coord;


 coord.X = x;


 coord.Y = y;


 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);


}

void GotoXY(int x, int y)

{

    HANDLE a;

    COORD b;

    fflush(stdout);

    b.X = x;

    b.Y = y;

    a = GetStdHandle(STD_OUTPUT_HANDLE);

    SetConsoleCursorPosition(a,b);

 }

void load(){

    int row,col,r,c,q;

    gotoxy(36,14);

    printf("loading...");

    gotoxy(30,15);

    for(r=1;r<=20;r++){

    for(q=0;q<=100000000;q++);//to display the character slowly

    printf("%c",177);}

    getch();

}

void Down()

{

    int i;

    for(i=0;i<=(head.y-bend[bend_no].y)&&len<length;i++)

    {

        GotoXY(head.x,head.y-i);

        {

            if(len==0)

                printf("v");

            else

                printf("*");

        }

        body[len].x=head.x;

        body[len].y=head.y-i;

        len++;

    }

    Bend();

    if(!kbhit())

        head.y++;

}

void Delay(long double k)

{

    Score();

    long double i;

    for(i=0;i<=(10000000);i++);

}

void ExitGame()

{

    int i,check=0;

    for(i=4;i<length;i++)   //starts with 4 because it needs minimum 4 element to touch its own body

    {

        if(body[0].x==body[i].x&&body[0].y==body[i].y)

        {

            check++;    //check's value increases as the coordinates of head is equal to any other body coordinate

        }

        if(i==length||check!=0)

            break;

    }

    if(head.x<=10||head.x>=70||head.y<=10||head.y>=30||check!=0)

    {

        life--;

        if(life>=0)

        {

            head.x=25;

            head.y=20;

            bend_no=0;

            head.direction=RIGHT;

            Move();

        }

        else

        {

            system("cls");

            printf("All lives completed\nBetter Luck Next Time!!!\nPress any key to quit the game\n");

            record();

            exit(0);

        }

    }

}

void Food()

{

    if(head.x==food.x&&head.y==food.y)

    {

        length++;

        time_t a;

        a=time(0);

        srand(a);

        food.x=rand()%70;

        if(food.x<=10)

            food.x+=11;

        food.y=rand()%30;

        if(food.y<=10)


            food.y+=11;

    }

    else if(food.x==0)/*to create food for the first time coz global variable are initialized with 0*/

    {

        food.x=rand()%70;

        if(food.x<=10)

            food.x+=11;

        food.y=rand()%30;

        if(food.y<=10)

            food.y+=11;

    }

}

void Left()

{

    int i;

    for(i=0;i<=(bend[bend_no].x-head.x)&&len<length;i++)

    {

        GotoXY((head.x+i),head.y);

       {

                if(len==0)

                    printf("<");

                else

                    printf("*");

        }

        body[len].x=head.x+i;

        body[len].y=head.y;

        len++;

    }

    Bend();

    if(!kbhit())

        head.x--;


}

void Right()

{

    int i;

    for(i=0;i<=(head.x-bend[bend_no].x)&&len<length;i++)

    {

        //GotoXY((head.x-i),head.y);

        body[len].x=head.x-i;

        body[len].y=head.y;

        GotoXY(body[len].x,body[len].y);

        {

            if(len==0)

                printf(">");

            else

                printf("*");

        }

        /*body[len].x=head.x-i;

        body[len].y=head.y;*/

        len++;

    }

    Bend();

    if(!kbhit())

        head.x++;

}

void Bend()

{

    int i,j,diff;

    for(i=bend_no;i>=0&&len<length;i--)

    {

            if(bend[i].x==bend[i-1].x)

            {

                diff=bend[i].y-bend[i-1].y;

                if(diff<0)

                    for(j=1;j<=(-diff);j++)

                    {

                        body[len].x=bend[i].x;

                        body[len].y=bend[i].y+j;

                        GotoXY(body[len].x,body[len].y);

                        printf("*");

                        len++;

                        if(len==length)

                            break;

                    }

                else if(diff>0)

                    for(j=1;j<=diff;j++)

                    {

                        /*GotoXY(bend[i].x,(bend[i].y-j));

                        printf("*");*/

                        body[len].x=bend[i].x;

                        body[len].y=bend[i].y-j;

                        GotoXY(body[len].x,body[len].y);

                        printf("*");

                        len++;

                        if(len==length)

                            break;

                    }

            }

        else if(bend[i].y==bend[i-1].y)

        {

            diff=bend[i].x-bend[i-1].x;

            if(diff<0)

                for(j=1;j<=(-diff)&&len<length;j++)

                {

                    /*GotoXY((bend[i].x+j),bend[i].y);

                    printf("*");*/

                    body[len].x=bend[i].x+j;

                    body[len].y=bend[i].y;

                    GotoXY(body[len].x,body[len].y);

                        printf("*");

                   len++;

                   if(len==length)

                           break;

               }

           else if(diff>0)

               for(j=1;j<=diff&&len<length;j++)

               {

                   /*GotoXY((bend[i].x-j),bend[i].y);

                   printf("*");*/

                   body[len].x=bend[i].x-j;

                   body[len].y=bend[i].y;

                   GotoXY(body[len].x,body[len].y);

                       printf("*");

                   len++;

                   if(len==length)

                       break;

               }

       }

   }

}

void Boarder()

{

   system("cls");

   int i;

   GotoXY(food.x,food.y);   /*displaying food*/

       printf("o");

   for(i=10;i<71;i++)

   {

       GotoXY(i,10);

           printf("!");

       GotoXY(i,30);

           printf("!");

   }

   for(i=10;i<31;i++)

   {

       GotoXY(10,i);

           printf("!");

       GotoXY(70,i);

       printf("!");

   }

}

void Print()

{

   //GotoXY(10,12);

   printf("\tWelcome to the mini Snake game.(press any key to continue)\n");

  getch();

   system("cls");

   printf("\tGame instructions:\n");

   printf("\n-> Use arrow keys to move the snake.\n\n-> You will be provided foods at the several coordinates of the screen which you have to eat. Everytime you eat a food the length of the snake will be increased by 1 element and thus the score.\n\n-> Here you are provided with three lives. Your life will decrease as you hit the wall or snake's body.\n\n-> YOu can pause the game in its middle by pressing any key. To continue the paused game press any other key once again\n\n-> If you want to exit press esc. \n");

   printf("\n\nPress any key to play game...");

   if(getch()==27)

   exit(0);

}

void record(){

   char plname[20],nplname[20],cha,c;

   int i,j,px;

   FILE *info;

   info=fopen("record.txt","a+");

   getch();

   system("cls");

   printf("Enter your name\n");

   scanf("%[^\n]",plname);

   //************************

   for(j=0;plname[j]!='\0';j++){ //to convert the first letter after space to capital

   nplname[0]=toupper(plname[0]);

   if(plname[j-1]==' '){

   nplname[j]=toupper(plname[j]);

   nplname[j-1]=plname[j-1];}

   else nplname[j]=plname[j];

   }

   nplname[j]='\0';

   //*****************************

   //sdfprintf(info,"\t\t\tPlayers List\n");

   fprintf(info,"Player Name :%s\n",nplname);

    //for date and time


   time_t mytime;

  mytime = time(NULL);

  fprintf(info,"Played Date:%s",ctime(&mytime));

     //**************************

     fprintf(info,"Score:%d\n",px=Scoreonly());//call score to display score

     //fprintf(info,"\nLevel:%d\n",10);//call level to display level

   for(i=0;i<=50;i++)

   fprintf(info,"%c",'_');

   fprintf(info,"\n");

   fclose(info);

   printf("wanna see past records press 'y'\n");

   cha=getch();

   system("cls");

   if(cha=='y'){

   info=fopen("record.txt","r");

   do{

       putchar(c=getc(info));

       }while(c!=EOF);}

     fclose(info);

}

int Score()

{

   int score;

   GotoXY(20,8);

   score=length-5;

   printf("SCORE : %d",(length-5));

   score=length-5;

   GotoXY(50,8);

   printf("Life : %d",life);

   return score;

}

int Scoreonly()

{

int score=Score();

system("cls");

return score;

}

void Up()

{

   int i;

   for(i=0;i<=(bend[bend_no].y-head.y)&&len<length;i++)

   {

       GotoXY(head.x,head.y+i);

       {

           if(len==0)

               printf("^");

           else

               printf("*");

       }

       body[len].x=head.x;

       body[len].y=head.y+i;

       len++;

   }

   Bend();

   if(!kbhit())

       head.y--;

}


This Image show your game Interface.


Also Click this link you play game.


No comments:

Post a Comment