martes, 24 de julio de 2012

Números aleatorios.Ejemplo 2

Aquí tenemos otro ejemplo con dados de poker. :-)



Con los números aleatorios podemos crear simulaciones.
Serán fundamentales en nuestras aplicaciones.


' Gambas class file

Private carasdadosalida As New Integer[]
Private odadopoker As PictureBox

Public Sub Form_Open()
    Me.Center()
    Me.Caption = "DADOS DE POKER"
End


Public Function mostrardados() As Integer
   Dim contador As Integer
   Dim cara As Integer
  
   For contador = 1 To 6
      cara = Int(Rnd(7, 13))
     odadopoker.Picture = Picture[cara & ".gif"] 'Para que veamos una repetición de las caras
      Wait 0.1
  Next
  carasdadosalida.Add(cara) 'Añadimos la ultima cara que ha salido al array
  Return cara
End


Public Sub tobDados_Click()
   Dim objeto As Object
   Dim x As Integer
   Dim coincidencias As Integer
   Dim temporal As New Integer[]
  
   LblSalida.Caption = "" 'Limpiamos la etiqueta que nos dice la jugada que se ha hecho
   For Each objeto In HBox2.Children
       If objeto Is PictureBox Then
          objeto.delete 'Borramos todos los objetos si hubiera algunos. Para limpiar el contenedor
       Endif
   Next
   carasdadosalida.Clear 'Limpiamos el array que contendrá los valores de los dados en este array
    creadadospoker() 'Creamos 5 dados
  carasdadosalida.Sort 'Clasificamos el array donde están los valores de los dados para identificar mejor la jugada
   Do While x <= carasdadosalida.Count - 2 'Mientras x sea menor que el número de dados en el array
      If carasdadosalida[x] = carasdadosalida[x + 1] Then 
'Si el primero coincide con el segundo,el segundo con el tercero....etc.
'Siempre sin salirnos del numero máximo de elementos del array carasdadosalida
      temporal.Add(carasdadosalida[x + 1]) 'Añadimos al array temporal la cara del dado que se repite
       coincidencias = coincidencias + 1 'Aumentamos el número de coincidencias
     Endif
     x += 1
    Loop
'Según el número de coincidencias que existan,decimos la jugada que se ha hecho
    If coincidencias = 1 Then LblSalida.Caption = "Pareja" 'Una sola coincidencia
    If coincidencias = 2 Then
        If temporal[0] = temporal[1] Then 'Dos coincidencias
            LblSalida.Caption = "Trio" 'Ejemplo 777XX
       Else
            LblSalida.Caption = "Doble Pareja" 'Ejemplo 7788X
       Endif
    Endif
    If coincidencias = 3 Then
       If (temporal[0] = temporal[1]) And (temporal[0] = temporal[2]) Then 'Ejemplo 8888X
           LblSalida.Caption = "Poker!"
      Else
            LblSalida.Caption = "Full" 'Ejemplo 88899
      Endif
   Endif
   If coincidencias = 4 Then
       LblSalida.Caption = "Repoker!!" 'Si hay 5 números iguales
   Endif
End


Public Sub creadadospoker() 'Para crear los 5 dados con su imagen
   Dim contador As Integer
   For contador = 1 To 5
          odadopoker = New PictureBox(HBox2)
          With odadopoker
               .Width = 64
               .Height = 64
               .Stretch = True
               .Picture = Picture[mostrardados() & ".gif"]
         End With
   Next
End

Podéis bajar el código aquí:

lunes, 23 de julio de 2012

Números aleatorios


Dependiendo de nuestra aplicación usaremos los números aleatorios.
Números al azar, para los juegos, para una aplicación de calculo,estadística

Los llamamos números aleatorios, pero no existen como tales en Gambas,
el nombre mas adecuado es pseudo-aleatorio. Llega un momento que
se pueden repetir, entonces dejan de ser tan aleatorios.

Tenemos dos funciones principales para el manejo de estos números.

  • Randomize
  • Rnd

Randomize:

Randomize inicia el generador de números pseudo-aleatorios.
Podemos darles un número a esta función.

Randomize Numero Entero

Con lo que generación de los números siempre serian iguales. Se repetirían
O dejarlo sin el valor, lo que lo hace diferente en cada generación.

Randomize

Solemos usar la función Randomize solamente una vez en la aplicación.
Al inicio en Form_Open() por ejemplo.

Rnd:

De por si sola, la función nos devuelve un número decimal 0 y 1.

Ejemplo:

---código---
Public Sub Form_Open()
   Dim x As Integer

   Randomize
  'Generar 5 números decimales entre 0 y 1
   For x = 1 To 5
       Print Rnd
   Next
End
---código---

Si nosotros hubiésemos asignado el resultado de la función RND a un número entero.
Estaríamos diciendo que la salida va ser del tipo entero. Estamos creando
unas propiedades para la variable de salida y lo más normal que su
valor hubiera sido siempre 0.Al decir que el tipo es entero.

Ahora bien, la función RND permite la generación de un número dentro de un intervalo.

RND(mínimo,máximo)

Cuando decimos

---código---

PRINT RND(1,10) 'Entre 1 y 9

--código---

Le decimos realmente que el número generado es entre 1 y 9. Así que si queremos
que el número generado este realmente entre 1 y 10 debemos usar

---código---

PRINT RND(1,11) 'Entre 1 y 10

--código---

Para la generación de números enteros debemos hacer uso de la función INT.
Comprobar la diferencia a no usar la función INT a usarla.

---código---

PRINT RND(1,11) 'Número decimal

PRINT INT (RND(1,11)) 'Número entero

---código---

El caso más típico de la generación de un dado de 6 caras.

---código---
Public Sub Form_Open()
   Dim x As Integer
 
   Randomize
   For x = 1 To 6
      Print Int(Rnd(1, 7))
   Next
End
---código---

Ejemplo de la tirada de un dado con imágenes



---código---
' Gambas class file

Private dado As PictureBox 'Definimos un objeto del tipo PictureBox

Public Sub _new()
End

Public Sub Form_Open()
   Me.Title = "DADO"
   Me.Center
End

Public Sub BtnDado_Click()

dado = New PictureBox(Me) 'Creamos el objeto picturebox que contendrá la imagen del dado

'Damos propiedades al objeto dado
With dado
   .x = 56
   .y = 24
   .Height = 64
   .Width = 64
   .Stretch = True
   .Border = Border.Sunken
   .Picture = Picture[muestradados() & ".gif"]
End With
End

Public Function muestradados() As Integer

Dim i As Integer
Dim cara As Integer
'Estamos generando 6 veces el dado. Para que el dado cambie su imagen
'Si este número se repite no percibimos el cambio de cara
   For i = 1 To 6
      cara = Int(Rnd(0, 6))
      dado.Picture = Picture[cara & ".gif"]
      Wait 0.3 'Añadimos un retardo para percibir ese cambio de cara del dado
  Next
  Return cara

End
---código---


Mas información en:


jueves, 19 de julio de 2012

TreeView.Continentes y Países

En estos ejemplos continuamos con el componente TreeView.

En el primero vamos a crear en un Treeview una lista alfabética
en el que iremos añadiendo los países contenidos en  un archivo de texto.
Según la letra por la que comience el país se añadirá a la letra que le
corresponda.


---código---
 Private apaises As String[]

Public Sub Form_Open()
  Me.Center     'Centramos nuestro formulario
  Me.Title = "Paises"
  CreaNodos
  LeeArchivoPaises
  apaises.Sort  'Ordenamos el array para cuando clasifique,estén los países por orden en sus nodos padres.Probar a comentar esta instrucción
  Clasificar
  tvListaPaises["Paises"].Expanded = True 'Mostramos expandido el nodo raiz "Paises"
End

Public Sub CreaNodos()
  Dim x As Integer
 
  tvListaPaises.Add("Paises", "Paises") 'Creamos nuestro nodo raíz
  For x = 65 To 90
      tvListaPaises.Add(Chr(x), Chr(x),, "Paises")  'Con el rango de código ascii que representa una letra, creamos los nodos padres
  Next
End

Public Sub LeeArchivoPaises()
  Dim spais As String
 
  spais = File.Load("paises2.txt")  'Añado todo el contenido del archivo paises2.txt a la variable de cadena spais
  apaises = Split(spais, "\n")      'Utilizamos como separador el salto de linea
  apaises.Remove(apaises.Count - 1) 'Eliminamos el ultimo elemento del array por que es un espacio en blanco

End

Public Sub Clasificar()
  Dim spais As String
 
  For Each spais In apaises
    tvListaPaises.Add(spais, spais,, Left(spais, 1)) 'Añadimos a cada nodo padre cada país que comienza con la letra del nodo
  Next

End

Public Sub tlbSalir_Click()
  Me.Close
End
---código---

En este otro ejemplo.Vamos a usar instrucciones para
trabajar con archivos de texto.Aunque no he tratado el tema aun en el
blog.(Queda pendiente).En este ejemplo tendremos los nombres
de los continentes y añadiremos los países a su continente correspondiente.
La estructura del archivo de texto nos ayuda mucho.Es importante.


---código---
'Es importante conocer la estructura del archivo de texto para poder leerlo
'y distribuir sus datos según nos convenga
'Esto es una manera de hacerlo, naturalmente, podrá haber más. ;-)

'En otro ejemplo, hablaremos del manejo de los archivos de texto


Public Sub Form_Open()



End


Public Sub btnSalir_Click()
  Me.Close
End

Public Sub btnMostrar_Click()
  Dim archivo As File                                                 'Definimos archivo como el tipo archivo o fichero
  Dim linea As String                                                 'Cada linea que leemos del archivo se almacena en linea
  Dim nomcontinente As String                                         'El nombre del continente
  Dim pais As String                                                  'El nombre del país
 
  tvContinentes.Clear                                                 'Borramos el contenido del TreeView por si hacemos click más de una vez en Mostrar
  
  archivo = Open "paises.txt" For Input                               'Abrimos nuestro archivo para lectura.Input,entrada
 
  tvContinentes.Add("Continentes", "Continentes")                     'Creamos el nodo raiz Continentes
  Line Input #archivo, linea                                          'Leemos una linea del arhivo paises.txt.No incluye nada.Podia haber sido borrada en el archivo de texto
  Do While Not Eof(archivo)                                           'Entramos en una secuencia repetitiva que se ejecuta "mientras no llegue al final del archivo" Eof.End of File
    Line Input #archivo, linea
    nomcontinente = Trim(linea)                                       'La linea leída contiene texto,eliminamos sus espacios en ambos lados y asignamos a nomcontinente
    tvContinentes.Add(nomcontinente, nomcontinente,, "Continentes")   'Creo un nodo padre en el nodo raiz

    Line Input #archivo, linea                                        'Una linea vacía, en blanco
    Line Input #archivo, linea
    Do While linea <> "" And Not Eof(archivo)                         'Si la linea contiene texto y no hemos llegado al final del archivo.Ejecutar el bucle
      pais = Trim(linea)
      tvContinentes.Add(pais, pais,, nomcontinente)                    'Agrego un nodo hijo a cada nodo padre
      Line Input #archivo, linea                                       'Leemos la siguiente linea del archivo
    Loop
  Loop
  Close archivo                                                       'Cuando llegamos al final y terminamos de leer el archivo,lo cerramos.
 
  'Cuestión. ¿ Por que hemos usado bucle While y no un For ?. ;-)
   
End

---código---

Como los comentarios son largos se deforman en la pagina.
Aquí tenéis los códigos para poder verlo mejor.

Ejemplo 2

Ejemplo 3



martes, 17 de julio de 2012

Componente TreeView.Ejemplo 1


Este componente es parecido a ListView, cada elemento tiene su clave y añade
la vista en árbol de los elementos. Añade texto y una imagen si queremos,los cuales
podemos seleccionar.

Con la clave, sabremos a que rama en cuestión pertenece el elemento.
Volvemos a usar propiedades como “Item” y “Current”. Estas propiedades
son muy comunes en estos componentes semejantes a listas. Repasar ListView.

En este ejemplo, seleccionamos una opción si es una amistad, cliente o proveedor
y se añade a su rama concreta con el botón. También podemos eliminarlo del TreeView.


---código---
Private numpersona As Integer
Private opcionseleccionada As Integer
Private imagen1 As Picture
Private imagen2 As Picture

Public Sub _new()

End

Public Sub Form_Open()

Me.Title = "Ejemplo con TreeView"
Me.Center

imagen1 = Picture["Alegre.png"]
imagen2 = Picture["Serio.png"]

tvContactos.Add("Contactos", "Contactos") 'Nodo Raíz
tvContactos.Add("Amistades", "Amistades",, "Contactos") 'Nodo Padre
tvContactos.Add("Clientes", "Clientes",, "Contactos") 'Nodo Padre
tvContactos.Add("Proveedores", "Proveedores",, "Contactos") 'Nodo Padre
tvContactos["Contactos"].Expanded = True 'Presentamos el nodo raíz abierto o expandido

numpersona = 1 'Iniciamos el contador de personas en 1

End

Public Sub btnBorrar_Click()
'No queremos borrar el nodo raíz ni tampoco sus nodos padres
If tvContactos.Key <> "Contactos" And tvContactos.Key <> "Amistades" And tvContactos.Key <> "Clientes" And tvContactos.Key <> "Proveedores" Then
tvContactos.Remove(tvContactos.Key)
Else
Message.Info("No se puede eliminar el nodo raíz o padre")
Endif
End

Public Sub Contactos_Click()
opcionseleccionada = Last.tag
End


Public Sub btnSalir_Click()
Me.Close
End

Public Sub btnAdd_Click()
'Según seleccionamos nuestra opción, añadimos un nodo hijo al nodo padre
Select Case opcionseleccionada
Case 0
tvContactos.Add("Persona-" & numpersona, "Persona-" & numpersona, imagen1, "Amistades")
Case 1
tvContactos.Add("Persona-" & numpersona, "Persona-" & numpersona, imagen2, "Clientes")
Case 2
tvContactos.Add("Persona-" & numpersona, "Persona-" & numpersona, imagen2, "Proveedores")
End Select
numpersona += 1 'Aumentamos el número de personas
End

---código---


Nuestra raíz principal, tiene la key o clave “Contactos” con el nombre “Contactos”.
Añadimos el nodo “Amistades”, con nombre “Amistades” a la rama principal “Contactos”.

Hemos usado.

tvContactos.Add("Amistades", "Amistades",, "Contactos") 'Nodo padre
Como no añadimos una imagen, dejamos esa opción vacía en el método .Add.

Y repetimos la misma operación para los nodos “Cliente” y “Proveedores” que son nodos padres. Las opciones de los contactos están formadas por una matriz de controles. Acordaros del ejemplo de la calculadora. Los números formaban parte de un grupo, con un código común para todos los números evitando la repetición del mismo código por cada número.

En este caso, guardamos el valor de “last.tag” en una variable común a todo
el formulario para saber que opción fue seleccionada, (el índice del grupo). 
Para que nuestro botón de añadir, sepa que tipo de contacto debe añadir.

Mas información en:


Aquí tenéis el código del ejemplo 1.