Browse Source

Create StepByStep_Dijkstra_Maps.c

Rudy Boudewijn van Etten 5 years ago
parent
commit
45193c5558
1 changed files with 235 additions and 0 deletions
  1. 235 0
      ai/StepByStep_Dijkstra_Maps.c

+ 235 - 0
ai/StepByStep_Dijkstra_Maps.c

@@ -0,0 +1,235 @@
+#define MAX_PATH 1048
+#define MAPWIDTH 15
+#define MAPHEIGHT 15
+
+#include "raylib.h"
+#include <math.h>
+
+
+typedef struct pathnode{
+    int x;
+    int y;
+    
+}pathnode;
+
+static struct pathnode list[MAX_PATH];
+
+static int map[MAPWIDTH][MAPHEIGHT];
+static int mapWidth = MAPWIDTH;
+static int mapHeight = MAPHEIGHT;
+static float tileWidth ;
+static float tileHeight;
+static int startx;
+static int starty;
+static int endx;
+static int endy;
+static int listlen=0;    
+static bool startfound=false;
+
+
+static void newmap(void);
+static void animatedijkstramap(void);
+    
+int main(void)
+{
+    // Initialization
+    //--------------------------------------------------------------------------------------
+    const int screenWidth = 800;
+    const int screenHeight = 450;
+
+    InitWindow(screenWidth, screenHeight, "raylib example.");
+ 
+    SetTargetFPS(60);               // Set our game to run at 60 frames-per-second
+    //--------------------------------------------------------------------------------------
+    newmap();
+
+    tileWidth = abs((float)screenWidth/(float)mapWidth);
+    tileHeight = abs((float)screenHeight/(float)mapHeight);
+     
+    listlen = 0;
+    map[startx][starty]=1;
+    list[listlen].x=startx;
+    list[listlen].y=starty;
+    listlen+=1;        
+
+    
+    
+    // Main game loop
+    while (!WindowShouldClose())    // Detect window close button or ESC key
+    {
+        // Update
+        //----------------------------------------------------------------------------------
+        
+        if(IsKeyPressed(KEY_SPACE)){
+            if(startfound==false){
+                animatedijkstramap();
+            }else{
+                startfound=false;
+                newmap();
+                listlen = 0;
+                map[startx][starty]=1;
+                list[listlen].x=startx;
+                list[listlen].y=starty;
+                listlen+=1;        
+                
+            }
+            
+        }
+        
+        //----------------------------------------------------------------------------------
+        // Draw
+        //----------------------------------------------------------------------------------
+        BeginDrawing();
+
+            ClearBackground(RAYWHITE);
+            for(int y=0;y<mapHeight;y++){
+            for(int x=0;x<mapWidth;x++){
+                if(map[x][y]<0){
+                    DrawRectangle(x*tileWidth,y*tileHeight,tileWidth,tileHeight,DARKGRAY);
+                }else if(map[x][y]>0){
+                    DrawRectangle(x*tileWidth,y*tileHeight,tileWidth,tileHeight,BLUE);
+                    DrawText(FormatText("%i",map[x][y]),x*tileWidth,y*tileHeight,30,YELLOW);
+                }else{
+                    DrawText(FormatText("%i",map[x][y]),x*tileWidth,y*tileHeight,30,BLACK);
+                }
+                
+            }
+            }
+            DrawRectangle(startx*tileWidth,starty*tileHeight,tileWidth,tileHeight,(Color){0,200,0,200});
+            DrawRectangle(endx*tileWidth,endy*tileHeight,tileWidth,tileHeight,(Color){200,0,0,100});
+            
+            if(startfound){
+                DrawRectangle(0,0,screenWidth,60,(Color){10,10,10,200});
+                DrawText("Start Position Found!.",0,0,50,(Color){255,0,0,200});
+            }else{
+                DrawRectangle(0,0,screenWidth,20,(Color){100,100,100,200});
+                DrawText("Press space to search.",0,0,20,(Color){200,200,0,255});
+            }
+
+        EndDrawing();
+        //----------------------------------------------------------------------------------
+    }
+
+    // De-Initialization
+    //--------------------------------------------------------------------------------------
+    CloseWindow();        // Close window and OpenGL context
+    //--------------------------------------------------------------------------------------
+
+    return 0;
+
+
+}
+
+
+void animatedijkstramap(){
+    
+    
+    //
+    // Flood the map with distances from the start.
+    //
+  
+    if(listlen==0)return;
+    
+//    int failed=0;
+    // 4 way search! left/up/down/right
+    int dx[4]={ 0,1,0,-1};
+    int dy[4]={-1,0,1,0};    
+    // While we have a list to work with
+//    while(listlen>0){
+        // Take the first value from the array.
+        int x1=list[0].x;
+        int y1=list[0].y;
+        
+        // shift all up.
+        for(int i=0;i<listlen;i++){
+            list[i].x = list[i+1].x;
+            list[i].y = list[i+1].y;
+        }
+        if(x1==endx && y1==endy){            
+            listlen=0;
+            startfound=true;
+            return;
+        }
+
+        // Decrease list length
+        listlen-=1;
+        //
+        // Here we check around our current position.
+        for(int i=0;i<4;i++){
+            int nx = x1+dx[i];
+            int ny = y1+dy[i];
+            if(nx<0 || ny<0 || nx>= mapWidth || ny>= mapHeight)continue;            
+            // If we can get there then put the new distance there and add this position
+            // to the list.
+            if(map[nx][ny]==0){
+                map[nx][ny]=map[x1][y1]+1;
+                // add to last
+                //
+                list[listlen].x = nx;
+                list[listlen].y = ny;
+                listlen++;
+                //                
+            }
+        }
+        // Error?
+//        failed+=1;
+//        if(failed>160000)return;
+        
+//    }
+    
+ 
+}
+
+void newmap(){
+        //
+    // Generate random map....
+    //
+    
+    // First make sure every map value is 0.
+    for(int y=0;y<mapHeight;y++){
+    for(int x=0;x<mapWidth;x++){
+        map[x][y] = 0;
+    }}
+  	// Draw some lines on the map.
+   	for(int x=0;x< mapWidth;x+=5){
+        if(GetRandomValue(0,3)<2){
+            for(int y=2;y< mapHeight-2;y++){
+                map[x][y] = -1;
+            }
+        }
+    }
+    //
+    //draw some rectangles on the map
+   	for(int i=0;i<mapWidth;i++){
+   		int x1=GetRandomValue(0,mapWidth-5);
+   		int y1=GetRandomValue(0,mapHeight-5);
+   		for(int x2=0;x2<4;x2++){
+   		for(int y2=0;y2<4;y2++){
+   			map[x1+x2][y1+y2] = -1;
+   		}}
+   	} 
+    // Draw some passages on the map.
+   	for(int y=0;y<mapHeight;y+=5){
+ 	for(int x=0;x<mapWidth;x++){
+ 		map[x][y] = 0;
+ 	}}
+    
+    
+    //
+    // find a start and end location.
+    // 
+    bool found=false;
+    int failed=0;
+    while(found==false){
+        found = true;
+        startx = GetRandomValue(1,mapWidth-1);
+        starty = GetRandomValue(1,mapHeight-1);
+        endx = GetRandomValue(1,mapWidth-1);
+        endy = GetRandomValue(1,mapHeight-1);
+        // If below any start or end position than try again.
+        if(map[startx][starty]!=0 || map[endx][endy]!=0)found=false;
+        failed+=1;
+        if(failed>500000)return; // If we just can not find any start and end position then exit.
+    }
+
+}