Пример #1
0
int main ( int argc, const char *argv[] )
{
    int **m, n, i;
    n=0;

    printf ( "Gerando Matriz valida aguarde!\n" );

    // Gera inúmeras matrizes
    // Para quando uma matriz gerada tiver saida (1)
    // pode ocorrer falha de seguimentação
    while (n==0)
    {
        printf ( "============================\n" );
        m=create_matrix();
        printf ( "antes de entrar na função:\n" );
        print_matrix(m);
        printf ( "\n" );
        n=find_exit(m,0,0);
        printf ( "depois de passar pela função:\n" );
        print_matrix(m);
        printf ( "\n" );
        printf ( "%d\n", n );
        //printf ( "\n" );
        //print_matrix(m);
        
        for ( i = 0; i < 10; i++ )
        {
            free(m[i]);
            m[i]=NULL;
        }
        free(m);
        m=NULL;
    }

    return 0;
}
Пример #2
0
int find_exit (int **m, int x, int y)
{
    // se chegar na posição m[9][9] retorna 1
    if (x==9 && y==9)
    {
        return 1;
    }
    // se m[0][0] pode ir uma posição para direita ou uma para abaixo
    // chama a função novamente com a posição atualizada
    // se não não a saida retornando 0
    else if (x==0 && y==0)
    {
        if (m[x][y+1]==0)
        {
            return find_exit(m,x,y+1);
        }
        else if (m[x+1][y]==0)
        {
            return find_exit(m,x+1,y);
        }
        else
        {
            return 0;
        }
    }
    // se m[x][0] pode ir uma posição para direita ou uma para baixo,
    // pode ir uma posição para baixo,
    // ou pode retorna a posição anterior, atualizando a atual com 2
    // se não retorna 0
    else if (x>0 && y==0)
    {
        if(m[x][y+1]==0 && y<9)
        {
            return find_exit(m,x,y+1);
        }
        else if (m[x+1][y]==0 && x<9)
        {
            return find_exit(m,x+1,y);
        }
        else if (m[x-1][y]==0 && x>1)
        {
            m[x][y]=2;
            return find_exit(m,x-1,y);
        }
        else
        {
            return 0;
        }
    }
    // se m[0][y] pode ir uma posição para a direita ou uma para baixo,
    // ou pode retorna para a posição anterior, atualizando a atual com 2
    // se não retorna 0
    else if (x==0 && y>0)
    {
        if(m[x][y+1]==0 && y<9)
        {
            return find_exit(m,x,y+1);
        }
        else if(m[x+1][y]==0 && x<9)
        {
            return find_exit(m,x+1,y);
        }
        else if (m[x][y-1]==0 && y>1)
        {
            m[x][y]=2;
            return find_exit(m,x,y-1);
        }
        else
        {
            return 0;
        }
    }
    // para m[x][y] pode ir uma posição para a direita, ou uma posição
    // para baixo, ou uma posição para cima e ou uma posição para a esquerda
    // se não, retorna 0
    else if (x>0 && y>0)
    {
        if (y<9 && m[x][y+1]==0)
        {
            return find_exit(m,x,y+1);
        }
        else if(x<9 && m[x+1][y]==0)
        {
            return find_exit(m,x+1,y);
        }
        else if (m[x-1][y]==0 && x>0)
        {
            m[x][y]=2;
            return find_exit(m,x-1,y);
        }
        else if (m[x][y-1]==0 && y>0)
        {
            m[x][y]=2;
            return find_exit(m,x,y-1);
        }
        else
        {
            return 0;
        }
    }
    // retorna 0 se não houver solução
    else
    {
        return 0;
    }    
}
Пример #3
0
void reset_update(void)
{
	char buf[MAX_BUFFER];
	CREATURE *crit=0;
	OBJECT *obj=0, *container=0;;
	RESET *reset=0, *reset_next=0, *orig=0;
	EXIT *exit=0;
	long min=0;

	for(reset = hash_reset[(current_time)%HASH_KEY]; reset; reset = reset_next)
	{
		reset_next = reset->next_hash;

		if(current_time < reset->poptime)
			continue;

		if( percent() < reset->chance
		|| (reset->max && reset->loaded >= reset->max))
		{
			add_reset(reset);
			continue;
		}
	
		obj = container = 0;
		crit = 0;

		for(orig = reset; reset; reset = reset->next)
		{
			// each reset has a chance to load.. don't have to calculate the first reset again though
			// hence the reset->prev
			if((reset->prev
			&&  percent() < reset->chance)
			|| (reset->max && reset->loaded >= reset->max))
				continue;

			min = reset->min;

			while(min > 0 && reset->loaded < reset->max)
			{
				switch(reset->loadtype)
				{
				case TYPE_CREATURE:
					crit		= new_creature(reset->crit->vnum);
					crit->reset	= reset;
					reset->loaded++;
					// trans crit to room
					trans(crit, reset->room);

					// if builder put in some command for the mob to do at spawn, put it here
					if(reset->command)
						interpret(crit, reset->command);

					// reset container to 0 in case more objects load on this mob
					container = 0;
					break;
				case TYPE_OBJECT:
					obj		= new_object(reset->obj->vnum);
					obj->reset	= reset;
					reset->loaded++;

					// trans obj to container, or crit, or room.. in that order
					trans(obj, container ? (void*)container : crit ? (void*)crit : (void*)reset->room);

					// when object pops on a mob the builder has the option to make the crit wear it...
					if(crit && ValidString(reset->command))
					{
						sprintf(buf, "wear %s", reset->command);
						interpret(crit, buf);
					}

					// if this is a container, set the pointer so stacking can occur
					if(obj->objtype == OBJ_CONTAINER)
						container = obj;
					break;
				case TYPE_EXIT:
					if(!(exit = find_exit(reset->room, reset->command)))
					{
						mudlog("RESET_UPDATE: no exit found for reset#%li",reset->id);	
						break;
					}
					exit->door = reset->loaded;
					break;
				}
				min--;
			}
		}

		add_reset(orig);
	}
}