/* 15 Puzzle Problem in C 15 Puzzle Game Online 15 Puzzle Game Source Code in C 15 Puzzle Game using C Program 15 Puzzle Simple Animation Program using C */ #include <stdio.h> #include <conio.h> #include <stdlib.h> #include <time.h> #include <dos.h> /* Defined Constants */ #define true 1; #define false 0; #define FREE_MOVES 3; /* Global Variable Declaration */ int puzArr[5][5], row=1, column=1; int curRow=4, curCol=4, totalMoves=0, freeMoves=0; /* Global Prototype Declaration */ int getRandVal(); int setRandVal(int); void clearScreen(int); void draw15PuzzleBox(); void movePosition(int); void swapValue(int,int); void printPosition(char *); int IsDone(void); void main(){ char inputKey, arrowKey; /* Local Prototype Declaration */ int loadDefaultData(); void resetRowColumn(); void printTotalMoves(); void printTotalFREEMoves(); int doFREEMove(); /* Clear the Screen */ clrscr(); /* Randomize */ randomize(); /* Set Free Moves */ freeMoves = FREE_MOVES; /* Load Default Data */ gotoxy(1,1); printf("Please wait.. Loading Data !!"); loadDefaultData(); /* Print Loaded Data */ draw15PuzzleBox(); /* Detect Arrow Keys in C Program Press ESCAPE - 27 Press ENTER - 13 Get out from the Indefinite loop */ while ( (inputKey = getch()) != 27){ /* Set Default Text color as WHITE */ textcolor(15); clrscr(); /* Find Arrow Key or not */ if (inputKey == '\0'){ /* Extract actual Arrow Key */ arrowKey = getch(); switch(arrowKey){ case 72: movePosition(72); draw15PuzzleBox(); printTotalMoves(); printTotalFREEMoves(); break; case 80: movePosition(80); draw15PuzzleBox(); printTotalMoves(); printTotalFREEMoves(); break; case 75: movePosition(75); draw15PuzzleBox(); printTotalMoves(); printTotalFREEMoves(); break; case 77: movePosition(77); draw15PuzzleBox(); printTotalMoves(); printTotalFREEMoves(); break; } } else if (inputKey == 13){ //printf("Enter key pressed.."); clrscr(); if (freeMoves > 0){ doFREEMove(); /* Increment Moves */ totalMoves++; draw15PuzzleBox(); printTotalMoves(); printTotalFREEMoves(); } else { draw15PuzzleBox(); printTotalMoves(); printTotalFREEMoves(); } } /* Check 15-Puzzle Completion */ if (IsDone()) { /* Clear the Screen and Announce the Result */ clrscr(); /* Print Total Moves */ printTotalMoves(); gotoxy(35, 13); textcolor(2); printPosition("Great!!"); getch(); /* Smoothly End the Program Execution ;) */ exit(1); } } } /* Assign Random Value */ int loadDefaultData(){ int i=1, j=1, randVal; /* Custom Clear Screen 0 - Row Wise Clear 1 - Column Wise Clear */ randVal = random(1); clearScreen(randVal); for (; i<=4;) { for (; j<=4;) { /* Draw Puzzle Box */ draw15PuzzleBox(); /* get Random value */ randVal = getRandVal(); if ( setRandVal(randVal) ){ /* Set the Next Value */ puzArr[i][j] = randVal; /* Increment next Column */ column = j; j++; /* Check Is all 15 values set */ if (i==4 && j==4) { /* Set Zero to Final Position */ puzArr[i][j] = 0; movePosition(0); return 1; } } } /* increment to Next Row */ row = i; i++; /* Re-initialize the Column value */ j=1; } /* Normal Data Load Completion */ return 1; } /* Get a Random Number from 1 to 15 */ int getRandVal(){ int i, randVal; int dataArr[15]; for (i=0; i<15; i++){ dataArr[i] = i+1; } randVal = random(15); randVal = dataArr[randVal]; return randVal; } /* Check and Set a Random Value to next EMPTY position */ int setRandVal(int checkVal){ int i, j; for (i=1; i<=4; i++){ for (j=1; j<=4; j++) { /* Is this value already present and Allocated */ if (puzArr[i][j] == checkVal) { return false; } } } /* Yes, We got a next Rand value for Next position */ return true; } /* Draw the Current Data */ void draw15PuzzleBox() { int i, j, charPos=177, row=3; //int charSmile=2; /* Make Position to Draw the 15-Puzzle Box */ gotoxy(3, row++); for (i=1; i<=20;i++) printf("%c",charPos); gotoxy(3, row); printf("%c", charPos); gotoxy(4, row++); for (i=1; i<=18;i++) printf(" "); printf("%c", charPos); for(i=1; i<=4; i++){ gotoxy(3, row++); printf("%c", charPos); for(j=1; j<=4; j++){ if (puzArr[i][j]){ printf("%4d", puzArr[i][j]); } else { //printf("%4c",charSmile); printf(" "); } } printf(" %c", charPos); } gotoxy(3, row); printf("%c", charPos); gotoxy(4, row++); for (i=1; i<=18;i++) printf(" "); printf("%c", charPos); gotoxy(3, row++); for (i=1; i<=20;i++) printf("%c",charPos); /* Show Current Position Information */ gotoxy(35, 13); } /* Clear the Screen */ void clearScreen(int rowOrColumn){ int i, j; for(i=1; i<= 25; i++){ for (j=1; j<=80; j++){ /* Row Wise - 0 */ if (rowOrColumn == 0){ gotoxy(i, j); } /* Column Wise - 1 */ else if (rowOrColumn == 1){ gotoxy(j, i); } printf(" "); } delay(10); } /* Show Current Position Information */ gotoxy(35, 13); } /* Reset Global Row & Column */ void resetRowColumn(){ row = 1; column = 1; } /* Move position */ void movePosition(int pos){ int iRow, iCol; /* Keep Current Row & Column Positions for SWAP */ iRow = curRow; iCol = curCol; /* Show Current Position Information */ gotoxy(35, 13); if (pos == 0) { /* Set Color as LightGreen */ textcolor(10); printPosition("READY ?"); } /* Up - 72 */ else if (pos == 72) { if (curRow<4) { curRow++; /* Ok, Do Swap */ swapValue(iRow, iCol); /* Increment Total Move */ totalMoves++; //printf("UP (%d,%d) ", curRow, curCol); printPosition(" UP "); } else { /* Set Text color as RED */ textcolor(4); printPosition("INVALID"); } } /* Down - 80 */ else if (pos == 80) { if (curRow>1) { curRow--; /* Ok, Do Swap */ swapValue(iRow, iCol); /* Increment Total Move */ totalMoves++; printPosition(" DOWN "); } else { /* Set Text color as RED */ textcolor(4); printPosition("INVALID"); } } /* Left - 75 */ else if (pos == 75) { if (curCol<4) { curCol++; /* Ok, Do Swap */ swapValue(iRow, iCol); /* Increment Total Move */ totalMoves++; printPosition(" LEFT "); } else { /* Set Text color as RED */ textcolor(4); printPosition("INVALID"); } } /* Right - 77 */ else if (pos == 77) { if (curCol>1) { curCol--; /* Ok, Do Swap */ swapValue(iRow, iCol); /* Increment Total Move */ totalMoves++; printPosition(" RIGHT "); } else { /* Set Text color as RED */ textcolor(4); printPosition("INVALID"); } } } /* Swap the Value */ void swapValue(int prevRow, int prevCol){ int prevValue, curValue; /* getCurrent Swap Value */ prevValue = puzArr[prevRow][prevCol]; curValue = puzArr[curRow][curCol]; /* Swap it, Simply !! */ puzArr[prevRow][prevCol] = curValue; puzArr[curRow][curCol] = prevValue; /* Draw Puzzle Box */ draw15PuzzleBox(); } /* Check 15-Puzzle Completion */ int IsDone(){ int i, j, iSequence=1; for (i=1; i<=4; i++) { for (j=1; j<=4; j++) { if (puzArr[i][j] != iSequence) { return false; } /* Done, That's it!! */ if (iSequence == 15){ return true; } iSequence++; } } /* Yes, You have done the Magic !! */ return true; } /* Print Total Moves */ void printTotalMoves(){ int i, charPos=176, heart=3; gotoxy(38, 3); for (i=1; i<=18;i++) printf("%c",charPos); gotoxy(38, 4); printf("%c %c",charPos, charPos); gotoxy(38, 5); printf("%c T%ctal M%cves: %c",charPos, heart, heart, charPos); gotoxy(38, 6); printf("%c %4d %c",charPos, totalMoves, charPos); gotoxy(38, 7); printf("%c %c",charPos, charPos); gotoxy(38, 8); for (i=1; i<=18;i++) printf("%c",charPos); } /* Print Position in Text */ void printPosition(char *position){ int i, charPos=176; gotoxy(38, 12); for (i=1; i<=18;i++) printf("%c",charPos); gotoxy(38, 13); printf("%c %c",charPos, charPos); gotoxy(38, 14); cprintf("%c %7s %c",charPos, position, charPos); gotoxy(38, 15); printf("%c %c",charPos, charPos); gotoxy(38, 16); for (i=1; i<=18;i++) printf("%c",charPos); } /* Total Free Moves */ void printTotalFREEMoves(){ int i, row=14, charPos=176, smile=3; gotoxy(6, row++); for (i=1; i<=25;i++) printf("%c",charPos); gotoxy(6, row++); printf("%c %c",charPos, charPos); if (freeMoves > 0) { gotoxy(6, row++); printf("%c Fr%c%c M%cves %c",charPos, smile, smile, smile, charPos); gotoxy(6, row++); printf("%c%11d %c",charPos, freeMoves, charPos); } if (freeMoves > 0) { gotoxy(6, row++); printf("%c Press ENTER %c",charPos, charPos); gotoxy(6, row++); printf("%c Get FREE Move %c",charPos, charPos); } else { gotoxy(6, row++); printf("%c -NO FREE Move- %c",charPos, charPos); } gotoxy(6, row++); printf("%c %c",charPos, charPos); gotoxy(6, row++); for (i=1; i<=25;i++) printf("%c",charPos); } /* Do FREE Move - Help When User Stuck!! */ int doFREEMove(){ int i, j, k, l, iSequence=1, toSwap; for (i=1; i<=4; i++) { for (j=1; j<=4; j++) { if (puzArr[i][j] != iSequence) { /* get iSequence value's Row & Column */ for (k=1; k<=4; k++){ for (l=1; l<=4; l++) { if (puzArr[k][l] == iSequence){ /* Do FREE Swap */ toSwap = puzArr[i][j]; puzArr[i][j]=iSequence; puzArr[k][l]=toSwap; freeMoves--; return true; } } } } iSequence++; } } /* Yes, You have done the Magic !! */ return true; }
Write, Run & Share C Language code online using OneCompiler's C online compiler for free. It's one of the robust, feature-rich online compilers for C language, running the latest C version which is C18. Getting started with the OneCompiler's C editor is really simple and pretty fast. The editor shows sample boilerplate code when you choose language as 'C' and start coding!
OneCompiler's C online editor supports stdin and users can give inputs to programs using the STDIN textbox under the I/O tab. Following is a sample C program which takes name as input and print your name with hello.
#include <stdio.h>
int main()
{
char name[50];
printf("Enter name:");
scanf("%s", name);
printf("Hello %s \n" , name );
return 0;
}
C language is one of the most popular general-purpose programming language developed by Dennis Ritchie at Bell laboratories for UNIX operating system. The initial release of C Language was in the year 1972. Most of the desktop operating systems are written in C Language.
When ever you want to perform a set of operations based on a condition if-else
is used.
if(conditional-expression) {
// code
} else {
// code
}
You can also use if-else for nested Ifs and if-else-if ladder when multiple conditions are to be performed on a single variable.
Switch is an alternative to if-else-if ladder.
switch(conditional-expression) {
case value1:
// code
break; // optional
case value2:
// code
break; // optional
...
default:
// code to be executed when all the above cases are not matched;
}
For loop is used to iterate a set of statements based on a condition.
for(Initialization; Condition; Increment/decrement){
// code
}
While is also used to iterate a set of statements based on a condition. Usually while is preferred when number of iterations are not known in advance.
while(condition) {
// code
}
Do-while is also used to iterate a set of statements based on a condition. It is mostly used when you need to execute the statements atleast once.
do {
// code
} while (condition);
Array is a collection of similar data which is stored in continuous memory addresses. Array values can be fetched using index. Index starts from 0 to size-1.
data-type array-name[size];
data-type array-name[size][size];
Function is a sub-routine which contains set of statements. Usually functions are written when multiple calls are required to same set of statements which increases re-usuability and modularity.
Two types of functions are present in C
Library functions are the in-built functions which are declared in header files like printf(),scanf(),puts(),gets() etc.,
User defined functions are the ones which are written by the programmer based on the requirement.
return_type function_name(parameters);
function_name (parameters)
return_type function_name(parameters) {
//code
}