C++

C++ Project on Shuffle Game

Shuffle Game

A C++ console and graphics program that presents a 3x3 number puzzle. The player must arrange numbers in ascending order by pressing number keys. The game uses Turbo C++ BGI graphics.

How to Play

  • Press 1 to start the game.
  • Press 2 to view the rules.
  • Use number keys to move tiles.
  • Press X to exit the game.
  • Arrange all tiles in ascending order within 50 moves to win.

Source Code

#include<stdio.h>
#include<conio.h>
#include<graphics.h>
#include<stdlib.h>
#include<string.h>
#include<ctype.h>
#include<dos.h>

#define true  1
#define false 0

void disp();
void printmenu();
void intro();
void levelmenu();
void easy();
void initial(int x);
void draw(int x, int y, int i);
void userwin(int no);
int check(int key);

int load, i, step, level, num[25], win;

void main()
{
    int gdriver = DETECT, gmode, errorcode;
    initgraph(&gdriver, &gmode, "c:\\tc\\bgi");
    intro();
    levelmenu();
    clrscr();
    cleardevice();
    setbkcolor(RED);
    easy();
}

void levelmenu()
{
    level = 0;
    clrscr();
    cleardevice();
    setbkcolor(BLACK);
    settextstyle(1, 0, 2);
    setcolor(GREEN);
    outtextxy(240, 240, "Press 1 to start");
    outtextxy(240, 260, "----------------");
    outtextxy(240, 280, "1. Start");
    outtextxy(240, 300, "2. Rules");
    outtextxy(240, 330, "Enter a choice: ");
    gotoxy(50 + 4, 22);
    scanf("%d", &level);
    if (level == 2)
    {
        outtextxy(20, 40,  "Read the rules :");
        outtextxy(20, 80,  "1: Arrange the nos in ascending order");
        outtextxy(20, 120, "2: Press the no key to move the nos");
        outtextxy(20, 160, "3: X-Exit");
        delay(3000);
        levelmenu();
    }
}

void intro()
{
    int i, j;
    clrscr();
    cleardevice();
    setbkcolor(BLACK);
    gotoxy(25, 12);
    settextstyle(4, 0, 6);
    for (i = 0; i <= 10; i++)
    {
        setcolor(i % 16);
        outtextxy(2, 2, "SHUFFLE GAME");
        settextstyle(1, 0, 7);
        outtextxy(20,  200, "");
        delay(100);
        outtextxy(180, 200, "1");
        delay(100);
        outtextxy(220, 200, "2");
        delay(100);
        outtextxy(260, 200, "3");
        delay(100);
        outtextxy(180, 300, "4");
        delay(100);
        outtextxy(220, 300, "5");
        delay(100);
        outtextxy(260, 300, "6");
        delay(100);
        outtextxy(180, 400, "7");
        delay(100);
        outtextxy(220, 400, "8");
        settextstyle(4, 0, 8);
        delay(100);
    }
}

void printmenu()
{
    int i;
    gotoxy(33, 1);  printf("SHUFFLE GAME");
    gotoxy(1, 2);
    for (i = 0; i < 80; i++)
        printf("\xcd");
    printf("\t\t\t\tX=exit game\n");
    for (i = 0; i < 80; i++)
        printf("\xcd");
    gotoxy(35, 23); printf("Moves = %d", step);
}

void easy()
{
    int i, x, y, key, valid;
    char press[2];
    if (load == false)
        initial(9);
    else
        load = false;
    do {
        start:
        printmenu();
        i = 0;
        for (y = 8; y < 17; y += 4)
            for (x = 33; x < 44; x += 5)
            {
                draw(x, y, i);
                i++;
            }
        userwin(8);
        if (win == true)
        {
            cleardevice();
            outtextxy(2, 2, "You have won the game");
            delay(2000);
            disp();
            delay(2000);
            win = false;
            return;
        }
        gotoxy(55, 17); printf("Tips:");
        gotoxy(61, 18); printf("Number will move");
        gotoxy(61, 19); printf("when you key in!");
        gotoxy(43, 23); fflush(stdin);
        press[0] = toupper(getche());
        if (press[0] == 'X')
        {
            disp();
            exit(1);
        }
        key = atoi(press);
        if ((valid = check(key)) == false)
            goto start;
        step++;
        if (step == 50)
        {
            cleardevice();
            outtextxy(20, 200, "YOU HAVE SURPASSED MAXIMUM POSSIBLE MOVES");
            delay(1500);
            disp();
            delay(2500);
            exit(1);
        }
        for (i = 0; i < 9; i++)
        {
            if (num[i] == key)
                num[i] = 0;
            else if (num[i] == 0)
                num[i] = key;
        }
    } while (true);
}

void initial(int x)
{
    int i, no;
    step = 0;
    no = 0 % x;
    if (no == 1)
        no += 5;
    for (i = 0; i < x; i++)
    {
        num[i] = no;
        no++;
        if (no >= x)
        {
            if (!(no % 2))
                no = 1;
            else
                no = 0;
        }
    }
}

void draw(int x, int y, int i)
{
    gotoxy(x, y);
    if (level == 1)
    {
        printf("%c%c%c", 201, 205, 187);
        gotoxy(x, y + 1);
        printf("%c", 186);
        if (num[i] == 0)
            printf(" ");
        else
            printf("%d", num[i]);
        printf("%c", 186);
        gotoxy(x, y + 2);
        printf("%c%c%c", 200, 205, 188);
    }
}

void disp()
{
    cleardevice();
    setbkcolor(BLACK);
    settextstyle(4, 0, 4);
    setcolor(RED);
    outtextxy(200, 100, "CREDITS:");
    settextstyle(2, 0, 13);
    outtextxy(300, 220, "iCBSE.com");
    outtextxy(300, 260, "Class: XII-A");
    outtextxy(300, 300, "MDPS");
    delay(2500);
}

int check(int key)
{
    int i, valid = false;
    if (level == 1)
        for (i = 0; i < 9; i++)
        {
            if (num[i] == key)
            {
                valid = true;
                switch (i)
                {
                    case 0: if (num[1] != 0 && num[3] != 0) valid = false; break;
                    case 1: if (num[0] != 0 && (num[2] != 0 && num[4] != 0)) valid = false; break;
                    case 2: if (num[1] != 0 && num[5] != 0) valid = false; break;
                    case 3: if (num[0] != 0 && (num[4] != 0 && num[6] != 0)) valid = false; break;
                    case 4: if ((num[1] != 0 && num[3] != 0) && (num[5] != 0 && num[7] != 0)) valid = false; break;
                    case 5: if (num[2] != 0 && (num[4] != 0 && num[8] != 0)) valid = false; break;
                    case 6: if (num[3] != 0 && num[7] != 0) valid = false; break;
                    case 7: if (num[4] != 0 && (num[6] != 0 && num[8] != 0)) valid = false; break;
                    case 8: if (num[5] != 0 && num[7] != 0) valid = false; break;
                    default: valid = false; break;
                }
            }
        }
    return valid;
}

void userwin(int no)
{
    int i;
    for (i = 0; i < no; i++)
    {
        if (num[i] != i + 1)
        {
            win = false;
            return;
        }
    }
    win = true;
}
Share:

Comments from readers

Leave a Comment

Share your thoughts below. Comments appear after a quick review.

You may also want to see: