#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; }