https://foro.gambas-es.org/viewtopic.php?f=1&t=4779
-----------------------------------
v3ctor
Martes, 21 Julio 2015, 23:09

Crear Un Juego A Base De Preguntas Y Respuestas
-----------------------------------
buenas,

bueno parece que buenas ideas no me faltan pero si nivel de programación :(

aparte de hacer una linea de tiempo para facilitar el estudio en el programa VisorRV1960

se me ocurre que hacer un juego a base de preguntas y respuestas con al menos 3 niveles
(seria una forma de aprender divirtiéndose)

para niños, nivel 3
para jovenes, nivel 2
para adultos, nivel 1 

con sistema de puntos, veamos que sale.

en principio seria elegir el nivel

en base al nivel las preguntas que se harán y sus respuestas

tablas de mejor puntaje (ranking)

supongo que tendré que hacer una base de datos exclusiva para el juego, poniendo la pregunta y la respuesta correcta...

hay varios sistemas, uno seria hacer la pregunta y esperar un respuesta correcta sino seria un fallo y sin puntos
otra podría ser la pregunta y poner varias respuestas a elegir

que piensan ustedes?

editado: 
o tal vez hacer categorías, tipo: niños, jóvenes, adultos y dentro de cada categoría niveles que puedan ir del 1 al 5 sigo esquematizando de como seria el funcionamiento.

editado2:
otra idea es poner tiempo limite en los niveles mas altos para darle emoción jajajaj
en el nivel 4 un minuto para responder y en el nivel 5 solo el tiempo para tipear la respuesta jajajaja.

editado3:
hay que crear una tabla con lista de nombres de los jugadores con un password de ingreso.....

editado4:
después de elegir jugador (si no existe el jugador hacer un sistema de ingreso con nombre y contraseña)
y la categoría empieza el juego, se comienza con nivel 1 haciendo 5 preguntas si responde bien pasa a nivel dos siendo las preguntas mas difíciles y mayor cantidad
pasando por ejemplo de 5 a 10 preguntas así sucesivamente.
si no responde las 5 preguntas termina el juego y se anota el puntaje del jugador en la categoría jugada.

la interfaz de comienzo (croquis)

 [img]http://foro.gambas-es.org/files/images/2261/juegovisorrv1960.png[/img]

editado5:
tal vez sea mejor ponerle a los nombres de categoria : muy facil, facil, normal, dificil, muy dificil, experto.

necesitaria tres grupos de tablas, una tabla para los registros de los usuarios(nombre y passwd)
otra tabla para los records, y grupos de tablas para cada categoria con sus niveles, algo asi:

nombres de tablas:
records 
registros

muyfacil1,muyfacil2,muyfacil3 etc
normal1,normal2....etc

los números son el sub nivel dentro del nivel porque cada tabla puede tener hasta miles de preguntas.

en cada tabla de preguntas las celdas podrían ser estas

id   numero              pregunta                                          respuesta
1        1           En que ciudad nació Jesús?                           Nazaret
2        2           Como se llama la madre de Jesús                  María
3         3          Nombres de Cristo                                      Jesús;Hijo del Hombre;Nazareno;Jesucristo  ( varias respuestas correctas ) string[]
cuando hay varias respuestas correctas, creamos el string[] con split y despues recorremos el String[] si la respuesta del usuario coincide con alguna de los items del string[] la respuesta es correcta.

tabla   registro

id    numero     usuario                   contraseña
1         1           Marcelo                  euh08~~sd
2          2          Adriana                  adri55511a


tabla  records

id     nivel    sub nivel    nombre   puntos
1        2            3          Marcelo    320
2        2            2          Adriana     245

editado 6:
cuando se perdería el juego?
si por ejemplo elegimos el nivel 1  habría 10 preguntas en el subnivel 1, 15 en el sub nivel 2 etc

en el primer subnivel 1 si el participante falla en la respuesta 3 veces pierde
y así con los demás pudiendo o no variar el numero de tolerancia a errores según nuestro parecer.

[code linenumbers=false syntax=sql]CREATE TABLE "usuarios" ( "idusuario" integer NOT NULL primary key autoincrement,
"usuario" varchar(32) not null,
"passwd" varchar(16) not null)


CREATE TABLE "ranking" ( "idranking" integer NOT NULL primary key autoincrement,
"nivel" integer not null,
"subnivel" integer not null,
"usuario" varchar(32) not null,
"puntos" integer not null
)

CREATE TABLE "muyfacil1" ( "idmf1" integer NOT NULL primary key autoincrement,
"numero" integer not null,
"pregunta" text not null,
"respuesta" text not null,
"formato" text
)[/code]

importante: en la columna "[b]formato[/b]" daremos una explicación del formato de la respuesta pues algunas pueden ser complejas como dar varios nombres separados por comas o puntos y comas u otras formas complejas de dar la respuesta.

Editado 7:

después de tener mas o menos la interfaz gráfica esquematizada analizamos como continuaremos

[b]primero[/b] sera hacer funcionar la conexion a la base de datos


[code linenumbers=false syntax=gambas]


Public Sub Form_Open()
  Me.Center
  ArmarTabla()
  AbrirConexionJuego()
  CargarUsuarios()
  
End


Public Sub ArmarTabla()
  
  CViewPociones.Columns.Count = 5

  CViewPociones.Columns[0].Title = "Posición"
  CViewPociones.Columns[0].Alignment = 3
  
  CViewPociones.Columns[1].Title = "Categoría"
  CViewPociones.Columns[1].Width = 90
  CViewPociones.Columns[1].Alignment = 3
  
  CViewPociones.Columns[2].Title = "Nivel"
  CViewPociones.Columns[2].Width = 60
  CViewPociones.Columns[2].Alignment = 3
  
  CViewPociones.Columns[3].Title = "Nombre Jugador"
  CViewPociones.Columns[3].Width = 110
  CViewPociones.Columns[3].Alignment = 3
  CViewPociones.Columns[3].Expand = True
  
  CViewPociones.Columns[4].Title = "Puntos"
  CViewPociones.Columns[4].Width = 60
  CViewPociones.Columns[4].Alignment = 3
  
End

Private Sub AbrirConexionJuego()
  
  ConexionJuego = New Connection
  
  ConexionJuego.Type = "sqlite3"
  ConexionJuego.Host = FMain.DirBD
  ConexionJuego.Name = "JuegoRV1960"
  
  Try ConexionJuego.Open
    If Error Then
        Message.Error("El fichero elegido no es una base de datos sqlite")
        Return
    Else
        Print "conexion con exito"
    Endif
  
End

Private Sub CerrarConexionJuego()
  If ConexionJuego = Null Then Return
  ConexionJuego.Close()
  ConexionJuego = Null   
End[/code]


[b]segundo[/b] hacer funcionar la tabla de usuarios:
                          a- cargar usuarios registrados en el combobox
                          b- sistema de ingreso de usuarios nuevos
                          c- sistema de autentificacion de usuarios
 [color=#FF0000]a[/color]
[code linenumbers=false syntax=gambas]Private Sub CargarUsuarios()
  Dim resultado As Result
  
  resultado = ConexionJuego.Exec("select * from 'usuarios'")
  
  cbxUsuarios.Clear

  Do While resultado.Available
    usuarios.Add(resultado!usuario)
    cbxUsuarios.Add(resultado!usuario)
    Print resultado!usuario
    resultado.MoveNext
  Loop

End[/code]

[color=#FF0019]b[/color]
[code linenumbers=false syntax=gambas]
Public Sub btnIngresar_Click()
  
  If txtUsuario.Text = "" Or If Len(txtUsuario.Text) < 3 Then 
    Message.Warning("Nombre de usuario debe tener al menos 3 caracteres!")
    txtUsuario.SetFocus
    Return
  Endif
  If txtpasswd.Text = "" Or If Len(txtpasswd.Text) < 5 Then
    Message.Warning("Ingrese una contraseña con al menos 5 caracteres!")
    txtpasswd.SetFocus
    Return
  Endif
  
  If NombreExiste() = True Then
    Message.Warning("Ya existe el usuario, elija otro nombre!")
    txtUsuario.Clear
    txtUsuario.SetFocus
    Return
    ' Print "el nombre ya existe"
  Else
    Print "ingresar nombre"
    RegistrarUsuario()
    Juego.CargarUsuarios()
  Endif
  
  Me.Close

End

Private Sub RegistrarUsuario()
  Dim resultado As Result
  
  resultado = Juego.ConexionJuego.Exec("insert into usuarios (idusuario,usuario,passwd) values(&1,&2,&3)", Null, txtUsuario.Text, txtpasswd.Text)
    
End


Private Function NombreExiste() As Boolean
  Dim resultado As Result
  
  resultado = Juego.ConexionJuego.Exec("select usuario from 'usuarios'")
  
  Do While resultado.Available
    If Trim$(txtUsuario.Text) = resultado!usuario Then
      Return True
      Break
    Endif
    resultado.MoveNext
  Loop
  
  Return False
  
End[/code]



[color=#F20000]c[/color]
[code linenumbers=false syntax=gambas]Private Sub Autentificacion(nombre As String)
  Dim resultado As Result
  Dim passX As String
  Dim usuarioX As String
  
  resultado = ConexionJuego.Exec("select * from 'usuarios'")
  
  Do While resultado.Available
    If resultado!usuario = nombre Then
      usuarioX = nombre
      Print "contraseña de " & nombre & "=" & resultado!passwd
      Print "contraseña tipeada=" & txtpasswd.Text
      If txtpasswd.Text = resultado!passwd Then 
        identificacion = True
        Break
      Else
        identificacion = False
        Break
      Endif
    Else
      identificacion = False
    Endif
    
    resultado.MoveNext
  Loop
 
End

Public Sub btnComenzar_Click()
  
  If Jugando = False Then 
     If cbxUsuarios.Index = 0 Then
           btnComenzar.Text = "Terminar"
           Jugando = True
      Else
         If txtpasswd.Text = "" Then 
           Message.Error("Ingrese contraseña por favor")
           txtpasswd.SetFocus
           Return
         Endif
         Autentificacion(Trim$(cbxUsuarios.Text))
         If identificacion = False Then
           Message.Error("Contraseña incorrecta, preste atención!")
           txtpasswd.Clear
           txtpasswd.SetFocus
           Return
         Endif
         
         txtpasswd.Clear
         txtRespuesta.Clear
         btnComenzar.Text = "Terminar"
         Jugando = True
         
         txtLJugador.Text = cbxUsuarios.Text
         MostrarPregunta() 
         txtRespuesta.SetFocus
         
      Endif
  Else
    btnComenzar.Text = "Jugar"
    txtLJugador.Text = "Invitado"
    Jugando = False
    
  Endif
  
 
  
End


[/code]



[b]tercero[/b] sera hacer las consultas sql, para hacer un ramdon a la tabla del nivel elegido o en progreso y así mostrar la pregunta
datos que necesito para hacer una pregunta:
1-que categoría eligió el usuario para saber en que tabla buscar (en los radiobutton ya puse en el evento clic así  Categoria="normal" o Categoria="dificil" etc)
2-el nivel dentro de la categoria que empezara en uno y a medida que el usuario pase de nivel se incrementara en uno
3-el numero máximo de preguntas que contiene la tabla (este es el numero que usare con ramdon)

[code linenumbers=false syntax=gambas]Private Sub MostrarPregunta()
  Dim resultado, resultado2, resultado3 As Result
  Dim MaxNum As Integer = 1
  Dim elegida As Integer
   
  resultado = ConexionJuego.Exec("SELECT numero FROM '" & categoria & Nivel & "'")
    
  Do While resultado.Available
      If resultado!numero > MaxNum Then
        MaxNum = resultado!numero
      Endif
      resultado.MoveNext
  Loop

  Randomize
  elegida = Rand(1, MaxNum)
    
  resultado2 = ConexionJuego.Exec("SELECT * FROM '" & categoria & Nivel & "' where numero=" & elegida)
  
  Do While resultado2.Available
    Pregunta = resultado2!pregunta    
    Respuesta = resultado2!respuesta
    resultado2.MoveNext
  Loop
  
  txtLPregunta.Text = Pregunta
    
End

Public Sub btnResponder_Click()

  If Trim$(txtRespuesta.Text) = Respuesta Then 
    Print "acertaste"
    txtRespuesta.Clear
    txtRespuesta.SetFocus
    LCDLPuntos.Text += INCREMENTA5
    MostrarPregunta()
  Else
    Print "No es la respuesta"
    Dec Vidas
  Endif

End


[/code]



cuarto: al finalizar el juego por errores o por llegar al máximo nivel sin perder jajajaj
hacer funcionar la tabla de ranking ya que tenemos los datos para ingresarlos, usuario, categoría, nivel , nombre, puntos.

[color=#FF0000]
Editado 8:[/color]
siguen las preguntas:
como plantear preguntas fáciles y difíciles, como agruparlas o catalogarlas?
formas de añadir dificultades a las respuestas ? tiempo, varias respuestas, que mas podría ser?
como hacer que el juego sea divertido y atractivo? tal vez sonidos, efectos visuales ,equilibrio en colores,  que mas podría ser?

se escuchan todas las sugerencias  :lol:


[color=#FF000C][b]Editado 9:[/b][/color]

 :roll:  imaginemos que la gente usa el juego, crea muchos usuarios con contraseñas, tambien la tabla rankins esta llena de anotaciones.....y viene una nueva version del programa, que remplaza todas las tablas de la version anterior.... :shock:  :shock:  :shock:  :shock: 
se borrarian los usuarios creados y las anotaciones, algo que no sera agradable al usuario  :oops: 
entonces bien como resolvemos esto  :roll: 
se me ocurre hacer una nueva base de datos solo con las tablas usuarios y ranking separadas de las tablas de las preguntas. (actualizando solo la tabla de los versículos y la de preguntas.)
que solo se actualizarían si hay modificaciones sustanciales en la tabla....ufa cuando crees que resolves un problema inmediatamente se plantea otro
esto de programar no es nada fácil.....
sigo en las aventuras de programar y resolver planteos de programación.

mas adelante cuando el juego funcione bien y la base de preguntas tenga mas contenido, encriptare las contraseñas de usuarios con md5 asi nadie podra usar una identidad que no le corresponde aun explorando la base de datos sql, con algun programa como infodatabaseSql  :razz:  ajjajajajaj


-----------------------------------
v3ctor
Miercoles, 22 Julio 2015, 16:09

Re: Crear Un Juego A Base De Preguntas Y Respuestas
-----------------------------------
[img]http://foro.gambas-es.org/files/images/2261/444.png[/img]


-----------------------------------
Shell
Miercoles, 22 Julio 2015, 18:36

Re: Crear Un Juego A Base De Preguntas Y Respuestas
-----------------------------------
Tengo que leerlo con más tiempo. Parece muy interesante. ;-)

Saludos


-----------------------------------
v3ctor
Miercoles, 22 Julio 2015, 19:11

Re: Crear Un Juego A Base De Preguntas Y Respuestas
-----------------------------------
progreso de la interfaz gráfica:

 [img]http://foro.gambas-es.org/files/images/2261/juego3.png[/img] 


por ahora vengo resolviendo cuestiones de estructura, pronto empiezo con la interacción de todos los elementos.


-----------------------------------
v3ctor
Viernes, 24 Julio 2015, 13:13

Re: Crear Un Juego A Base De Preguntas Y Respuestas
-----------------------------------
[code linenumbers=false syntax=gambas]Private Function NombreExiste() As Boolean
  Dim resultado As Result
  
  resultado = Juego.ConexionJuego.Exec("select usuario from 'usuarios'")
  
  Do While resultado.Available
    If Trim$(txtUsuario.Text) = resultado!usuario Then
      Return True
      Break
    Endif
    resultado.MoveNext
  Loop
  
  Return False
  
End[/code]

primera vez que utilizo y comprendo mejor una funcion que devuelve true o false   :oops: 

la llamo desde aquí:

 [code linenumbers=false syntax=gambas]If NombreExiste() = True Then
    Message.Warning("Ya existe el usuario, elija otro nombre!")
    txtUsuario.Clear
    txtUsuario.SetFocus
    Return
    ' Print "el nombre ya existe"[/code]


-----------------------------------
v3ctor
Viernes, 24 Julio 2015, 13:48

Re: Crear Un Juego A Base De Preguntas Y Respuestas
-----------------------------------
[img]http://foro.gambas-es.org/files/images/2261/tt.png[/img]


-----------------------------------
v3ctor
Viernes, 24 Julio 2015, 16:57

Re: Crear Un Juego A Base De Preguntas Y Respuestas
-----------------------------------
[code linenumbers=false syntax=gambas]
Private Sub MostrarPregunta()
  Dim resultado, resultado2, resultado3 As Result
  Dim MaxNum As Integer
  
  Print "SELECT MAX(numero) FROM '" & categoria & Nivel & "'"
  resultado = ConexionJuego.Exec("SELECT MAX(numero) FROM '" & categoria & Nivel & "'")
  
  Do While resultado.Available
'     ??????????????  alguien sabe como obtener el único dato obtenido por MAX(numero)
  Loop
      
  ' Randomize
  ' Rand(0, MaxNum)
  Print "numero maximo es=" & MaxNum
End[/code]


-----------------------------------
jguardon
Viernes, 24 Julio 2015, 20:19

Re: Crear Un Juego A Base De Preguntas Y Respuestas
-----------------------------------
Incluso puedes abreviar más la condición:

[code linenumbers=false syntax=gambas]If NombreExiste() = True Then[/code]

porque NombreExiste al ser una función booleana es lo mismo que si pusieras:

If True Then
...

Así que abreviada sería así:

[code linenumbers=false syntax=gambas]If NombreExiste() Then[/code]

Si por el contrario, queremos comparar con false, invertimos la comparación con Not

[code linenumbers=false syntax=gambas]If Not NombreExiste() Then[/code]

que sería lo mismo que 

If False Then
...


Es un poco una cuestión de estilo, porque resulta más legible y te ahorras unos cuantos caracteres que teclear. Es más natural para la gente de habla inglesa y en mi opinión, algo más elegante.

Nota: Cabe señalar que en los nombres de funciones no podemos olvidar el paréntesis final (aunque no tenga argumentos) para obtener el valor devuelto.

Saludos


-----------------------------------
v3ctor
Lunes, 27 Julio 2015, 00:16

Re: Crear Un Juego A Base De Preguntas Y Respuestas
-----------------------------------
bueno sali del trancazo asi, pues nadie aporto una solución


[code linenumbers=false syntax=gambas]Private Sub MostrarPregunta()
  Dim resultado, resultado2, resultado3 As Result
  Dim MaxNum As Integer = 0
  Dim elegida As Integer
   
  resultado = ConexionJuego.Exec("SELECT numero FROM '" & categoria & Nivel & "'")
    
  Do While resultado.Available
      If resultado!numero > MaxNum Then
        MaxNum = resultado!numero
      Endif
      resultado.MoveNext
  Loop

Print "maxnum=" & MaxNum
  Randomize
  elegida = Rand(0, MaxNum)
  Print "Pregunta elegida es=" & elegida
End[/code]


-----------------------------------
v3ctor
Lunes, 27 Julio 2015, 17:38

Re: Crear Un Juego A Base De Preguntas Y Respuestas
-----------------------------------
progresos logrados...


[youtube]qJCJmVCRZYY[/youtube]


-----------------------------------
v3ctor
Martes, 28 Julio 2015, 23:45

Re: Crear Un Juego A Base De Preguntas Y Respuestas
-----------------------------------
Rutinas para cargar rankings, en la primera insertamos los datos en la tabla,en  la segunda cargamos lo datos de la tabla "ranking" en el columnViev.

[code linenumbers=false syntax=gambas]Public Sub AnotarPuntos()
  Dim respuesta As Result
    
  respuesta = ConexionJuego.Exec("insert into ranking (idranking,categoria,nivel,usuario,puntos) values(&1,&2,&3,&4,&5)", Null, categoria, nivel, txtLJugador.Text, LCDLPuntos.Text)
  CargarRankings()
    
End


Public Sub CargarRankings()
  Dim resultado As Result
  Dim Clave As String
  
  resultado = ConexionJuego.Exec("select * from 'ranking'")
  
  CViewPociones.Clear
  
  Do While resultado.Available
     Clave = resultado["idranking"]
     CViewPociones.add(Clave, Clave)
     CViewPociones[Clave][1] = resultado!categoria
     CViewPociones[Clave][2] = resultado!nivel
     CViewPociones[Clave][3] = resultado!usuario
     CViewPociones[Clave][4] = resultado!puntos
  
     resultado.MoveNext
  
  Loop
  
End
[/code]

 [img]http://foro.gambas-es.org/files/images/2261/puntos33.png[/img]


-----------------------------------
v3ctor
Miercoles, 29 Julio 2015, 02:01

Re: Crear Un Juego A Base De Preguntas Y Respuestas
-----------------------------------
cambio en la rutina para rellenar datos en el columnViev

Cambie la sentencia sql para que ordenara por puntos (orden descendente) y en vez de colocar el idranking, uso un contador, de esa forma logro poner la posiciones según los puntos.


[code linenumbers=false syntax=gambas]Public Sub CargarRankings()
  Dim resultado As Result
  Dim Clave As String
  Dim Lugar As Integer = 1
  
  resultado = ConexionJuego.Exec("select * from 'ranking' ORDER BY puntos desc")
  
  CViewPociones.Clear
  
  Do While resultado.Available

     CViewPociones.add(Lugar, Lugar)
     CViewPociones[Lugar][1] = resultado!puntos
     CViewPociones[Lugar][2] = resultado!usuario
     CViewPociones[Lugar][3] = resultado!categoria
     CViewPociones[Lugar][4] = resultado!nivel
  
     resultado.MoveNext
     Inc Lugar
  Loop
  
End[/code]

 [img]http://foro.gambas-es.org/files/images/2261/777_1438131468_881867.png[/img]


-----------------------------------
v3ctor
Jueves, 30 Julio 2015, 19:01

Re: Crear Un Juego A Base De Preguntas Y Respuestas
-----------------------------------
Buenas,

subí la nueva versión a la granja (0.2.8) contiene el código del juego que ya esta funcionando aceptable mente, falta pulir mucho, llenar la base de datos (ardua tarea)

no se que pasa con sourceforge, esta offline, se ve que tienen quilombo y no han podido arreglarlo  :sad:


-----------------------------------
v3ctor
Jueves, 30 Julio 2015, 19:53

Re: Crear Un Juego A Base De Preguntas Y Respuestas
-----------------------------------
buenas,

pensando en la base de datos de las preguntas con sus respectivas respuestas.

se plantea un gran reto y es catalogar las preguntas por su dificultad, algo muy difícil de hacer bien.....ahora bien he pensado que si pudiera, pues no creo tener la capacidad para programar tal cosa, es... crear un sistema que recopile las preguntas con mas errores al contestar eso me daría el nivel de dificultad de la pregunta según estadísticas.

como recopilar los datos?
sin internet y/o con internet.....

alguien sabe como se podría plantear esto?


-----------------------------------
v3ctor
Viernes, 31 Julio 2015, 15:21

Re: Crear Un Juego A Base De Preguntas Y Respuestas
-----------------------------------
buenas,

Resulta que al instalar la nueva versión el programa sigue usando la base de datos de la versión anterior pues solo hacia una comprobación si la base de datos sql existe, si existe no hace nada y si no existe copia en la carpeta el programa una copia de la base de datos alojada en el propio programa.

el problema se arregla si eliminas la base de datos, ahí el programa la repone y queda actualizada. pero.. el buen programador debe solucionar todo lo que sea posible sin la intervención del usuario, así que tuve que hacer otra comprobación además de si existe o no y es el tamaño de la base de datos que por lo general la anterior es mas pequeña

por lo tanto haciendo una comparación con stat(base de datos).size a las dos base de datos y si hay diferencias eliminar la base y remplazar y de esa manera queda solucionado el tema y la base de datos queda actualizada.

veamos el código.

[code linenumbers=false syntax=gambas] If Not Exist(RutaBD) Then
      ExisteBaseDatos()
  Else
      If Stat(RutaBD).Size <> Stat("BibliaRV1960").Size Then
        ActualizarBDbiblia()
      Endif
  Endif 


Public Sub ExisteBaseDatos()

  If Exist(DirBD) = False Then
     Mkdir DirBD
     Wait 1
  Endif
  
  If Exist(DirBD) = True Then
     application.busy = 1
     Try Copy "BibliaRV1960" To DirBD &/ "BibliaRV1960"
     application.busy = 0
     If Error Then 
          Print Error(Error.Text)
       Return
     Endif
   Endif 
  
End


Public Sub ActualizarBDbiblia()
  
  If Exist(DirBD) = False Then
     Mkdir DirBD
     Wait 1
  Endif
  
  If Exist(RutaBD) = True Then
     Inc Application.Busy
     Shell "rm " & RutaBD
     Wait 0.2
     Copy "BibliaRV1960" To DirBD &/ "BibliaRV1960"
     Dec Application.Busy
  Else
     Inc Application.Busy
     Copy "BibliaRV1960" To DirBD &/ "BibliaRV1960"
     Dec Application.Busy
  Endif
  
End
[/code]


-----------------------------------
v3ctor
Viernes, 31 Julio 2015, 20:16

Re: Crear Un Juego A Base De Preguntas Y Respuestas
-----------------------------------
Segunda vez que uso una función esta vez devuelve un string es una función que traduce palabras.



[code linenumbers=false syntax=gambas]

Public Sub btnComenzar_Click()
  Dim respuestaX As Byte
  
  If Jugando = False Then 
     If cbxUsuarios.Index = 0 Then
        btnComenzar.Text = "Terminar"
        Jugando = True
        PanJuego.Visible = True
        txtpasswd.Clear
        txtRespuesta.Clear
        LabVida.Text = "Vida " & Vidas
        txtLJugador.Text = cbxUsuarios.Text
        LabCatNivel.Text = "Categoría: " & TraducirCategorias(categoria) & " (Nivel " & Nivel & ")" '<--llamamos la función
        OcultarCategorias(True)
        MostrarPregunta() 
        txtRespuesta.SetFocus  
         
      Else
         If txtpasswd.Text = "" Then 
            Message.Error("Ingrese contraseña por favor")
            txtpasswd.SetFocus
            Return
         Endif
         Autentificacion(Trim$(cbxUsuarios.Text))
         If identificacion = False Then
            Message.Error("Contraseña incorrecta, preste atención!")
            txtpasswd.Clear
            txtpasswd.SetFocus
            Return
         Endif
         'DATOS QUE NECESITO PARA MOSTRAR PREGUNTA: CATEGORIA, NIVEL
         txtpasswd.Clear
         txtRespuesta.Clear
         btnComenzar.Text = "Terminar"
         Jugando = True
         LabVida.Text = "Vida " & Vidas
         txtLJugador.Text = cbxUsuarios.Text
         LabCatNivel.Text = "Categoría: " & TraducirCategorias(categoria) & " (Nivel " & Nivel & ")"  '<----- llamamos la función
         OcultarCategorias(True)
         MostrarPregunta() 
         PanJuego.Visible = True
         txtRespuesta.SetFocus
      Endif
  Else
    
    PanJuego.Visible = False
    If txtLJugador.Text <> "Invitado" Then 
       respuestaX = Message.Question("Quiere anotar sus puntos?", "Sí, quiero anotar", "No, no anotar")
       If respuestaX = 1 Then AnotarPuntos()
    Endif
    btnComenzar.Text = "Jugar"
    txtLJugador.Text = "Invitado"
    Jugando = False
    ResetJuegoTerminado
     OcultarCategorias(False)
       
  Endif
  
 
  
End


Public Function TraducirCategorias(texto As String) As String
  Dim TextoCategoria As String
  
  Select Case texto
    Case "muyfacil"
      TextoCategoria = "Muy fácil"
    Case "facil"
      TextoCategoria = "Fácil"
    Case "normal"
      TextoCategoria = "Normal"
  End Select
  
  Return TextoCategoria
  
End[/code]


-----------------------------------
jguardon
Sabado, 01 Agosto 2015, 12:23

Re: Crear Un Juego A Base De Preguntas Y Respuestas
-----------------------------------
Yo utilizo algo mucho más confiable para determinar si la base de datos es la correcta.

En tu base de datos sqlite puedes establecer el valor de Pragma user_version igual a un número entero que te permite determinar la versión de tu base de datos. Luego en tu programa compruebas la versión y si es menor, actualizas o avisas al usuario.

Un sencillo ejemplo:

[code linenumbers=false syntax=gambas]Dim dbVersion as Integer

' para establecer el valor de la versión (numero entero)
' cuando creas las tablas
conexion.Exec("PRAGMA tu_database.user_version = &1;", dbVersion)

' para obtener la versión de la base de datos
dbVersion = conexion.Exec("PRAGMA tu_database.user_version;")[/code]

El uso final puede variar en tu caso, pero esas son las líneas generales.

Este método es mucho más seguro que comparar el tamaño de la bd.

Mucha más información de los pragmas en ésta web: https://www.sqlite.org/pragma.html#pragma_schema_version

Saludos


-----------------------------------
v3ctor
Miercoles, 05 Agosto 2015, 15:12

Re: Crear Un Juego A Base De Preguntas Y Respuestas
-----------------------------------
buenas,

 [code linenumbers=false syntax=gambas]If Not Exist(RutaBD) Then
      ExisteBaseDatos()
  Else
      If Stat(RutaBD).Size < Stat("BibliaRV1960").Size Then
        ' Print "Base Antigua: " & Stat(RutaBD).Size 
        ' Print "Última versión: " & Stat("BibliaRV1960").Size
        Message.Info("Se actualizará la base de datos..." & gb.NewLine & "Base antigua: " & Stat(RutaBD).Size & gb.NewLine & "Última versión: " & Stat("BibliaRV1960").Size)
        ActualizarBDbiblia()
      Endif
  Endif  [/code]

he descubierto que Stat(RutaBD).Size  no es preciso pues agrego algunas letras y la comparación no la detecta  :shock:  :shock:  :shock: 


digamos que termino de llenar la base de datos(a fines del año que viene calculo)

y alguien me avisa por correo que hay una falta de ortografía o algún signo incorrecto. 
pues bien lo corrijo y resulta que el programa no hallara la diferencia. :shock:  :shock:  :shock:  :shock: 

hay alguna forma de que Stat(RutaBD).Size  tenga un formato mas largo para tener mas precisión?   :?:  :?:  :?:    :idea:  :idea:  :idea: 

 :roll: voy a tener que aprender el método que me comentaste  :shock:


-----------------------------------
jguardon
Miercoles, 05 Agosto 2015, 16:15

Re: Crear Un Juego A Base De Preguntas Y Respuestas
-----------------------------------
[quote user="v3ctor" post="27558"]

 :roll: voy a tener que aprender el método que me comentaste  :shock:[/quote]

Sin duda. Es lo más inteligente además de elegante  :lol: 

Saludos


-----------------------------------
v3ctor
Martes, 11 Agosto 2015, 17:50

Re: Crear Un Juego A Base De Preguntas Y Respuestas
-----------------------------------
buenas,

mejore la rutina y ahora si detecta cualquier cambio ya sea un insignificante tilde o letra:

el programa verifica si la base de datos instalada es menor a la original si es así, elimina la vieja e instala la ultima versión.
en caso que tenga la misma cantidad de bytes verifica la fecha de modificación,
si la fecha de modificación es menor a la fecha de modificación de la base de datos de la ultima versión elimina la base de datos vieja e copia la nueva en el directorio de trabajo.

[code linenumbers=false syntax=gambas]If Exist(RutaBD) Then Print "Base Antigua: " & Stat(RutaBD).Size 
      Print "Última versión: " & Stat("BibliaRV1960").Size
   
  If Not Exist(RutaBD) Then
      ExisteBaseDatos()
  Else
      
      If Stat(RutaBD).Size < Stat("BibliaRV1960").Size Then
              Message.Info("Se actualizará la base de datos..." & gb.NewLine & "Base antigua: " & Stat(RutaBD).Size & gb.NewLine & "Última versión: " &   Stat("BibliaRV1960").Size)
        ActualizarBDbiblia()
      Else
         If Stat(RutaBD).Size = Stat("BibliaRV1960").Size Then
           If Stat(RutaBD).LastModified < Stat("BibliaRV1960").LastModified Then
             Message.Info("Se actualizará la base de datos..." & gb.NewLine & "Base antigua: " & Stat(RutaBD).Size & gb.NewLine & "Última versión: " & Stat("BibliaRV1960").Size)
             ActualizarBDbiblia()
           Endif
         Endif
      Endif
  Endif [/code]


-----------------------------------
v3ctor
Martes, 18 Agosto 2015, 20:27

Re: Crear Un Juego A Base De Preguntas Y Respuestas
-----------------------------------
[quote user="jguardon" post="27521"]Yo utilizo algo mucho más confiable para determinar si la base de datos es la correcta.

En tu base de datos sqlite puedes establecer el valor de Pragma user_version igual a un número entero que te permite determinar la versión de tu base de datos. Luego en tu programa compruebas la versión y si es menor, actualizas o avisas al usuario.

Un sencillo ejemplo:

[code linenumbers=false syntax=gambas]Dim dbVersion as Integer

' para establecer el valor de la versión (numero entero)
' cuando creas las tablas
conexion.Exec("PRAGMA tu_database.user_version = &1;", dbVersion)

' para obtener la versión de la base de datos
dbVersion = conexion.Exec("PRAGMA tu_database.user_version;")[/code]

El uso final puede variar en tu caso, pero esas son las líneas generales.

Este método es mucho más seguro que comparar el tamaño de la bd.

Mucha más información de los pragmas en ésta web: https://www.sqlite.org/pragma.html#pragma_schema_version

Saludos[/quote]

estas seguro que funciona porque esto: conexion.Exec("PRAGMA tu_database.user_version;" el resultado de esto es una variable de tipo result
y vos usas dbversion que es de tipo integer?????   :roll:

estoy haciendo pruebas para dar con el código exacto

necesito el código para leer y dejar en una variable el entero que se encuentra en :  user_version


-----------------------------------
v3ctor
Miercoles, 19 Agosto 2015, 16:16

Re: Crear Un Juego A Base De Preguntas Y Respuestas
-----------------------------------
buenas,

mi intención es crear un botón para ingresar numero de versión de la base de datos en la ventana donde esta la información del programa.
pero este botón estará oculto al usuario, pues es solo para el programador para asignar numero de versión de base de datos.
sera un botón y label donde se visualizara la versión de la base de datos.

 [img]http://foro.gambas-es.org/files/images/2261/newversion.png[/img] 

en fin sigo buscando como se hace...  :roll:

si alguien puede hechar luz sobre este tema se los agradezco,
pues es algo básico en base de datos algo que todos deberíamos tener a mano para entender como es.

[b][color=#FF0000]Editado 2:[/color][/b]

desde la consulta sql de gambas funciona esto:

asignar version: PRAGMA user_version=40

leer version: PRAGMA user_version

sin embargo intento asignar por medio de codigo con esto:

[code linenumbers=false syntax=gambas]Public Sub btnInsertarVersion_Click()
Dim NumVersion As Integer

NumVersion = InputBox("Inserte número de nueva versión", "Autentificación")

FMain.Conexion.Exec("PRAGMA user_version=&1", NumVersion)

End[/code]

pero no funciona  :shock:  :roll:  :roll:


-----------------------------------
shordi
Miercoles, 19 Agosto 2015, 16:58

Re: Crear Un Juego A Base De Preguntas Y Respuestas
-----------------------------------
Adjunto tienes un proyecto de ejemplo de cómo se hace.


-----------------------------------
v3ctor
Miercoles, 19 Agosto 2015, 17:27

Re: Crear Un Juego A Base De Preguntas Y Respuestas
-----------------------------------
Excelente sensei !!! muchas gracias.

asi quedo el codigo:


[code linenumbers=false syntax=gambas]Public Sub Form_Open()
     QueVersionBaseDatos()
End

Public Sub QueVersionBaseDatos()
  Dim resultado As Result
  resultado = FMain.Conexion.Exec("pragma user_version")
  txtLDBVersion.Text = "Versión BD:" & resultado!user_version
End

Public Sub btnInsertarVersion_Click()
    Dim resultado As Result
    Dim NumVersion As Integer
    
    resultado = FMain.Conexion.Exec("pragma user_version")
    NumVersion = resultado!user_version + 1
    FMain.Conexion.Exec("pragma user_version = &1", NumVersion)
    QueVersionBaseDatos()

End[/code]


saque todo el código de la conexión pues mi base de datos se conecta al abrir el programa y se desconecta antes de cerrar el programa.

[b]Gracias a jguardon[/b], [b]gracias shordi [/b] :grin: a seguir programando que con gambas es una papa!!  :cool:


-----------------------------------
v3ctor
Martes, 25 Agosto 2015, 23:16

Re: Crear Un Juego A Base De Preguntas Y Respuestas
-----------------------------------
buenas,

bueno mas o menos aprendí lo de pragma que supongo también sirve para funciones.

ahora bien tengo que comparar la base de datos de la carpeta de trabajo del programa con la base de datos del proyecto (que esta en el propio ejecutable internamente, después que esta instalado el programa)

lo único que se me ocurre es copiar la base de datos del proyecto como archivo temporal en algún lado que podría ser user.home,
hacer la comparación, y después eliminar este archivo temporal. algo así  :roll: 

temp puede ayudar creo  :shock: 

que piensan ustedes?


-----------------------------------
shordi
Miercoles, 26 Agosto 2015, 07:54

Re: Crear Un Juego A Base De Preguntas Y Respuestas
-----------------------------------
No entiendo muy bien lo que pretendes hacer con estode las actulizaciones de la BD: 
¿Vas a actualizar la BD cada vez que haya un bug en el programa? 
¿Vas a enviarle al usuario un paquete con la BD actualizada y crear un módulo que las compare? 
¿Vas a colocar en la red la BD actualizada y el usuario se la descargará cuando quiera? 
¿Vas a controlar el número de user_version de la BD cada vez que el usuario la modifique o vas a controlarla sólo tú en tus actualizaciones?
etc. etc.

Si describieses lo que quieres hacer con todo detalle podríamos ayudarte mejor.

Saludos


-----------------------------------
v3ctor
Miercoles, 26 Agosto 2015, 12:29

Re: Crear Un Juego A Base De Preguntas Y Respuestas
-----------------------------------
buenas,

el proceso sera este:

la rutina verifica si existe la base de datos, si no existe hace una copia (parte fácil)
si existe ejecuta un pragma a la base existente y la compara con el resultado de pragma a la base de datos interna del proyecto (que ni idea como se hace)

si es menor , eliminar y hacer una copia, si es igual no hacer nada.

la otra seria poner el numero de versión manual en cada versión nueva que sale.

no se no tengo mucha claridad en este asunto  :roll:


-----------------------------------
v3ctor
Jueves, 27 Agosto 2015, 16:37

Re: Crear Un Juego A Base De Preguntas Y Respuestas
-----------------------------------
buenas,

bueno encontre una solución de novato... pero anda.

[code linenumbers=false syntax=gambas]If Not Exist(RutaBD) Then
      ExisteBaseDatos()
  Else
      Conectar()
      Sobre.QueVersionBaseDatos()
      If VersionDB < 34 Then '  aquí es donde tengo que modificar manualmente en cada versión nueva (el 34)
        Message.Info("Se actualizará la base de datos..." & gb.NewLine & "Base antigua: " & VersionDB & gb.NewLine & "Última versión: " & 34) 'aquí también
        ActualizarBDbiblia()
      Endif
  Endif 


Public Sub QueVersionBaseDatos()
  Dim resultado As Result
  resultado = FMain.Conexion.Exec("pragma user_version")
  FMain.VersionDB = resultado!user_version
  txtLDBVersion.Text = "Versión BD:" & FMain.VersionDB
End[/code]


la versión 0.3.5 tiene la versión 33 la próxima que voy a sacar tendrá la 34
las versiones anteriores que no tienen user_version al consultar da 0 por lo tanto actualizara.

jajaj voy resolviendo a los tortasos, y bueno ser novato no es fácil jajajjaj   :cool:


