Dedicado a mis proyectos en Gambas ,un lenguaje de programación parecido al Visual Basic + Java pero ampliamente mejorado y...¡¡para gnu/linux!!.La potencia del gnu/linux sumada a la facilidad del Basic



Consultas, Desarrollo de programas y petición de presupuestos:



Mostrando entradas con la etiqueta barajar. Mostrar todas las entradas
Mostrando entradas con la etiqueta barajar. Mostrar todas las entradas

domingo, 15 de noviembre de 2015

miércoles, 11 de noviembre de 2015

Juego BuscaCaras: Uso de shuffle (barajar)

Juego Busca Caras:

Uso de shuffle (barajar)


Descripción del juego:
Os dejo un juego para los más pequeños: Se trata de encontrar que cara se repite de las 32 que aparecen aleatoriamente colocadas en un formulario. Tenemos 3 intentos (o vidas), cada vez que nos equivocamos, nos quitará una vida, y si acertamos, añadiremos una vida (como máximo tendremos 3 vidas). Si llegamos a 0 vidas, se acaba el juego :)

Funcionamiento interno:
La función barajar (shuffle) se usa para desordenar las caras que estan almacenadas  en un array de cadenas.
Primero se elige una entre las 32 caras, la cual se elimina del array, y luego se elige otra de las que tenga para añadirla al array, asi tenemos la "cara repetida". Luego desordenamos el array con la función barajar(shuffle).

Para mostrar las cras se usan controles ToolButton, creados en tiempo de ejecución dentro de un contenedor del tipo Hpanel.


Public Sub CrearBotones()

Dim a As Integer
Dim botontmp As ToolButton
Dim listaPresentacion As New String[]

For a = 0 To listacaras.max
listaPresentacion.Add(listaCaras[a])
Next

'quito una cara aleatoriamente
listaPresentacion.Remove(Int(Rnd(0, listaPresentacion.max)))
'añado una cara repetida
caraRepetida = listaPresentacion[Int(Rnd(0, listaPresentacion.count))]
listaPresentacion.Add(caraRepetida)

'barajo
listaPresentacion = ModuleAzar.barajar(listaPresentacion)

For a = 0 To 31
botontmp = New ToolButton(HPanel1) As "botones"
botontmp.Picture = Picture[listaPresentacion[a]]
botontmp.w = 75
botontmp.h = 75
botontmp.Border = True
botontmp.tag = listaPresentacion[a]
Next

End



Código Fuente e instalador .deb: alojado en google drive


Video del programa funcionando:





Nota:
17/11/2015
Gracias a Portano, ya tenemos el programa traducido al Portugués, Francés y Inglés

lunes, 9 de noviembre de 2015

Shuffle (Barajar) aleatoriamente con el algoritmo Sattolo-Cycle un array en Gambas



Shuffle (Barajar) aleatoriamente

con el algoritmo Sattolo-Cycle  un array  en Gambas



Leyendo el artículo de Joedicastro (http://joedicastro.com/algoritmos-shuffle.html) sobre los distintos algoritmos de barajar arrays, donde define varios algoritmos, entre ellos el algoritmo Sattolo-Cycle:
"este algoritmo solo genera ciclos, de ahí su nombre. Es decir, reparte uniformemente los resultados solo entre algunas permutaciones que se van rotando (aunque comparte el mismo problema con los anteriores al depender de una aleatoriedad no perfecta). Para resumir su funcionamiento, lo que hace es que después de ejecutarlo, ningún elemento de la lista repite la posición anterior que tenía en la misma. Ese algoritmo fue publicado por Sandra Sattolo en 1986"

He aplicado dicho algoritmo a una función realizada en gambas, quedando el código siguiente:

' Gambas module file

Public Function barajar(listaOriginal As Variant[]) As Variant[]

Dim listatemporal As New Variant[]
Dim i, idx, sel As Integer

'1º asigna a la listaOriginal a la temporal
For i = 0 To listaOriginal.max
listatemporal.add(listaOriginal[i]) 'usa una lista temporal para no perder el orden original'
Next

'2º mezcla algoritmo Sattolo-Cycle
idx = listaOriginal.count

While idx > 1
idx = idx - 1
sel = Int(Rnd(0, idx))
Swap listatemporal[sel], listatemporal[idx] 'intercambio valores
Wend
Return listatemporal 'se devuelve la lista temporal que es la lista originnal mezclada


End

Como veis esta función recibe un array de elementos, como es variant[] admite arrays de todo tipo: int[],float[],string[], structure[], objet[] y por supuesto vaiant[], y devuelve ese array barajado.

Ejemplo:
Un pequeño ejemplo de aplicación de shuffle (o "barajar") es el siguiente, tenemos una lista de 5 cadenas: "0/4", "1/4", "2/4",  "3/4" y "4/4". Y queremos barajarlo varias veces.

Usaríamos este código:

Public Sub barajo()

Dim a As Integer
Dim lista As New String[]
Dim listaBarajada As String[]

Randomize

lista.Add("0/4")
lista.Add("1/4")
lista.Add("2/4")
lista.Add("3/4")
lista.Add("4/4")

TextLabel1.text = "-------- Inicialmente ----------" & "<br>"
For a = 0 To lista.Max
TextLabel1.text &= lista[a] & "<br>"
Next

listaBarajada = ModuleAzar.barajar(lista)
TextLabel1.text &= "-------- Barajo ----------" & "<br>"
For a = 0 To lista.Max
TextLabel1.text &= listaBarajada[a] & "<br>"
Next

TextLabel1.text &= "-------- Barajo ----------" & "<br>"
listaBarajada = ModuleAzar.barajar(listaBarajada) 'barajo sobre la lista bajada anteriormente, para no repetir posicion
For a = 0 To lista.Max
TextLabel1.text &= listaBarajada[a] & "<br>"
Next


End

El resultado seria:


Código fuente completo: enlace a google drive

En un próximo post, os presentaré un juego que hace uso de este algoritmo.

Fuentes:
http://joedicastro.com/algoritmos-shuffle.html