Skip to main content
Tweeted twitter.com/StackCodeReview/status/1194359252430622723

Any suggestions or improvementsIs there anything you would suggest to improve this code? In particular, any code to make the snake move more smoothly and make the cursor disappear.

Any suggestions or improvements you would suggest to improve this code? In particular, any code to make the snake move more smoothly and make the cursor disappear.

Is there anything you would suggest to improve this code? In particular, any code to make the snake move more smoothly and make the cursor disappear.

Source Link
Tarun
  • 53
  • 4

Snake Game C++ Improvements?

Any suggestions or improvements you would suggest to improve this code? In particular, any code to make the snake move more smoothly and make the cursor disappear.

#include <iostream.h>
#include <conio.h>
#include <stdlib.h>
#include <dos.h>

unsigned long int score, high_score = 0;

const int no_rows = 22, no_columns = 77, head_position = 0;

char choice, token, token_food, key_press, direction_head, overlay;

char board[no_rows][no_columns];

unsigned int i, j, k, snake_length, grow, crash;

struct position
{
    int row;
    int column;
} head_map[no_rows * no_columns], food, temp1, temp2;

void Initialize()
{
start:
    clrscr();

    cout << "\t\t\t\tWELCOME TO SNAKE GAME\n\n\n";
    cout << "Choose the Body of the Snake(Enter a symbol):\n";
    cin >> token;
    cout << "\nChoose the Food of the Snake(Enter a symbol):\n";
    cin >> token_food;

    if(token_food == token)
    {
        clrscr();
        cout << "\nDon't use the same symbols for food and body of the snake!!!\n\n\n";
        goto start;
    }

    cout << "\n\nUP\t-\tW\nDOWN\t-\tS\nRIGHT\t-\tD\nLEFT\t-\tA\n\n\nARE YOU
         READY(Y / N) ?? \n";
         cin >> choice;

    for (i = 0; i < no_rows; i++)
    {
        for (j = 0; j < no_columns; j++)
            board[i][j] = ' ';
    }

    head_map[0].row = no_rows / 2;
    head_map[0].column = no_columns / 2;

    board[head_map[0].row][head_map[0].column] = token;

    direction_head = 'R';
    snake_length = 1;

    grow = crash = score = 0;
}

void Food()
{
    do
    {
        food.row = rand() % no_rows;
        food.column = rand() % no_columns;
    }
    while(board[food.row][food.column] == token);

    board[food.row][food.column] = token_food;
}

void Display()
{
    clrscr();

    for(k = 0; k < (no_columns + 2); k++)
        cout << "-";

    cout << endl;

    for(i = 0; i < no_rows; i++)
    {
        cout << "|";
        for(j = 0; j < no_columns; j++)
            cout << board[i][j];
        cout << "|" << endl;
    }

    for(k = 0; k < (no_columns + 2); k++)
        cout << "-";

    cout << "\t\t\t\t\t  SCORE :" << score;
}

void Input()
{
    if(kbhit())
    {
        key_press = getch();

        if((key_press == 'd' || key_press == 'D') && (key_press != 'a' || key_press != 'A') && (direction_head != 'L'))
            direction_head = 'R';

        if((key_press == 's' || key_press == 'S') && (key_press != 'w' || key_press != 'W') && (direction_head != 'U'))
            direction_head = 'D';

        if((key_press == 'a' || key_press == 'A') && (key_press != 'd' || key_press != 'D') && (direction_head != 'R'))
            direction_head = 'L';

        if((key_press == 'w' || key_press == 'W') && (key_press != 's' || key_press != 'S') && (direction_head != 'D'))
            direction_head = 'U';

        if(key_press == 'p' || key_press == 'P')
            delay(5000);
    }

    temp1 = head_map[head_position];
    board[head_map[head_position].row][head_map[head_position].column] = ' ';

    switch(direction_head)
    {
    case 'R':
    {
        if(head_map[head_position].column == no_columns)
            crash = 1;

        overlay = board[head_map[head_position].row][++head_map[head_position].column];

        break;
    }

    case 'L':
    {
        if(head_map[head_position].column == 0)
            crash = 1;

        overlay = board[head_map[head_position].row][--head_map[head_position].column];

        break;
    }

    case 'D':
    {
        if(head_map[head_position].row == no_rows)
            crash = 1;

        overlay = board[++head_map[head_position].row][head_map[head_position].column];

        break;
    }

    case 'U':
    {
        if(head_map[head_position].row == 0)
            crash = 1;

        overlay = board[--head_map[head_position].row][head_map[head_position].column];

        break;
    }

    default:
        break;
    }
}

void Move()
{
    board[head_map[head_position].row][head_map[head_position].column] = token;

    for(i = 1; i < snake_length; i++)
    {
        temp2 = head_map[i];
        head_map[i] = temp1;

        board[head_map[i].row][head_map[i].column] = token;
        board[temp2.row][temp2.column] = ' ';

        temp1 = temp2;
    }

    if(grow == 1)
    {
        head_map[i] = temp1;
        board[head_map[i].row][head_map[i].column] = token;

        ++snake_length;
        score += 10;
        Food();
        grow = 0;
    }
}

void Change()
{
    if(overlay == token)
        crash = 1;

    if(overlay == token_food)
        grow = 1;
}

void Game_over()
{
    getch();
    clrscr();

    cout << "\n\n\n\n\n\n\n\n\n\n\t\t\t\tGAME OVER!!!\n\t\t\t\tFINAL SCORE: " << score;

    if(score > high_score)
    {
        high_score = score;
        cout << "\n\t\t\tYOU BEAT THE HIGH SCORE!!!";
    }

    else
    {
        if(score == high_score)
            cout << "\n\t\t\tYOU TIED THE HIGH SCORE!!!";

        else
            cout << "\n\t\t\tHIGH SCORE: " << high_score;
    }
    getch();
    clrscr();

    cout << "\n\n\n\n\n\n\n\n\n\n\n\t\t\tDO YOU WANT TO CONTINUE(Y/N)??\n\t\t\t\t\t";
    cin >> choice;

    getch();
}

int main()
{
    do
    {
        Initialize();
        Food();
        Display();

        do
        {
            Input();
            Change();

            if(crash == 1)
                break;

            Move();
            delay(200);

            Display();

        }
        while(crash != 1);

        Game_over();

    }
    while(choice == 'Y' || choice == 'y');

    return 0;
}