Generar números aleatorios únicos es una técnica esencial a saber por todo creador de juegos. Este tutorial corto demostrara una forma de usar un array para generar un set de números aleatorios sin estos duplicarse.
El proyecto requiere de la versión de Construct2 87 o mayor. La versión gratuita también sirve.
Puedes descargar el proyecto completo desde aqui:
http://dl.dropbox.com/u/57899112/RandomNos.capx
La meta es insertar 6 números (integers) aleatorios que sean "mayores que" o "iguales a" cero, pero "menores que" 15, en un array sin que estos se dupliquen.
-----
NOTA: Agrego esto a la traducción para quienes no sepan. Un "ARRAY" es una colección o lista de componentes, los cuales pueden ser números, letras o palabras, pero siempre siendo estos de un mismo tipo. Es decir, sin mezclar números o letras, para ello existen las "matrices", pero ya es otra historia.
-----
1. Crea una nuevo proyecto y nombralo RandomNos
2. Crea 3 objetos en la capa: 2 objetos tipo texto y un array. Cambia las propiedades de los objetos como se muestra a continuación:
Name: txtTries
Plugin: Text
Position: 120,64
Size: 200,30
Name: txtValues
Plugin: Text
Position: 124,126
Size: 412,206
Text:
Name: Array
Plugin: Array
Width: 6
Cuando los objetos estén creados y agregados, tu proyecto debería verse de este modo:
3. Ve hacia la capa de eventos y agrega un evento System -> On start of layout. Has click derecho sobre el evento y selecciona Add a blank sub-event. Tu capa de eventos debería verse de este modo:
4. Clickea sobre el sub-evento en blanco y has click derecho, seleccionando Add a local variable como se muestra en la imagen. (Si no pueden ver "add local variable" en el menú, clickea "events tab" e intenta agregarla desde la barra de tareas. Ten en cuenta que solo pueden agregar una variable local en un lugar donde pueda ser usada)
5. La variable se agregara junto al sub-evento en blanco. Nombrala randomNumber y acéptala con su valor default. Agrega 2 variables locales mas, i y tries. Cuando estés listo, la capa de eventos debería verse de este modo:
6. Modifica el sub-evento en blanco haciendole doble click y volviendolo una iteracion while como se ve. Nota: para crear una iteracion "while", primero debes agregar la "condicion while" y entonces insertar la condicion que quieras sea "true".
7. Agrega algunas acciones al while como se ve a continuación. La primera acción genera un "integer" aleatorio "mayor que" o "igual que" 0 y "menor que" 15. (Porque la forma en que se comporta la función "random" (aleatorio) no puede generar números mayores. Puedes agregar 1 al valor máximo si quieres incluirlo). La segunda acción agrega a la variable local "tries", que almacena los numeros que se pretenden, solo números aleatorios únicos en el "array" (coleccion). La tercera acción solo muestra cuantos intentos se han hecho.
8. Selecciona el evento while y has click derecho sobre el seleccionando add a sub-event con la condición array containsrandomNumber. Has click derecho sobre la condición y selecciona "invert" (invertir) ya que evaluara si el "array" no contiene números aleatorios.
9. Agrega algunas acciones al sub-evento que solo sucedan si un numero aleatorios es único respecto a otro numero ya existente en el "array". Primero, inserta el numero aleatorio en el array en la posición "i". Entonces, agrega una linea a "txtValues" para mostrar ambos, "i" y el numero aleatorio. Tercero, agrega 1 a "i" como agregamos un valor al "array".
10. Finalmente, salva y corre el proyecto. El resultado deberia verse como la siguiente figura. Nota que en este caso, presente 11 intentos de insertar 6 números aleatorios en el "array", y también nota que ninguno de esos números en la columna derecha están duplicados.
Eso es todo y ahí lo tienes!
NOTAS:
1) Si estas generando muchos nuemeros aleatorios, hay una posibilidad de que tu "while no corra por mucho tiempo. Querrás agregar una condición para setear el limite de números de intento que se muestran en la siguiente imagen. Para este ejemplo no es deseable que lleves cerca de 1000 intentos, pero es bueno tenerlo en mente.
2) Si estas interesado en una versión mas compacta del proyecto, involucraría borrar los 2 objetos de texto y sus asociaciones de eventos y acciones, y debería verse de la siguiente forma:
Esta claro que sin los objetos de texto, no podrás ver nada cuando corras el proyecto
3) El tutorial demuestra como generar todos los números aleatorios de una vez. Si deseas generarlos de uno en uno, podrías usar la misma base, pero en un modo diferente. Para examinar un proyecto donde un numero aleatorio único es generado con un click o toque, chequea los siguientes proyectos. En adicion a implementar un limite de intento realista, te mostrara como presionar un elemento hacia el fin de un array.
RandomNosPush.capx