Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Hacer script que ponga un numero aleatorio pero que no se repita un array.

Iniciado por Ness, Agosto 31, 2016, 07:33:06 AM

Tema anterior - Siguiente tema

int cantidadEnemis = 10;
        int[] verficadorNum = new int[26];
        int numPosAleatorea = 0;
       
        for (int i = 0 ; i < cantidadEnemis; )
        {
           
            numPosAleatorea = Random.Range(0, posicion.Length);
            verficadorNum = new int[i+1];
 
            //este verifica que no se repita en la misma posicion
            for (int AuxO = 0; AuxO < verficadorNum.Length; AuxO++)
            {
               // Debug.Log(AuxO);
                if (numPosAleatorea == verficadorNum[AuxO])
                {
                 //   Debug.Log("hola ");
                 
                    break;
                 }
               
            }
            /*if (salir == true)
            {
            //    Debug.Log("salir");
                salir = false;
                return;
            }*/
            verficadorNum = numPosAleatorea;
            Instantiate(enemigo, posicion[verficadorNum].position, Quaternion.identity);
            Debug.Log("posicion ="+verficadorNum);
            ++i;
        }

 
el problema es tratado varias formas pero este metodo no discrimina y repite numeros varias veces.

Lo voy a intentar,aunque no prometo nada xD, perdona si me equivoco XD
 
Creo que con dos List un while  y un if para salir del while bastarian.
 

List<Transforms> enenyPositions=new List<Transorms>();
List <int> enemyArrayLength = new List<int>();
for(int a=0;a<enemyPositions.Length,a++){
  enemyArrayLength.Add(a);                                    
}
working = true;
 While(working){
 
   nRandom = Random.Range(0,enemyArrayLength,length);
   nPosition = enemyArrayLength[nRandom];
                                     
   enemyArrayLength.RemoveAt(nRandom);
   position = enemyPositions[nPosition];
   Intantiate(enemy,position,quaternion.identity);
   if(enemyArrayLength.length == 0){
   working = false;
  }
 
  }

 
Diria que asi mas o menos, solo esta puesto para que se vea la idea,espero no haberme equivocado
 
La idea es tienes una List con los transforms donde se puede poner un enemigo,asignados en el inspector,en otra list guardas las posiciones de la primera List,que sera basicamente 0,1,2,3,4,5,6,7,8,9,10........hasta donde tengas.si tienes 32 sitio,pues hasta 31.Luego le vas haciendo un random.Range con el tamaño de la segunda list,que te dara un numero que sera para escoger el transform de la primera List,entonces eliminas de la segunda list la posicion donde estaba ese numero y vuelta ha empezar,Random.Range a la segunda List que tendra una posicion menos.El if es para detectar si ya no quedan posiciones salir del while.
 
Es decir 1 list donde tienes las posiciones,y otra list donde tienes las posiciones que quedan libres de la otra list..
 
Espero no haberme equivocado,suelo hacerme la picha un lio con los length si empiezan a contar en 0 o en 1,pero a ver si te sirve para ver la idea.
 
Saludos
 
 

hay al menos un par de maneras: q mires si el valor ya esta en el array antes de agregarlo con array.IndexOf, o si tienes una secuencia de numeros la pones en el array y luego lo revuelves intercambiando elementos aleatoriamente

Cita de: Braltor date=1472645075hay al menos un par de maneras: q mires si el valor ya esta en el array antes de agregarlo con array.IndexOf, o si tienes una secuencia de numeros la pones en el array y luego lo revuelves intercambiando elementos aleatoriamente
   


los numeros los defino aleatoriamente con rando.range puedes ponerme un ejemplo de como usar  array.indexOF

Cita de: hammer date=1472644769Lo voy a intentar,aunque no prometo nada xD, perdona si me equivoco XD
   
   
      Creo que con dos List un while  y un if para salir del while bastarian.
   
   

List<Transforms> enenyPositions=new List<Transorms>();
List <int> enemyArrayLength = new List<int>();
for(int a=0;a<enemyPositions.Length,a++){
  enemyArrayLength.Add(a);                                    
}
working = true;
 While(working){
 
   nRandom = Random.Range(0,enemyArrayLength,length);
   nPosition = enemyArrayLength[nRandom];
                                     
   enemyArrayLength.RemoveAt(nRandom);
   position = enemyPositions[nPosition];
   Intantiate(enemy,position,quaternion.identity);
   if(enemyArrayLength.length == 0){
   working = false;
  }
 
  }

   
      Diria que asi mas o menos, solo esta puesto para que se vea la idea,espero no haberme equivocado
   
   
      La idea es tienes una List con los transforms donde se puede poner un enemigo,asignados en el inspector,en otra list guardas las posiciones de la primera List,que sera basicamente 0,1,2,3,4,5,6,7,8,9,10........hasta donde tengas.si tienes 32 sitio,pues hasta 31.Luego le vas haciendo un random.Range con el tamaño de la segunda list,que te dara un numero que sera para escoger el transform de la primera List,entonces eliminas de la segunda list la posicion donde estaba ese numero y vuelta ha empezar,Random.Range a la segunda List que tendra una posicion menos.El if es para detectar si ya no quedan posiciones salir del while.
   
   
      Es decir 1 list donde tienes las posiciones,y otra list donde tienes las posiciones que quedan libres de la otra list..
   
   
      Espero no haberme equivocado,suelo hacerme la picha un lio con los length si empiezan a contar en 0 o en 1,pero a ver si te sirve para ver la idea.
   
   
      Saludos
   
   
       
   


me base en tu metodo para resolver el que tenia 
 
no sabia existencia de   las List<> , funciono mejor que usar un int[].
 
 
 

void intacioncionArray()
    {
        int cantidadEnemis = 10;
        List<int> enenyPositionlist = new List<int>();
        int[] verficadorNum ;
        int numPosAleatorea = 0;
        bool EjecutarInstanciacion = false;
       
        for (int i = 0; i < cantidadEnemis ; )
        {
           
            numPosAleatorea = Random.Range(0, posicion.Length);
            EjecutarInstanciacion = true;
 
            //este verifica que no se repita en la misma posicion
            for (int AuxO = 0; AuxO < enenyPositionlist.Count; AuxO++)
            {
             
                if (enenyPositionlist[AuxO] == numPosAleatorea)
                {
                 
                    EjecutarInstanciacion = false;
                    break;
                 }
               
            }
            enenyPositionlist.Add(numPosAleatorea);
            if (EjecutarInstanciacion == true)
            {
             
               
           
            verficadorNum = new int[i + 1];
            verficadorNum = numPosAleatorea;
            Instantiate(enemigo, posicion[verficadorNum].position, Quaternion.identity);
            Debug.Log("posicion ="+verficadorNum);
            ++i;
            }
        }
    }

 
 

Etiquetas: