Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <conio.h>
- #include <dirent.h>
- void next_moves();
- void add(char move[][6], unsigned short i, unsigned short j);
- int equals(char a[][6], char b[][6]);
- void printm(char move[][6]);
- char data_puzzle[6][6];
- // parameter type adalah type kesulitan
- int cari_banyak_level(char type[20]) {
- char directory[200] = "";
- getcwd(directory, sizeof(directory));
- strcat(directory, type);
- DIR *dir;
- struct dirent *ent;
- int banyak_level = 0;
- if((dir = opendir(directory)) != NULL) {
- while((ent = readdir(dir)) != NULL)
- if((strcmp(ent->d_name, ".") != 0) && (strcmp(ent->d_name, "..") != 0))
- banyak_level++;
- closedir(dir);
- }
- return banyak_level;
- }
- /*
- dir contoh \\intermediate
- kesulitan contoh intermediate_level_
- */
- char * cari_nama_file(char * dir, char * kesulitan) {
- int pilih_level;
- char level[10] = "";
- char nama_file[50] = "";
- int banyak_level = cari_banyak_level(dir);
- do {
- printf("\n\n"
- " ======================================= \n"
- "|| INTERMEDIATE PUZZLE ||\n"
- " ======================================= \n");
- for(int i = 1; i <= banyak_level; i++)
- printf("|| %i. Puzzle %d ||\n", i, i);
- printf(" ======================================= \n"
- " *****************\n"
- "|| Pilih: "
- );
- scanf("%d", &pilih_level);
- printf(" *****************\n");
- } while (pilih_level < 1 || pilih_level > banyak_level);
- itoa(pilih_level, level, 10);
- // intermediate
- strcpy(nama_file, kesulitan);
- // intermediate/
- strcat(nama_file, "\\");
- // intermediate//intermediate
- strcat(nama_file, kesulitan);
- // intermediate//intermediate_level_
- strcat(nama_file, "_level_");
- // intermediate//intermediate_level_1
- strcat(nama_file, level);
- // intermediate//intermediate_level_1.txt
- strcat(nama_file, ".txt");
- printf("nama file %s\n", nama_file);
- return nama_file;
- }
- void tampilan_awal() {
- printf("\n\n"
- " ================================================ \n"
- "|| || \n"
- "|| PROGRAM TUGAS BESAR ANALGO ||\n"
- "|| KELOMPOK GAME \"UNBLOCK ME\" ||\"\n"
- "|| || \n"
- " ================================================ \n"
- "|| || \n"
- "|| AGUS DARMAWAN - 10115358 ||\n"
- "|| HAMDANI - 10115146 ||\n"
- "|| Roni Nurlana - 10115375 ||\n"
- "|| Agung Nugraha - 10116412 ||\n"
- "|| || \n"
- " ================================================ \n"
- "Tekan Sembarang Untuk Melanjutkan\n"
- );
- _getch();
- }
- /* ========================================================================= */
- struct node {
- int depth;
- struct node *parent;
- struct node *prev;
- struct node *next;
- char move[6][6];
- unsigned short piece_moved_i, piece_moved_j;
- };
- struct node *first_node = NULL;
- struct node *current_node = NULL;
- struct node *last_node = NULL;
- struct node *solution_node = NULL;
- unsigned int new_moves = 0;
- unsigned int fifo_size = 0;
- unsigned int prev_depth = 0;
- char puzzle_kosong[6][6] = {
- {' ', ' ', '-', '-', ' ', ' '},
- {' ', ' ', ' ', ' ', ' ', ' '},
- {' ', ' ', ' ', ' ', ' ', ' '},
- {' ', ' ', ' ', ' ', ' ', ' '},
- {' ', ' ', ' ', ' ', ' ', ' '},
- {' ', ' ', ' ', ' ', ' ', ' '}
- };
- /* ========================================================================= */
- int main() {
- tampilan_awal();
- char pilih_type;
- char nama_file[50] = "";
- do {
- system("cls");
- printf("\n\n"
- " ========================================= \n"
- "|| UNBLOCK ME SOLVER ||\n"
- "|| 1. Puzzle Kosong ||\n"
- "|| 2. Test Puzzle ||\n"
- "|| 3. Beginner Puzzle (Pemula) ||\n"
- "|| 4. Intemediate Puzzle (Pertengahan) ||\n"
- "|| 5. Advance Puzzle (Lanjutan) ||\n"
- " ========================================= \n"
- " *****************\n"
- "|| Pilih : "
- );
- pilih_type = (char) getchar();
- printf(" *****************\n");
- system("cls");
- memset(&data_puzzle, 0, sizeof(data_puzzle));
- switch (pilih_type) {
- case '1': {
- printf(" ======================================= \n"
- "|| PUZZLE KOSONG ||\n"
- " ======================================= \n");
- memcpy(data_puzzle, puzzle_kosong, sizeof(char) * 36);
- }
- break;
- case '2':
- strcpy(nama_file, cari_nama_file("\\test", "test"));
- break;
- case '3':
- strcpy(nama_file, cari_nama_file("\\beginner", "beginner"));
- break;
- case '4':
- strcpy(nama_file, cari_nama_file("\\intermediate", "intermediate"));
- break;
- case '5':
- strcpy(nama_file, cari_nama_file("\\advanced", "advanced"));
- break;
- default:
- printf("Anda salah memilih type kesulitan\n");
- _getch();
- }
- } while(pilih_type < '1' || pilih_type > '5');
- /* jika yang dipilih bukan 1 (puzzle kosong) */
- if(pilih_type != 1) {
- FILE *f;
- if ((f = fopen(nama_file, "r")) == NULL) {
- perror("fopen");
- return 1;
- }
- char c;
- int i = 0;
- int j = 0;
- while ((c = (char) getc(f)) != -1) {
- if (j == 6) {
- j = 0;
- i++;
- }
- if (c != ',' && c != '\n') {
- data_puzzle[i][j] = c;
- j++;
- }
- }
- fclose(f);
- }
- struct node root;
- root.depth = 0;
- root.parent = NULL;
- root.prev = NULL;
- root.next = NULL;
- memcpy(root.move, data_puzzle, sizeof(char) * 36);
- printm(root.move);
- printf("\nTekan sembarang\n");
- _getch();
- first_node = current_node = last_node = &root;
- fifo_size = 1;
- next_moves();
- new_moves = 0;
- system("cls");
- printf("\n\n"
- " ===========================================================\n"
- " || Ketika aplikasi berjalan, silahkan tunggu beberapa saat ||\n"
- " || Biarkan program mencari solusi terbaik ||\n"
- " || Waktu yang dibutuhkan bisa sampe beberapa menit ||\n"
- " || Tergantung kesulitan dari puzzle yang dipilih ||\n"
- " ===========================================================\n"
- "\n\n"
- );
- while (current_node->next != NULL && solution_node == NULL) {
- current_node = current_node->next;
- next_moves();
- new_moves = 0;
- }
- if (solution_node != NULL) {
- printf("Perpindahan ke %d:\n", solution_node->depth);
- printm(solution_node->move);
- current_node = solution_node;
- while (current_node->parent != NULL) {
- current_node = current_node->parent;
- printf("Pindah %d:\n", current_node->depth);
- printm(current_node->move);
- }
- printf("Solusi ditemukan, %u kali pindah (%u percobaan).\n", solution_node->depth, fifo_size);
- }
- else
- printf("Solusi tidak ditemukan.\n");
- return 0;
- }
- int equals(char a[][6], char b[][6]) {
- for (int j = 0; j < 6; j++)
- for (int i = 0; i < 6; i++)
- if (a[i][j] != b[i][j])
- return 0;
- return 1;
- }
- void add(char move[][6], unsigned short i, unsigned short j) {
- struct node *n = last_node;
- do {
- if (equals(n->move, move))
- return;
- } while ((n = n->prev) != NULL);
- struct node *new_node = malloc(sizeof(struct node));
- memcpy(new_node->move, move, sizeof(char) * 36);
- new_node->depth = current_node->depth + 1;
- new_node->parent = current_node;
- new_node->prev = last_node;
- new_node->next = NULL;
- new_node->piece_moved_i = i;
- new_node->piece_moved_j = j;
- last_node->next = new_node;
- last_node = new_node;
- new_moves++;
- fifo_size++;
- }
- void next_moves() {
- char working_move[6][6];
- char next_move[6][6];
- char piece;
- memcpy(working_move, current_node->move, sizeof(char) * 36);
- for (int j = 0; j < 6; j++) {
- for (int i = 0; i < 6; i++) {
- piece = working_move[i][j];
- if (piece == ' ')
- continue;
- // Horizontal pieces of size 2
- if (piece == '-' || piece == '*') {
- if (! (current_node->piece_moved_i == i && current_node->piece_moved_j == j)) {
- // geser kanan
- memcpy(next_move, current_node->move, sizeof(char) * 36);
- for (int k = j + 2; ((k < 6) && (current_node->move[i][k] == ' ')); k++) {
- if (k == 5 && piece == '*') {
- solution_node = last_node;
- return;
- }
- next_move[i][k] = piece;
- next_move[i][k - 2] = ' ';
- add(next_move, i, k - 1);
- }
- // geser kiri
- memcpy(next_move, current_node->move, sizeof(char) * 36);
- for (int k = j - 1; ((k >= 0) && (current_node->move[i][k] == ' ')); k--) {
- next_move[i][k] = piece;
- next_move[i][k + 2] = ' ';
- add(next_move, i, k);
- }
- }
- // Mark the piece as dealt
- working_move[i][j + 1] = 'x';
- }
- // Vertical pieces of size 2
- else if (piece == '|') {
- if (! ((current_node->piece_moved_i == i) && (current_node->piece_moved_j == j))) {
- // geser atas
- memcpy(next_move, current_node->move, sizeof(char) * 36);
- for (int k = i - 1; ((k >= 0) && (current_node->move[k][j] == ' ')); k--) {
- next_move[k][j] = '|';
- next_move[k + 2][j] = ' ';
- add(next_move, k, j);
- }
- // geser bawah
- memcpy(next_move, current_node->move, sizeof(char) * 36);
- for (int k = i + 2; ((k < 6) && (current_node->move[k][j] == ' ')); k++) {
- next_move[k - 2][j] = ' ';
- next_move[k][j] = '|';
- add(next_move, k - 1, j);
- }
- }
- // Mark the piece as dealt
- working_move[i + 1][j] = 'x';
- }
- }
- }
- } // end next_moves();
- void printm(char move[][6]) {
- printf("++++++++\n");
- for (int i = 0; i < 6; i++) {
- printf("+");
- for (int j = 0; j < 6; j++)
- printf("%c", move[i][j]);
- if (i != 2)
- printf("+");
- printf("\n");
- }
- printf("++++++++\n");
- }
Add Comment
Please, Sign In to add comment