Jump to content
Sign in to follow this  
Ness

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

Recommended Posts

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[i] = numPosAleatorea;

            Instantiate(enemigo, posicion[verficadorNum[i]].position, Quaternion.identity);
            Debug.Log("posicion ="+verficadorNum[i]);
            ++i;
        }

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

Edited by pioj
uso de tags y <> para pegar código.

Share this post


Link to post
Share on other sites

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

 

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
hace 10 horas, Braltor said:

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

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

Share this post


Link to post
Share on other sites
hace 12 horas, hammer said:

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

 

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[i] = numPosAleatorea;

            Instantiate(enemigo, posicion[verficadorNum[i]].position, Quaternion.identity);
            Debug.Log("posicion ="+verficadorNum[i]);
            ++i;
            }

        }

    }

 

Share this post


Link to post
Share on other sites
Sign in to follow this  

UnitySpain © Todos los derechos reservados 2020
×
×
  • Create New...