Gйnйrateur de Labyrinthe
#1

Bonjour tout le monde.

Aprиs une longue absence sur ce forum dont j'avais а ma charge la modйration de cette section franзaise de SAMP je reprends du service pour aider le serveur GamerX.

Pour ce faire je suis en train de dйvelopper un script qui permet de gйnйrer des labyrinthes dans SA:MP. Je suis actuellement а la phase 1 du projet qui consiste а crйer le labyrinthe dans le code (pas avec les objets (phase 2)).

Pour rйaliser cette premiиre phase, j'ai adaptй un algorithme en C, en PAWNO. Cet algorithme fonctionne trиs bien pour des petits labyrinthes (size<6) mais ma cmd /maze retourne 0 (Unknown Cmd) quand size>6. Je suis bloquй depuis pas mal de temps et j'apprйcierai beaucoup de l'aide de votre part.

Code:
#include <a_samp>

#define MAX 61  // 30 * 2 + 1
#define CELL 900  // 30 * 30
#define WALL 1
#define PATH 0

new size=6;
new indeks = 0;
new maze[MAX][MAX];
new backtrack_x[CELL];
new backtrack_y[CELL];
new finished=0;


public OnFilterScriptInit()
{
	print("\n--------------------------------------");
	print(" Rick Maze Filterscript");
	print("--------------------------------------\n");
	return 1;
}

public OnFilterScriptExit()
{
	return 1;
}


init_maze(maze[MAX][MAX])
{
     for(new a = 0; a < MAX; a++)
     {
         for(new b = 0; b < MAX; b++)
         {
             if(a % 2 == 0 || b % 2 == 0)
                 maze[a][b] = 1;
             else
                 maze[a][b] = PATH;
         }
     }
     
     return 1;
}

maze_generator(indeks,maze[MAX][MAX],backtrack_x[CELL],backtrack_y[CELL], x, y, n, visited)
{
	printf("Visited : %d",visited);
    if(visited < n * n)
    {
        new neighbour_valid = -1;
        new neighbour_x[4];
        new neighbour_y[4];
        new step[4];

        new x_next;
        new y_next;

        if(x - 2 > 0 && is_closed(maze, x - 2, y))  // upside
        {
            neighbour_valid++;
            neighbour_x[neighbour_valid]=x - 2;
            neighbour_y[neighbour_valid]=y;
            step[neighbour_valid]=1;
        }

        if(y - 2 > 0 && is_closed(maze, x, y - 2))  // leftside
        {
            neighbour_valid++;
            neighbour_x[neighbour_valid]=x;
            neighbour_y[neighbour_valid]=y - 2;
            step[neighbour_valid]=2;
        }

        if(y + 2 < n * 2 + 1 && is_closed(maze, x, y + 2))  // rightside
        {
            neighbour_valid++;
            neighbour_x[neighbour_valid]=x;
            neighbour_y[neighbour_valid]=y + 2;
            step[neighbour_valid]=3;

        }

        if(x + 2 < n * 2 + 1 && is_closed(maze, x + 2, y))  // downside
        {
            neighbour_valid++;
            neighbour_x[neighbour_valid]=x+2;
            neighbour_y[neighbour_valid]=y;
            step[neighbour_valid]=4;
        }

        if(neighbour_valid == -1)
        {
            // backtrack
            x_next = backtrack_x[indeks];
            y_next = backtrack_y[indeks];
            indeks--;
        }

        if(neighbour_valid!=-1)
        {
            new randomization = neighbour_valid + 1;
            new random2 = random(randomization);
            x_next = neighbour_x[random2];
            y_next = neighbour_y[random2];
            indeks++;
            backtrack_x[indeks] = x_next;
            backtrack_y[indeks] = y_next;

            new rstep = step[random2];

            if(rstep == 1)
                maze[x_next+1][y_next] = PATH;
            else if(rstep == 2)
                maze[x_next][y_next + 1] = PATH;
            else if(rstep == 3)
                maze[x_next][y_next - 1] = PATH;
            else if(rstep == 4)
                maze[x_next - 1][y_next] = PATH;
            visited++;
        }

        maze_generator(indeks, maze, backtrack_x, backtrack_y, x_next, y_next, n, visited);
    }
    
    else finished =1;
    return 1;
}

print_maze(maze[MAX][MAX],maze_size)
{
	new TempString[1000];
 	for(new a = 0; a < maze_size * 2 + 1; a++)
     {
         for(new b = 0; b < maze_size * 2 + 1; b++)
         {
             if(maze[a][b] == WALL)
                 format(TempString,sizeof(TempString),"%s#",TempString);
             else
                 format(TempString,sizeof(TempString),"%s ",TempString);
         }
         SendClientMessageToAll(0xFFFFFFFF,TempString);
         format(TempString,sizeof(TempString),"",TempString);
     }
     return 1;
}

is_closed(maze[MAX][MAX], x, y)
{
    if(maze[x - 1][y]  == WALL
       && maze[x][y - 1] == WALL
       && maze[x][y + 1] == WALL
       && maze[x + 1][y] == WALL
    )
        return 1;

    return 0;
}

public OnPlayerCommandText(playerid, cmdtext[])
{
    if(!strcmp(cmdtext, "/maze", true))
    {
	    init_maze(maze);

	    backtrack_x[indeks] = 1;
	    backtrack_y[indeks] = 1;

		while(!finished)
		{
	    	maze_generator(indeks, maze, backtrack_x, backtrack_y, 1, 1, size, 1);
		}
	    finished =0;
	    print_maze(maze,size);
        return 1;
    }
    return 0;
}
Bonne soirйe а tous
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)