summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authormRnea <akannemre@gmail.com>2024-12-20 18:00:08 +0300
committermRnea <akannemre@gmail.com>2024-12-20 18:00:08 +0300
commitb52169a376589b49f63a2753354f5cab41a3a0cd (patch)
tree45871ee092a3c61de114b7562ca7ba30596c1948
parent3fce5522e006c2735dbd922927f1ace91e3f2f84 (diff)
copied my old terminal-based sliding puzzle game
-rw-r--r--sliding-puzzle/Makefile2
-rw-r--r--sliding-puzzle/sliding.c238
2 files changed, 240 insertions, 0 deletions
diff --git a/sliding-puzzle/Makefile b/sliding-puzzle/Makefile
new file mode 100644
index 0000000..961fb44
--- /dev/null
+++ b/sliding-puzzle/Makefile
@@ -0,0 +1,2 @@
+make all:
+ gcc ../util.c sliding.c -o ../bin/sliding -lraylib -lGL -lm -lpthread -ldl -lrt -lX11
diff --git a/sliding-puzzle/sliding.c b/sliding-puzzle/sliding.c
new file mode 100644
index 0000000..e43a98f
--- /dev/null
+++ b/sliding-puzzle/sliding.c
@@ -0,0 +1,238 @@
+#include <stdio.h>
+#include <stdlib.h>
+#include <math.h>
+#include <time.h>
+// #include <conio.h>
+
+struct Coordinate
+{
+ int x;
+ int y;
+};
+
+// Printing the field
+void printChar(char, int);
+void printField(int*, int, int); // field, row, column
+void printFieldLine(int, int); // column, space
+//
+
+int getIntLength(int);
+void makeField(int*, int, int, struct Coordinate*);
+
+char getAction();
+int moveCell(int*, struct Coordinate*, int, int, char, int); // field, row, column, coordinate, action, count
+void indexFromCoordinate(struct Coordinate*, int*, int);
+void randomizeField(int*, int, int, struct Coordinate*);
+int checkField(int* field, int row, int column);
+
+
+int main()
+{
+ int row, column, move_counter = 0;
+ struct Coordinate emptycell;
+ srand(time(NULL));
+ //srand(295837);
+
+ printf("Input format is: a, b\n"
+ "where a and b are integers.\n\n");
+
+ printf("Enter row and column length: ");
+ scanf("%d, %d", &row, &column);
+
+ int* field = (int*) malloc(row * column * sizeof(int));
+ makeField(field, row, column, &emptycell);
+ randomizeField(field, row, column, &emptycell);
+
+ clock_t begin = clock();
+ clock_t end;
+ while (1)
+ {
+ printField(field, row, column);
+ printf("Move count: %d\n", move_counter);
+ if (checkField(field, row, column))
+ {
+ break;
+ }
+ move_counter += moveCell(field, &emptycell, row, column, getAction(), 1);
+ system("clear");
+ //system("cls");
+ }
+ end = clock();
+ printf("begin= %Lf, end= %Lf\n", (long double) begin / CLOCKS_PER_SEC, (long double) end / CLOCKS_PER_SEC);
+ long double time_spent = (long double) (end - begin) / CLOCKS_PER_SEC;
+ printf("Play time = %lf seconds\n\n", time_spent);
+}
+
+int checkField(int* field, int row, int column)
+{
+ int i;
+ for (int x = 0 ; x < row; x++)
+ {
+ for (int y = 0; y < column; y++)
+ {
+ i = (column*x) + y;
+ if (i == (row * column) - 1){return 1;}
+ if (field[i] != i + 1){return 0;}
+ }
+ }
+ return 0;
+}
+
+void makeField(int* field, int row, int column, struct Coordinate* emptycell)
+{
+ for (int x = 0 ; x < row; x++)
+ {
+ for (int y = 0; y < column; y++)
+ {
+ field[(column*x) + y] = (column*x) + y + 1;
+ }
+ }
+ field[(column*row) - 1] = 0;
+ (*emptycell).x = column;
+ (*emptycell).y = row;
+}
+
+int getIntLength(int num)
+{
+ int length = 0;
+ if (num == 0){ return 1; }
+ while(num > 0)
+ {
+ num = floor(num / 10); length++;
+ }
+ return length;
+}
+
+void printChar(char symbol, int count)
+{
+ for (int i = 0; i < count; i++)
+ {
+ printf("%c", symbol);
+ }
+}
+
+void printField(int* field, int row, int column)
+{
+ int space = 3;
+ printFieldLine(column, space);
+
+ for (int x = 0; x < row; x++)
+ {
+ for (int y = 0; y < column; y++)
+ {
+ if (field[(column*x) + y] == 0){ printf("|"); printChar(' ', space); continue; }
+ printf("|%d", field[(column*x) + y]);
+ printChar(' ', space - getIntLength(field[(column*x) + y]));
+ }
+ printf("|\n");
+ printFieldLine(column, space);
+ }
+}
+
+void printFieldLine(int column, int space)
+{
+ for (int i = 0; i < column; i++)
+ {
+ printf("+");
+ printChar('-', space);
+ }
+ printf("+\n");
+}
+
+char getAction()
+{
+ char action;
+ fflush(stdin);
+ printf("Enter an action (w, a, s, d for movement. t to quit): ");
+ //action = getche();
+ action = getchar();
+ printf("%c", '\n');
+ return action;
+}
+
+void indexFromCoordinate(struct Coordinate* emptycell, int* num, int column)
+{
+ *num = (((*emptycell).y - 1) * column) + ((*emptycell).x - 1);
+}
+
+int moveCell(int* field, struct Coordinate* emptycell, int row, int column, char action, int count)
+{
+ int emptycell_index, move_counter = 0;
+ indexFromCoordinate(emptycell, &emptycell_index, column);
+ switch (action)
+ {
+ case 's':
+ if ((*emptycell).y > 1)
+ {
+ if (count < 0){moveCell(field, emptycell, row, column, 'w', -count);}
+ while (count > 0){
+ field[emptycell_index] = field[emptycell_index - column];
+ field[emptycell_index - column] = 0;
+ (*emptycell).y -= 1;
+ indexFromCoordinate(emptycell, &emptycell_index, column);
+ count--; move_counter++;}
+ return move_counter;
+ }
+ else {return 0;}
+ case 'd':
+ if ((*emptycell).x > 1)
+ {
+ if (count < 0){moveCell(field, emptycell, row, column, 'a', -count);}
+ while(count > 0){
+ field[emptycell_index] = field[emptycell_index - 1];
+ field[emptycell_index - 1] = 0;
+ (*emptycell).x -= 1;
+ indexFromCoordinate(emptycell, &emptycell_index, column);
+ count--; move_counter++;
+ }
+ return move_counter;
+ }
+ else {return 0;}
+ case 'w':
+ if ((*emptycell).y < row)
+ {
+ if (count < 0){moveCell(field, emptycell, row, column, 's', -count);}
+ while(count > 0){
+ field[emptycell_index] = field[emptycell_index + column];
+ field[emptycell_index + column] = 0;
+ (*emptycell).y += 1;
+ indexFromCoordinate(emptycell, &emptycell_index, column);
+ count--; move_counter++;
+ }
+ return move_counter;
+ }
+ else {return 0;}
+ case 'a':
+ if ((*emptycell).x < column)
+ {
+ if (count < 0){moveCell(field, emptycell, row, column, 'd', -count);}
+ while(count > 0){
+ field[emptycell_index] = field[emptycell_index + 1];
+ field[emptycell_index + 1] = 0;
+ (*emptycell).x += 1;
+ indexFromCoordinate(emptycell, &emptycell_index, column);
+ count--; move_counter++;
+ }
+ return move_counter;
+ }
+ else {return 0;}
+ case 't':
+ exit(0);
+ default:
+ return 0;
+ }
+}
+
+void randomizeField(int* field, int row, int column, struct Coordinate* emptycell)
+{
+ char actions[4] = {'w', 'a', 's', 'd'};
+ char last_action = 'n', new_action;
+ for (int i = 0; i < row*column*50; i++)
+ {
+ do{
+ new_action = actions[rand() % 4];
+ } while (last_action == new_action);
+ moveCell(field, emptycell, row, column, new_action, 1);
+ last_action = new_action;
+ }
+}