eng
competition

Text Practice Mode

Coding With C++ Programming (Test Typing)

created Friday November 15, 22:34 by Sedyk Hanafi


1


Rating

722 words
5 completed
00:00
/* Snake Game using C++  
developed by Sedyk Hanafi,  
improved by Sedyk Hanafi  
November 2024 */
 
#include <iostream>
#include <conio.h>
using namespace std;
 
void run();
void printMap();
void initMap();
void move(int dx, int dy);
void update();
void changeDirection(char key);
void clearScreen();
void generateFood();
 
char getMapValue(int value);
 
// Map dimensions
const int mapwidth = 20;
const int mapheight = 20;
 
const int size = mapwidth * mapheight;
 
// The tile values for the map
int map[size];
 
// Snake head details
int headxpos;
int headypos;
int direction;
 
// Amount of food the snake has (How long the body is)
int food = 4;
 
// Determine if game is running
bool running;
 
int main()
{
    run();
    return 0;
}
 
// Main game function
void run()
{
    // Initialize the map
    initMap();
    running = true;
    while (running) {
        // If a key is pressed
        if (kbhit()) {
            // Change to direction determined by key pressed
            changeDirection(getch());
        }
        // Update the map
        update();
 
        // Clear the screen
        clearScreen();
 
        // Print the map
        printMap();
 
        // delay 0.4 seconds
        _sleep(400);
    }
 
    // Game Text
    cout << "\t\tGame Over!" << endl << "\t\tYour score is: " << food;
 
    // Stop console from closing instantly
    cin.ignore();
}
 
// Changes snake direction from input
void changeDirection(char key) {
    /*
      W
    A + D
      S
      1
    4 + 2
      3
    */
    switch (key) {
    case 'w':
        if (direction != 2) direction = 0;
        break;
    case 'd':
        if (direction != 3) direction = 1;
        break;
    case 's':
        if (direction != 4) direction = 2;
        break;
    case 'a':
        if (direction != 5) direction = 3;
        break;
    }
}
 
// Moves snake head to new location
void move(int dx, int dy) {
    // determine new head position
    int newx = headxpos + dx;
    int newy = headypos + dy;
 
    // Check if there is food at location
    if (map[newx + newy * mapwidth] == -2) {
        // Increase food value (body length)
        food++;
 
        // Generate new food on map
        generateFood();
    }
 
    // Check location is free
    else if (map[newx + newy * mapwidth] != 0) {
        running = false;
    }
 
    // Move head to new location
    headxpos = newx;
    headypos = newy;
    map[headxpos + headypos * mapwidth] = food + 1;
 
}
 
// Clears screen
void clearScreen() {
    // Clear the screen
    system("cls");
}
 
// Generates new food on map
void generateFood() {
    int x = 0;
    int y = 0;
    do {
        // Generate random x and y values within the map
        x = rand() % (mapwidth - 2) + 1;
        y = rand() % (mapheight - 2) + 1;
 
        // If location is not free try again
    } while (map[x + y * mapwidth] != 0);
 
    // Place new food
    map[x + y * mapwidth] = -2;
}
 
// Updates the map
void update() {
    // Move in direction indicated
    switch (direction) {
    case 0: move(-1, 0);
        break;
    case 1: move(0, 1);
        break;
    case 2: move(1, 0);
        break;
    case 3: move(0, -1);
        break;
    }
 
    // Reduce snake values on map by 1
    for (int i = 0; i < size; i++) {
        if (map[i] > 0) map[i]--;
    }
}
 
// Initializes map
void initMap()
{
    // Places the initual head location in middle of map
    headxpos = mapwidth / 2;
    headypos = mapheight / 2;
    map[headxpos + headypos * mapwidth] = 1;
 
    // Places top and bottom walls  
    for (int x = 0; x < mapwidth; ++x) {
        map[x] = -1;
        map[x + (mapheight - 1) * mapwidth] = -1;
    }
 
    // Places left and right walls
    for (int y = 0; y < mapheight; y++) {
        map[0 + y * mapwidth] = -1;
        map[(mapwidth - 1) + y * mapwidth] = -1;
    }
 
    // Generates first food
    generateFood();
}
 
// Prints the map to console
void printMap()
{
    for (int x = 0; x < mapwidth; ++x) {
        for (int y = 0; y < mapheight; ++y) {
            // Prints the value at current x,y location
            cout << getMapValue(map[x + y * mapwidth]);
        }
        // Ends the line for next x value
        cout << endl;
    }
}
 
// Returns graphical character for display from map value
char getMapValue(int value)
{
    // Returns a part of snake body
    if (value > 0) return 'o';
 
    switch (value) {
        // Return wall
    case -1: return 'X';
        // Return food
    case -2: return 'O';
    }
}
 
 

saving score / loading statistics ...