diff --git a/final/game.c b/final/game.c new file mode 100644 index 0000000..ddd99bf --- /dev/null +++ b/final/game.c @@ -0,0 +1,136 @@ +#include "curses.h" +#include "time.h" +#include "ballsortpuzzle.h" +#include "stdlib.h" +#include "stdbool.h" +#include "stdio.h" + +void generator(const int rows, const int columns, char field[rows][columns]) { + srand(time(NULL)); + int column_1 = rand() % columns, column_2 = rand() % columns; + while(column_1 == column_2) + column_2 = rand() % columns; + char characters[6] = "@+*^$&"; + int k[columns - 2]; + for(int i = 0; i < columns - 2; i++) + k[i] = rows; + for(int i = 0; i < rows; i++) + for(int j = 0; j < columns; j++) + { + if(j == column_1 || j == column_2){ + field[i][j] = ' '; + continue; + } + int ind = rand() % (columns - 2); + while(k[ind] == 0) + ind = rand() % (columns - 2); + k[ind]--; + field[i][j] = characters[ind]; + } + return; +} + +void game_field(const int rows, const int columns, char field[rows][columns]) { + for(int i = 0; i < rows; i++) + { + printw("%d ", i + 1); + for(int j = 0; j < columns; j++) + { + printw("| "); + printw("%c ", field[i][j]); + } + printw("|\n"); + } + printw(" "); + for(int i = 0; i < columns; i++) + { + printw(" ---"); + } + printw("\n "); + for(int i = 0; i < columns; i++) + printw("%d ", i + 1); + printw("\n"); + refresh(); + return; +} + +void down_possible(const int rows, const int columns, char field[rows][columns], int x, int y) { + int x_up = 0; + for (int i = 0; i < rows; i++) { + if (field[i][x - 1] != ' ') { + x_up = i; + break; + } + } + int tmp = 0; + x--; + y--; + for(int i = 0; i < rows; i++) { + if(field[i][y] != ' ') { + if(i && field[i][y] == field[x_up][x]) { + field[i - 1][y] = field[x_up][x]; + mvprintw(i - 1, 4 + y * 4, "%c", field[i - 1][y]); + field[x_up][x] = ' '; + mvprintw(x_up, 4 + x * 4, "%c", field[x_up][x]); + } + else tmp = 1; + break; + } + else { + if (rows == i + 1) { + field[i][y] = field[x_up][x]; + mvprintw(i, 4 + y * 4, "%c", field[i][y]); + field[x_up][x] = ' '; + mvprintw(x_up, 4 + x * 4, " "); + } + } + } + if(tmp == 1)mvprintw(rows + 3, 0, "CAN'T MOVE"); + refresh(); + return; +} + +bool check(const int rows, const int columns, char field[rows][columns]) { + bool check_tmp; + check_tmp = true; + for(int i = 0; i < columns; i++) { + for(int j = 1; j < rows; j++){ + if(field[j][i] != field[j - 1][i]) + check_tmp = false; + } + } + if(check_tmp == true) + return true; + else + return false; +} + +void ball_sort_puzzle() { + initscr(); + int rows = 4; + int columns = 6; + char field[rows][columns]; + generator(rows, columns, field); + game_field(rows, columns, field); + while(check(rows, columns, field) == false) { + mvprintw(rows + 2, 0, "WHAT: "); + move(rows + 2, 6); + refresh(); + int x; + scanw("%d", &x); + mvprintw(rows + 2, 0, "WHERE: "); + mvprintw(rows + 3, 0, " "); + move(rows + 2, 7 ); + refresh(); + int y; + scanw("%d", &y); + if(x == y){mvprintw(rows + 3, 0, "NUMBERS MUST BE DIFFERENT"); continue;} + if(x > columns || y > columns){mvprintw(rows + 3, 0, "TOO BIG NUMBERS"); continue;} + down_possible(rows, columns, field, x, y); + } + mvprintw(rows + 2, 0, "YOU WON!\nPRESS ENTER TO EXIT"); + refresh(); + getch(); + endwin(); + return; +} \ No newline at end of file