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; } |
Snake Code in C++
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.
Contact Us