Snake Code In C++ - C++ Programming Tutorial
C++ Course / Miscellaneous / Snake Code In C++

Snake Code In C++

BLUF: Mastering Snake Code In C++ is a critical step in becoming a proficient C++ developer. This lesson provides a deep dive into the syntax, performance considerations, and real-world applications of this concept.
Key Performance Insight: Snake Code In C++

C++ is renowned for its efficiency. Learn how Snake Code In C++ enables low-level control and high-performance computing in the tutorial below.

In this tutorial, we're going to develop a snake game using C++ and graphic libraries. This project will involve implementing C++ classes and utilizing computer graphics functions.

What do you mean by the Snake game?

The snake game is widely recognized as a popular game that is compatible with various devices and functions seamlessly across all operating systems. In this game, the snake has the ability to maneuver in multiple directions such as left, right, up, and down. Upon consuming food, the snake's length expands accordingly. The snake's nourishment will appear at specified time intervals.

What do you mean by C++?

C++ functions as an object-oriented programming language, often referred to as C++ with classes. This versatile language is cross-platform, enabling the development of sophisticated applications. With C++, developers can meticulously manage system resources and memory allocation.

What do you mean by Computer Graphics?

The phrase computer graphics refers to the data presented on a visual monitor or a hard copy from a computer in the form of diagrams, visuals, images, and symbols.

Graphics primitives in C++

A graphic primitive is a fundamental indivisible graphical component crucial for input or output in a computer graphics system. To render and generate graphics on the screen, a header file named <graphics.h> is necessary. It can be described as the way a computer visually represents and processes data. In addition to rendering shapes, animations, and multimedia content heavily rely on the graphics framework.

The subsequent functions are employed for generating visuals in the snake game:

Initgraph:

To commence the graphics functionality, the initgraph method must be utilized.

Syntax:

Define a function named Intergraph that takes in three parameters: a pointer to an integer variable for the graph driver, a pointer to an integer variable for the graph mode, and a pointer to a character array for the file path.

Initgraph function uses three-parameter:

  • gd: It is used for the graphics driver.
  • gm: It is used for the graphics mode.
  • path: It specifies the path where the graphic file is located.
  • closegraph:

It is used to close the graphics function.

Syntax:

void closegraph;

Outputting text:

In C graphics, text can be displayed using the functions outtext and outtextxy.

outtext:

It is employed to showcase the text at the present location.

Syntax:

void outtext(char *str);

outtextxy:

It is employed to showcase the text at the designated location.

Syntax:

void outtextxy(int x, int y, char *str);

Let's take the example of the snake game in C++.

Example 1:

Example

#include<iostream.h>

#include<conio.h>

#include<graphics.h>

#include<dos.h>

#include<stdlib.h>

#include<stdio.h>

#include<time.h>

#include<string.h>

class Snake

{

 int p1,p2,v1,v2,v3,e1,e2,prev,now,n,colr,dsp,cnt,dly,m;

 int stp, egGen;

 int xr, yr;

 void caught();

 public:

  long scr;

 int strtX,strtY,endX,endY;

 int pos[100][2];

 void show();

 void init();

 void egg();

 void transpose();

 void gnrtCond();

 void gnrtUnCond();

 void check();

 void checkEgg();

 void move();

 void chngDir();

 void sndEt();

 void sndCgt();

 int test();

 void score();

 Snake();

 Snake(Snake*);

 ~Snake();

 };

Snake::Snake()

 {

 }

Snake::~Snake()

{

}

void Snake::checkEgg()

{

 if((e1 == p1) && (e2 == p2))

 { sndEt();

  egg();

  dly--;

  score();

  n++;

  }

}

void Snake::sndEt()

{ nosound();

 sound(2500);

 delay(2);

 nosound();

}

void Snake::sndCgt()

{ nosound();

 for(int x=1000;x>0;x--)

 { sound(x);

  delay(1);

  }

 nosound();

}

void Snake::score()

{ char *p;

  ltoa(scr,p,10);

  settextstyle(8,0,1);

  setcolor(0);

  outtextxy(585,40,p);

  if(egGen != 1){

  scr = scr + dly / 10;

  }

  ltoa(scr,p,10);

  setcolor(10);

  outtextxy(585,40,p);

}

void Snake::gnrtCond()

