C++ Tutorial – Detailed Explanation of Snake Game Code

In this article, we will create a Snake game using C++ and graphic functions. We will implement it using the concept of C++ classes and computer graphic functions.

What is the Snake Game?

The Snake game is a very famous game that can be played on various devices and runs on any operating system. In this game, the snake can move in all directions, such as left, right, up, and down; after eating food, the snake’s length increases. The snake’s food is generated at certain time intervals.

What is C++?

C++ is an object-oriented programming language, also known as C++ with classes. It is a cross-platform language that can be used to create high-level applications. It gives programmers a high degree of control over system resources and memory.

What are Computer Graphics?

Computer graphics are information displayed on visual displays or printed output in the form of charts, graphs, pictures, and symbols.

👇Click to Claim👇
👉C Language Knowledge Resource Collection

Graphic Primitives in C++

Graphic primitives are the basic indivisible graphic elements in a computer graphics system used for input or output. We need a header file called <graphics.h> to draw and create any graphics on the screen. It can also be defined as how a computer displays and manipulates data in an image format. Besides drawing various shapes, all animations and multimedia mainly run on graphic platforms.

The following functions are used to create graphics in the Snake game:

Initgraph():

To initialize graphic functions, we must use the initgraph() function.

Syntax:

void initgraph(int *graph_driver, int *graph_mode, char *path);

The initgraph function uses three parameters:

gd: for the graphic driver.

gm: for the graphic mode.

path: specifies the path where the graphic files are located.

closegraph(): used to close graphic functions.

Syntax:

void closegraph();

Output Text:

In C graphics, text can be output using the outtext() and outtextxy() functions.

outtext():

used to display text at the current position.

Syntax:

void outtext(char *str);

outtextxy():

used to display text at a specified position.

Syntax:

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

Let’s take the Snake game in C++ as an example.

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 above example, we implemented a basic Snake game. In this game, we used the concept of classes and some computer graphic functions.

The basic functions of this game are as follows:

  • Create a Snake using graphic functions.

  • Use the rand() function of computer graphics to generate the fruits of the Snake.

  • Move the Snake using the arrow keys on the keyboard (right, up, and down).

  • When the Snake eats the fruit, the score will increase by 14 points.

  • In this game, we can use some basic controls:

The ‘p’ key is used to pause the game. We can press the ‘p’ key on the keyboard to pause the game.

The ‘g’ key is used to resume the game. We can press the ‘g’ key on the keyboard to resume the game.

The ‘e’ key is used to exit the game. We can press the ‘e’ key on the keyboard to exit the game.

Output:

The following is the output of this example:

C++ Tutorial - Detailed Explanation of Snake Game Code

C++ Tutorial - Detailed Explanation of Snake Game Code


Hot Recommendations
  • CLion Tutorial – Basic Knowledge of CLion Editor

  • C Language Algorithm – “Level Order Traversal of Binary Tree” Algorithm Problem

  • C++ Tutorial – Detailed Explanation of C++ Language Friend Function

Leave a Comment