Snake is a classic game that includes a growing line represented as a snake that can consume items, change direction, and grow in length. As the snake grows larger in length, the difficulty of the game grows. In this article, we will create a snake game using a C++ program.
Rules to Play Snake Game
- Don’t hit a wall and don’t bite your own tail.
- Crashing into a wall or your tail will end the game immediately.
- 10 points will be added to the player’s score for eating the fruit (#).
- The player’s total score is calculated based on the number of fruits the snake consumed.
- The length of the snake will be increased after eating the fruits.
- Use w, a, s, d to move the snake.
Steps to Write a Snake Game
By following these steps, you will be able to create a fully functional snake game in C++ which can be played in the console using the keyboard.
Step 1: Setting Up The Project
Create a new C++ source file (.cpp) in your desired directory.
Step 2: Including Necessary Libraries
We need 3 different libraries that are:
C++
#include <conio.h>
#include <iostream>
#include <windows.h>
Here,
- iostream: Standard Input and Output Library of C++..
- windows.h: Windows API Library.
- conio.h: Non-Standard Library that contains console commands.
Step 3: Defining Global Variables for the Game
We have to specify some global game variables that we need to be accessible to all the functions. These are:
C++
// height and width of the boundary
const int width = 80;
const int height = 20;
// Snake head coordinates of snake (x-axis, y-axis)
int x, y;
// Food coordinates
int fruitCordX, fruitCordY;
// variable to store the score of he player
int playerScore;
// Array to store the coordinates of snake tail (x-axis,
// y-axis)
int snakeTailX[100], snakeTailY[100];
// variable to store the length of the sanke's tail
int snakeTailLen;
// for storing snake's moving snakesDirection
enum snakesDirection { STOP = 0, LEFT, RIGHT, UP, DOWN };
// snakesDirection variable
snakesDirection sDir;
// boolean variable for checking game is over or not
bool isGameOver;
Step 4: Initializing the Game
Create a function named GameInit() of void type for initializing the game variables.
C++
void GameInit()
{
isGameOver = false;
sDir = STOP;
x = width / 2;
y = height / 2;
fruitCordX = rand() % width;
fruitCordY = rand() % height;
playerScore = 0;
}
Step 5: Creating Game Board cum Game Rendering Function
Create a function named GameRender() of void type for creating the game board and rendering the game whenever needed in the console.
C++
// Function for creating the game board & rendering
void GameRender(string playerName)
{
system("cls"); // Clear the console
// Creating top walls with '-'
for (int i = 0; i < width + 2; i++)
cout << "-";
cout << endl;
for (int i = 0; i < height; i++) {
for (int j = 0; j <= width; j++) {
// Creating side walls with '|'
if (j == 0 || j == width)
cout << "|";
// Creating snake's head with 'O'
if (i == y && j == x)
cout << "O";
// Creating the sanke's food with '#'
else if (i == fruitCordY && j == fruitCordX)
cout << "#";
// Creating snake's head with 'O'
else {
bool prTail = false;
for (int k = 0; k < snakeTailLen; k++) {
if (snakeTailX[k] == j
&& snakeTailY[k] == i) {
cout << "o";
prTail = true;
}
}
if (!prTail)
cout << " ";
}
}
cout << endl;
}
// Creating bottom walls with '-'
for (int i = 0; i < width + 2; i++)
cout << "-";
cout << endl;
// Display player's score
cout << playerName << "'s Score: " << playerScore
<< endl;
}
Step 6: Updating the Game State
Create a function named UpdateGame() of void type for updatig the game state after each move.
C++
// Function for updating the game state
void UpdateGame()
{
int prevX = snakeTailX[0];
int prevY = snakeTailY[0];
int prev2X, prev2Y;
snakeTailX[0] = x;
snakeTailY[0] = y;
for (int i = 1; i < snakeTailLen; i++) {
prev2X = snakeTailX[i];
prev2Y = snakeTailY[i];
snakeTailX[i] = prevX;
snakeTailY[i] = prevY;
prevX = prev2X;
prevY = prev2Y;
}
switch (sDir) {
case LEFT:
x--;
break;
case RIGHT:
x++;
break;
case UP:
y--;
break;
case DOWN:
y++;
break;
}
// Checks for snake's collision with the wall (|)
if (x >= width || x < 0 || y >= height || y < 0)
isGameOver = true;
// Checks for collision with the tail (o)
for (int i = 0; i < snakeTailLen; i++) {
if (snakeTailX[i] == x && snakeTailY[i] == y)
isGameOver = true;
}
// Checks for snake's collision with the food (#)
if (x == fruitCordX && y == fruitCordY) {
playerScore += 10;
fruitCordX = rand() % width;
fruitCordY = rand() % height;
snakeTailLen++;
}
}
Step 7: Setting the Game Difficulty
Create a function named SetDifficulty() of int type for setting up the game difficulty(returns a int variable ‘dfc’).
C++
// Function to set the game difficulty level
int SetDifficulty()
{
int dfc, choice;
cout << "\nSET DIFFICULTY\n1: Easy\n2: Medium\n3: hard "
"\nNOTE: if not chosen or pressed any other "
"key, the difficulty will be automatically set "
"to medium\nChoose difficulty level: ";
cin >> choice;
switch (choice) {
case '1':
dfc = 50;
break;
case '2':
dfc = 100;
break;
case '3':
dfc = 150;
break;
default:
dfc = 100;
}
return dfc;
}
Step 8: Handling User Input
Create a function named UserInput() of void type for getting the user input for playing the game.
C++
// Function to handle user UserInput
void UserInput()
{
// Checks if a key is pressed or not
if (_kbhit()) {
// Getting the pressed key
switch (_getch()) {
case 'a':
sDir = LEFT;
break;
case 'd':
sDir = RIGHT;
break;
case 'w':
sDir = UP;
break;
case 's':
sDir = DOWN;
break;
case 'x':
isGameOver = true;
break;
}
}
}
Note:
1._kbhit() function checks the console for a recent keystroke. If the function returns a nonzero value, a keystroke is waiting in the buffer. The program can then call _getch() or _getche() to get the keystroke.
2. getch()is a nonstandard function and is present in file which is mostly used by. It is not part of the C standard library or ISO C, nor is it defined by POSIX
Step 9: Creating Main Function
Create a loop in the main() function to continuously update the game state, render the game, and handle user input.
C++
// Main function / game looping function
int main()
{
string playerName;
cout << "enter your name: ";
cin >> playerName;
int dfc = SetDifficulty();
GameInit();
while (!isGameOver) {
GameRender(playerName);
UserInput();
UpdateGame();
// creating a delay for according to the chosen
// difficulty
Sleep(dfc);
}
return 0;
}
C++ Program to Implement Snake Game
C++
// required header file
#include <conio.h>
#include <iostream>
#include <windows.h>
using namespace std;
// height and width of the boundary
const int width = 80;
const int height = 20;
// Snake head coordinates of snake (x-axis, y-axis)
int x, y;
// Food coordinates
int fruitCordX, fruitCordY;
// variable to store the score of he player
int playerScore;
// Array to store the coordinates of snake tail (x-axis,
// y-axis)
int snakeTailX[100], snakeTailY[100];
// variable to store the length of the sanke's tail
int snakeTailLen;
// for storing snake's moving snakesDirection
enum snakesDirection { STOP = 0, LEFT, RIGHT, UP, DOWN };
// snakesDirection variable
snakesDirection sDir;
// boolean variable for checking game is over or not
bool isGameOver;
// Function to initialize game variables
void GameInit()
{
isGameOver = false;
sDir = STOP;
x = width / 2;
y = height / 2;
fruitCordX = rand() % width;
fruitCordY = rand() % height;
playerScore = 0;
}
// Function for creating the game board & rendering
void GameRender(string playerName)
{
system("cls"); // Clear the console
// Creating top walls with '-'
for (int i = 0; i < width + 2; i++)
cout << "-";
cout << endl;
for (int i = 0; i < height; i++) {
for (int j = 0; j <= width; j++) {
// Creating side walls with '|'
if (j == 0 || j == width)
cout << "|";
// Creating snake's head with 'O'
if (i == y && j == x)
cout << "O";
// Creating the sanke's food with '#'
else if (i == fruitCordY && j == fruitCordX)
cout << "#";
// Creating snake's head with 'O'
else {
bool prTail = false;
for (int k = 0; k < snakeTailLen; k++) {
if (snakeTailX[k] == j
&& snakeTailY[k] == i) {
cout << "o";
prTail = true;
}
}
if (!prTail)
cout << " ";
}
}
cout << endl;
}
// Creating bottom walls with '-'
for (int i = 0; i < width + 2; i++)
cout << "-";
cout << endl;
// Display player's score
cout << playerName << "'s Score: " << playerScore
<< endl;
}
// Function for updating the game state
void UpdateGame()
{
int prevX = snakeTailX[0];
int prevY = snakeTailY[0];
int prev2X, prev2Y;
snakeTailX[0] = x;
snakeTailY[0] = y;
for (int i = 1; i < snakeTailLen; i++) {
prev2X = snakeTailX[i];
prev2Y = snakeTailY[i];
snakeTailX[i] = prevX;
snakeTailY[i] = prevY;
prevX = prev2X;
prevY = prev2Y;
}
switch (sDir) {
case LEFT:
x--;
break;
case RIGHT:
x++;
break;
case UP:
y--;
break;
case DOWN:
y++;
break;
}
// Checks for snake's collision with the wall (|)
if (x >= width || x < 0 || y >= height || y < 0)
isGameOver = true;
// Checks for collision with the tail (o)
for (int i = 0; i < snakeTailLen; i++) {
if (snakeTailX[i] == x && snakeTailY[i] == y)
isGameOver = true;
}
// Checks for snake's collision with the food (#)
if (x == fruitCordX && y == fruitCordY) {
playerScore += 10;
fruitCordX = rand() % width;
fruitCordY = rand() % height;
snakeTailLen++;
}
}
// Function to set the game difficulty level
int SetDifficulty()
{
int dfc, choice;
cout << "\nSET DIFFICULTY\n1: Easy\n2: Medium\n3: hard "
"\nNOTE: if not chosen or pressed any other "
"key, the difficulty will be automatically set "
"to medium\nChoose difficulty level: ";
cin >> choice;
switch (choice) {
case '1':
dfc = 50;
break;
case '2':
dfc = 100;
break;
case '3':
dfc = 150;
break;
default:
dfc = 100;
}
return dfc;
}
// Function to handle user UserInput
void UserInput()
{
// Checks if a key is pressed or not
if (_kbhit()) {
// Getting the pressed key
switch (_getch()) {
case 'a':
sDir = LEFT;
break;
case 'd':
sDir = RIGHT;
break;
case 'w':
sDir = UP;
break;
case 's':
sDir = DOWN;
break;
case 'x':
isGameOver = true;
break;
}
}
}
// Main function / game looping function
int main()
{
string playerName;
cout << "enter your name: ";
cin >> playerName;
int dfc = SetDifficulty();
GameInit();
while (!isGameOver) {
GameRender(playerName);
UserInput();
UpdateGame();
// creating a delay for according to the chosen
// difficulty
Sleep(dfc);
}
return 0;
}
Output/Game Screenshots
1. Entering the Player’s Name and Choosing the Difficulty.

2. Initial State of the Game

3. Game Termination When Snake Collides with the Wall

4. Game Termination when Snake Collides with its Own Tail

Similar Reads
Snake and Ladder Game in C
Snake and Ladder game is a traditional game that involves two or more players and the winner is the guy who reaches the final square on the game board at the earliest. Components of the GameA square board with a series of numbered squares arranged in m x m grid.A dice to be rolled usually uses a six
5 min read
raise() function in C++
csignal header file declared the function raise() to handle a particular signal. Signal learns some unusual behavior in a program, and calls the signal handler. It is implemented to check if the default handler will get called or it will be ignored. Syntax: int raise ( int signal_ ) Parameter: The f
3 min read
cout in C++
In C++, cout is an object of the ostream class that is used to display output to the standard output device, usually the monitor. It is associated with the standard C output stream stdout. The insertion operator (<<) is used with cout to insert data into the output stream. Let's take a look at
2 min read
swap() in C++
The swap() is a built-in function in the C++ STL which swaps the value of two variables. This function supports almost every data type available in C++, whether it is a primitive type such as int, char, etc. or an STL containers such as vector, map, etc. Example: [GFGTABS] C++ #include <iostream
3 min read
std::forward in C++
In C++, std::forward() is a template function used for achieving perfect forwarding of arguments to functions so that it's lvalue or rvalue is preserved. It basically forwards the argument while preserving the value type of it. std::forward() was introduced in C++ 11 as the part of <utility> h
3 min read
strcat() Function in C++
The strcat() function in C++ is a predefined function in the <cstring> header file that is used to concatenate two strings, by appending a copy of the source string to the end of the destination string. This function works by adding all the characters till the null character of the source stri
2 min read
Min Heap in C++
A min-heap is a complete binary tree in which the value of each node is less than the value of its left child and right child. This property is true for every node in the tree. In this article, we will learn how we can implement the min heap data structure in C++. Implementation of Min Heap in C++A
8 min read
String Functions In C++
A string is referred to as an array of characters. In C++, a stream/sequence of characters is stored in a char array. C++ includes the std::string class that is used to represent strings. It is one of the most fundamental datatypes in C++ and it comes with a huge set of inbuilt functions. In this ar
9 min read
Rat in a Maze in C++
The Rat in a Maze problem is a popular algorithmic problem in which a rat needs to find a path through a maze from a starting point to a destination. The maze is represented by a 2D grid, where each cell can either be open or blocked. The goal is to determine if there exists a path for the rat to re
4 min read
Huffman Coding in C++
In this article, we will learn the implementation of Huffman Coding in C++. What is Huffman Coding?Huffman Coding is a popular algorithm used for lossless data compression. It assigns variable-length codes to input characters, with shorter codes assigned to more frequent characters. This technique e
7 min read