{ if(n < 367)

 { if(now == 8 && (prev != 8 && prev != 2))

  { pos[0][0] = p1;

   pos[0][1] = p2 - dsp;

   prev = now;

   }

  if(now == 4 && (prev != 4 && prev != 1))

  { pos[0][0] = p1 + dsp;

   pos[0][1] = p2;

   prev = now;

   }

  if(now == 2 && (prev != 8 && prev != 2))

  { pos[0][0] = p1;

   pos[0][1] = p2 + dsp;

   prev = now;

   }

  if(now == 1 && (prev != 1 && prev != 4))

  {pos[0][0] = p1 - dsp;

   pos[0][1] = p2;

   prev = now;

   }

}

}

void Snake::gnrtUnCond()

{

  if( prev == 8 )

  { pos[0][0] = p1;

   pos[0][1] = p2 - dsp;

   }

 if( prev == 4 )

  {pos[0][0] = p1 + dsp;

   pos[0][1] = p2;

   }

 if( prev == 2 )

  { pos[0][0] = p1;

   pos[0][1] = p2 + dsp;

   }

 if( prev == 1 )

  {pos[0][0] = p1 - dsp;

   pos[0][1] = p2;

   }

 p1 = pos[0][0];

 p2 = pos[0][1];

}

void Snake::check()

{

 if(p1 > endX)

  {p1 = strtX;}

 else if(p1 < strtX)

  { p1 = endX;}

 if(p2 > endY)

  { p2 = strtY;}

 else if(p2 < strtY)

  { p2 = endY;}

 pos[0][0] = p1;

 pos[0][1] = p2;

for(int i = 1;i < n;i++)

  { if(p1 == pos[i][0] && p2 == pos[i][1])

  { caught();

   break;

  }

 }

}

void Snake::show()

{

  int x = getcolor();

  if(egGen != 1)

  {

  setcolor(getbkcolor());

  setfillstyle(1,getbkcolor());

  fillellipse(v1,v2,yr,yr);

   }

  else

   egGen = 0;

  if(egGen == 2)

   egGen--;

  setcolor(colr);

  setfillstyle(1,9);

  if(now == 8 || now == 2)

   fillellipse(pos[0][0],pos[0][1],xr,yr);

  else if(now == 4 || now == 1)

   fillellipse(pos[0][0],pos[0][1],yr,xr);

  setcolor(x);

}

void Snake::transpose()

{ int i,j,x,y;

   p1 = pos[0][0];

   p2 = pos[0][1];

   if(!egGen){

   v1 = pos[n-1][0];

   v2 = pos[n-1][1];

   }

   else

    egGen = 0;

   for(i = n-1;i >= 1;i--)

   {pos[i][0] = pos[i-1][0];

    pos[i][1] = pos[i-1][1];

   }

}

void Snake::move()

{ int st = 0;

  do{

   if(!kbhit())

   { checkEgg();

    if(!st)

     show();

    else

     st = 0;

    delay(dly/4);

    transpose();

    delay(dly/4);

    gnrtUnCond();

    delay(dly/4);

    check();

   delay(dly/4);

    }

   else if(stp){

   chngDir();

   gnrtCond();

   check();

   show();

   st = 1;

   }

   } while(stp);

}

void Snake::init()

{time_t tm;

 srand(time(&tm));

 dsp = 20;

 n = 5;

 prev = 4;

 for(int i = 4;i >= 0;i--)

 { pos[i][0] = 201 + (n - i - 1) * dsp;

  pos[i][1] = 301;

  }

  strtX = 21;

  strtY = 21;

  endX = 481;

  endY = 361;

  colr = 14;

  now = prev;

  dsp = 20;

  stp = 111;

  cnt = -1;

  scr = 0;

  dly = 150;

   xr = 3;

   yr = 9;

  egg();

  egGen = 1;

  score();

  int x = getcolor();

  setlinestyle(0,1,3);

  setcolor(15);

  rectangle(strtX-15,strtY-15,endX+15,endY+15);

  rectangle(endX+25,strtY-15,getmaxx()-15,endY+15);

  rectangle(strtX-15,endY+25,getmaxx()-15,getmaxy()-5);

  line(endX+25,strtY+75,getmaxx()-15,strtY+75);

  line(endX+25,strtY+200,getmaxx()-15,strtY+200);

  line(endX+25,strtY+275,getmaxx()-15,strtY+275);

  setlinestyle(0,1,1);

  settextstyle(8,0,1);

  setcolor(11);

  outtextxy(514,40,"SCORE");

  setcolor(14);

  settextstyle(11,0,5);

  outtextxy(524,110," CONTROLS ");

  outtextxy(522,135,"p = PAUSE");

  outtextxy(522,155,"g = RESUME");

  outtextxy(522,175,"e = EXIT");

  outtextxy(513,195,"ARROWS");

  outtextxy(512,205,"    -MOVEMENT");

  setcolor(14);

  settextstyle(4,0,9);

  outtextxy(getmaxx()-500,getmaxy()-110,"SNAKE");

  settextstyle(8,0,1);

  setcolor(x);

}

