Maze Generator FilterScript bug
#1

Hello, I tryed to make a Maze Generator Filter Script. I converted a c algorithm into a pawno algorithm. My filterscript is working fine when I wanna generate little mazes (size < 7), but when I want generate big mazes it returns Unknown cmd whereas my function isn't finished to run.

I would appreciate if someone can help me to solve this problem, and maybe it will be awesome if some guys are interest to join the project.

Код:
#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;
}
P.S. : That's one of my first project in PAWNO. I don't wanna be trolled
Reply


Messages In This Thread
Maze Generator FilterScript bug - by Rick - 13.01.2013, 22:29
Re: Maze Generator FilterScript bug - by Mauzen - 14.01.2013, 19:29
Re: Maze Generator FilterScript bug - by Rick - 14.01.2013, 21:46
Re: Maze Generator FilterScript bug - by Mauzen - 14.01.2013, 22:41
Re: Maze Generator FilterScript bug - by Rick - 14.01.2013, 22:54
Re: Maze Generator FilterScript bug - by Babul - 15.01.2013, 05:13
Re: Maze Generator FilterScript bug - by Crayder - 14.01.2015, 00:22

Forum Jump:


Users browsing this thread: 2 Guest(s)