#include #include #include #include #include "set.h" #ifndef PLATFORM_WEB #include #else #include RAYLIB_SRC #endif #define W 800 #define H 600 #define NODES_X 20 #define NODES_Y 15 #define NODE_L 40 set *nodes[NODES_X][NODES_Y]; bool walls_hori[NODES_X][NODES_Y-1] = {0}; // false - exists bool walls_vert[NODES_X-1][NODES_Y] = {0}; // true - doesnt exist void init_nodes() { for(int i = 0; i < NODES_Y; i++) for(int j = 0; j < NODES_X; j++) nodes[j][i] = set_create(); } void deinit_nodes() { for(int i = 0; i < NODES_Y; i++) for(int j = 0; j < NODES_X; j++) set_free(nodes[j][i]); } void update() { // optimize picking random number thingy if(rand() % 2) { int x = rand() % NODES_X; int y = rand() % (NODES_Y-1); if(set_find(nodes[x][y]) != set_find(nodes[x][y+1])) { walls_hori[x][y] = true; set_union(nodes[x][y], nodes[x][y+1]); } } else { int x = rand() % (NODES_X-1); int y = rand() % NODES_Y; if(set_find(nodes[x][y]) != set_find(nodes[x+1][y])) { walls_vert[x][y] = true; set_union(nodes[x][y], nodes[x+1][y]); } } for(int i = 0; i < NODES_Y; i++) { for(int j = 0; j < NODES_X; j++) { if(i < NODES_Y-1) if(!walls_hori[j][i]) DrawLine((j+0)*NODE_L, (i+1)*NODE_L, (j+1)*NODE_L, (i+1)*NODE_L, RED); if(j < NODES_X-1) if(!walls_vert[j][i]) DrawLine((j+1)*NODE_L, (i+0)*NODE_L, (j+1)*NODE_L, (i+1)*NODE_L, RED); } } } int main(void) { srand(time(NULL)); InitWindow(W, H, "Kruskal"); SetTargetFPS(60); init_nodes(); while(!WindowShouldClose()) { BeginDrawing(); ClearBackground(RAYWHITE); DrawFPS(10, 10); update(); EndDrawing(); } deinit_nodes(); return 0; }