void Snake::caught()

{

 stp = 0;

 sndCgt();

for(int i=0;i<=7;i++)

 { if(i%2)

  { setcolor(10);

   outtextxy(512,250,"GAME OVER");

   delay(900);

   }

  else

  {setcolor(0);

   outtextxy(512,250,"GAME OVER");

   delay(500);

  }

  }

sleep(1);

}

void Snake::chngDir()

 { int clr;

 fillsettingstype *p;

 char x = getch();

 if(x == 72)

  now = 8;

 else if(x == 77)

  now = 4;

 else if(x == 80)

  now = 2;

 else if(x == 75)

  now = 1;

 else if(x == 'e')

  caught();

 else if(x == 'p')

 { //int y = getcolor();

  int twnkl = 1;

  settextstyle(11,0,9);

  while(1)

  {if(kbhit())

   { int c = getch();

    if(c == 'g')

    { clr = getcolor();

     setcolor(0);

     rectangle(endX+40,endY-10,getmaxx()-35,getmaxy()-160);

     outtextxy(endX+60,endY-29,"PAUSE");

     break;

     }

    }

   else

   { if(twnkl%2)

    { clr = getcolor();

     setcolor(10);

     rectangle(endX+40,endY-10,getmaxx()-35,getmaxy()-160);

     outtextxy(endX+60,endY-29,"PAUSE");

     setcolor(clr);

      delay(1000);

     }

    else

    {

     clr = getcolor();

     setcolor(0);

     rectangle(endX+40,endY-10,getmaxx()-35,getmaxy()-160);

     outtextxy(endX+60,endY-29,"PAUSE");

     delay(1000);

    }

   }

   twnkl++;

  }

    settextstyle(8,0,1);

 }

}

Snake::Snake(Snake *p)

{

 *p=NULL;

}

void Snake::egg()

{ do

  { e1 = (rand() % 100) * dsp + strtX;

   e2 = (rand() % 100) * dsp + strtY;

   } while(test());

  int x = getcolor();

  setcolor(7);

  setfillstyle(1,random(15)+1);

  fillellipse(e1,e2,xr+2,xr+2);

  setcolor(x);

  egGen = 2;

}

int Snake::test()

{ 

for(int i=0;i<n;i++)

  { if(e1 == pos[i][0] && e2 == pos[i][1])

    break;

   if(v1 == e1 && v2 == e2)

    break;

   if((e1 >= endX+1) || (e2 >= endY+1))

    break;

   }

 if(i != n)

  return 1;

 else

  return 0;

}

void main()

{

Snake snk;

 int gd=DETECT,gm,i,j,k,x,y;

 clrscr();

 initgraph(&gd,&gm,"C:\\Turboc3\\bgi");

 snk.init();

 snk.move();

 closegraph();

 restorecrtmode();

 }

Explanation:

In the previously mentioned example, a fundamental Snake Game has been developed. Within this project, classes and various computer graphics functions were utilized.

The basic functionalities of this game are given below.

  • The Snake is created with the help of a graphics function.
  • The fruit of the Snake is generated by the rand function of computer graphics.
  • The Snake can be moved in any direction with the help of the keyboard ( Right, up, and down keys).
  • When the Snake eats a fruit, the score will increase by 14 points.
  • In this game, we can create basic controls: p control is used to pause the game. We can click a p character from the keyword to pause the game. g control is used to resume the game. We can click a g character from the keyword to resume the game. e control is used to exit from the game. We can click an e character from the keyword to exit from the game.
  • p control is used to pause the game. We can click a p character from the keyword to pause the game.
  • g control is used to resume the game. We can click a g character from the keyword to resume the game.
  • e control is used to exit from the game. We can click an e character from the keyword to exit from the game.

Output:

Following is the output of this example:

Input Required

This code uses input(). Please provide values below:

Logic Practice
Install Logic Practice
Add to home screen for a faster app-like experience