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; }
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; } }
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); } }