From 9995c391390857ec6fa3c7fc4b32dbfa39a7b587 Mon Sep 17 00:00:00 2001 From: Racoonicorn Date: Thu, 22 Dec 2016 11:40:41 +0100 Subject: [PATCH] Create phagus.c --- phagus.c | 251 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 251 insertions(+) create mode 100644 phagus.c diff --git a/phagus.c b/phagus.c new file mode 100644 index 0000000..3ea7408 --- /dev/null +++ b/phagus.c @@ -0,0 +1,251 @@ +#define VERSION "0.01" + +#define N 9 +#include +#include +#include + +void menu (); +int play (); +void start (); // initial condition +void settings (); +void printm (); // print matrix +void move (char *dir); // move pointer +void ranking (); +int win (); +void lose (); // print lose message +int error (); // error message, return 1 + +int matrix[N][N] = {0}; +int my_x; +int my_y; +int moves; +int grid = 9; // grid size +int lost = 0; + +int main () { + srand (time(NULL)); + + menu (); + + printf ("\n\n\n\nv%s", VERSION); + return 0; +} + +// Select mode +void menu (){ + char mode[5]; + int menu = 1; + while (menu == 1) { + system("clear"); + printf ("Select mode:\n> 0: Play\n> 1: Settings\n> 2: Ranking\n> 3: Exit\n"); + scanf ("%5s", mode); + switch (mode[0]) { + case '0': menu = play (); break; + case '1': settings (); break; + case '2': ranking (); break; + case '3': return; + } + } +} + +// edit grid size +void settings () { + char setting[5]; + int menu = 0; + system("clear"); + while (menu == 0) { + printf ("Menu: press 0\nGrid size? 5, 7 or 9? "); + scanf ("%5s", setting); + switch (setting[0]) { + case '0': menu = 1; break; + case '5': grid = 5; menu = 1; break; + case '7': grid = 7; menu = 1; break; + case '9': grid = 9; menu = 1; break; + default: printf("Retry\n"); break; + } + } +} + +// not available +void ranking () { + char back[5]; + system("clear"); + printf ("Not available. Press 0\n"); + scanf ("%5s", back); +} + +int play () { + char dir[5]; + char exit = 0; + int end = 0; // if win or lose == 1 + my_x = grid / 2; // starting position + my_y = grid - 1; + moves = 0; + system("clear"); + start (); // create matrix + printm (); + while (!end) { + printf ("\nLeft: a. Up: w. Right: d. Down: s. Menu: m. Exit: 0"); + printf ("\nDirection? "); + scanf ("%5s", dir); + getchar (); + if (dir[0] == '0') { + printf ("\nExit? [y/n] "); + scanf ("%c", &exit); + if (exit == 'y') { + return 0; + } else { + dir[0] = '1'; + getchar (); + } + } + if (dir[0] == 'm') { + printf ("\nAre you sure? [y/n] "); + scanf ("%c", &exit); + if (exit == 'y') { + return 1; + } else { + dir[0] = '1'; + getchar (); + } + } + move (dir); + if (win () == 1 || lost == 1) + end = 1; + } + return 1; +} + +// create matrix +void start () { + int i, j, k; + lost = 0; + for (k = 0; k <= grid / 2; k++) { + i = rand () % grid; + j = rand () % grid; + matrix[i][j] = rand () % 10 + 1; + } + matrix[my_y][my_x] = grid; +} + +void move (char *dir) { + int stop = 0; + int finalvalue, initvalue = matrix[my_y][my_x]; + // move pointer + matrix[my_y][my_x] = 0; + switch (dir[0]) { + case 'a': + if (my_x > 0) { + my_x--; + } else { + stop = error (); + } + break; + case 'd': + if (my_x < grid - 1) { + my_x++; + } else { + stop = error (); + } + break; + case 'w': + if (my_y > 0) { + my_y--; + } else { + stop = error (); + } + break; + case 's': + if(my_y < grid - 1) { + my_y++; + } else { + stop = error (); + } + break; + case 'o': + stop = 1; + break; + default: + stop = error (); + break; + } + if (!stop) { // if moved + finalvalue = matrix[my_y][my_x]; + if (finalvalue <= initvalue) { + if (finalvalue != 0) + initvalue++; + matrix[my_y][my_x] = initvalue - 1 + finalvalue; + printm (); + } else { + matrix[my_y][my_x] = initvalue - 1 + finalvalue; + lost = 1; + printm (); + lose (); + } + moves++; + if (matrix[my_y][my_x] == 0) { + lost = 1; + printm (); + lose (); + } + } else { + matrix[my_y][my_x] = initvalue; + } +} + +// print matrix +void printm () { + int i, j; + system("clear"); + printf ("\n\n"); + for (i = 0; i < grid; i++) { + for (j = 0;j < grid; j++) { + if (i == my_y && j == my_x && matrix[i][j] != 0 && lost != 1) + printf ("< "); + if (matrix[i][j] != 0) { + printf ("%d", matrix[i][j]); + if (i == my_y && j == my_x && lost != 1) + printf (" >"); + printf ("\t"); + } else { + printf (" .\t"); + } + } + printf ("\n\n"); + } +} + +// win checker +int win () { + int i, j, count=0; + for (i = 0; i < grid; i++) { + for (j = 0; j < grid; j++) { + if (matrix[i][j] == 0) + count++; + } + } + if (!lost) { + if (count == grid * grid - 1) { + printf ("\nYou win! Moves: %d\n", moves); + getchar (); + return 1; + } else { + printf ("\nYou still need to delete %d numbers. Moves: %d", grid * grid - 1 - count, moves); + return 0; + } + } + return 1; +} + +// lose message +void lose () { + printf ("You lose!"); + getchar (); +} + +// error message +int error () { + printf ("ERROR!!!"); + return 1; +}