Trabajo publicado en www.ilustrados.com La mayor Comunidad de difusión del conocimiento INTRODUCCIÓN Este programa proporciona una manera amena y dinámica de practicar las operaciones matemáticas básicas: suma, resta, multiplicación y división. Está orientado a estudiantes de bachillerato, pues incluye operaciones con varias cifras así como también operaciones con fracciones. Cada juego incluye veinte intentos, o el usuario puede voluntariamente terminar un juego antes de los veinte intentos permitidos. Cuando se haya terminado el juego, el usuario recibirá una calificación, de acuerdo al número de aciertos que haya tenido. La navegación en este programa es muy fácil, y se ofrecen tres niveles: básico, intermedio y avanzado. OBJETIVOS DEL SISTEMA Este programa se propone ofrecer una herramienta amena y dinámica para que los estudiantes que tengan un nivel de bachillerato puedan practicar sus habilidades en cuanto a la suma, resta, multiplicación y división. Se espera que el estudiante tenga papel, lápiz y borrador a la mano, pues los cálculos deberán hacerse en papel y posteriormente escribir la respuesta en el computador. Se requerirá entonces que el estudiante se concientice y realice las operaciones sin hacer uso de ninguna calculadora. El sistema proporciona notas en escala de cero a diez para que el estudiante pueda autoevaluarse y determinar si tiene buenas habilidades en cuanto a las cuatro operaciones básicas que existen en el área de la matemática. Uno de los aspectos interesantes de este programa es que muestra cómo operar fracciones en Visual Basic 2005. Se realiza la simplificación y se operan todas las operaciones de números fraccionarios gracias a la creación de una clase especializada para ello, que se muestra en el código del programa. GUÍA DE USO Al iniciar el programa, se tendrá acceso al menú principal, donde se podrá elegir el nivel en el que se quiere jugar: Para cada uno de los niveles se presentará un menú como el siguiente: A continuación se muestra una pantalla con una sesión de juego donde ya se han hecho dos intentos: Nótese que se pueden agregar ceros a la izquierda y eso no afectará el resultado, pues serán eliminados automáticamente al presionar el botón Multiplicar. Igualmente para el caso de la resta, los ceros a la izquierda después del signo menos serán automáticamente eliminados. No será posible introducir varios signos menos ni tampoco varias plecas para las respuestas en números fraccionarios. El botón Terminar Juego sirve para finalizar el juego antes de haber realizado los veinte intentos. Ahora se muestra un ejemplo de una pantalla de resultados luego de haber finalizado un juego: La ventana acerca del programa se muestra a continuación: Si la cantidad se escribe sin el cero al inicio y con muchos ceros al final, el programa se encargará de agregar el cero inicial y de quitar todos los ceros que sobrepasen a dos cifras significativas, pues las respuestas se deberán dar con dos cifras significativas y aproximando de acuerdo a lo que haya en el tercer número después del punto. Esto para que el estudiante aproxime su respuesta. Igualmente los ceros a la izquierda serán eliminados, así como también los ceros a la derecha después del punto. Para la resta, el programa no permitirá que las respuestas tengan signos menos en una posición que no sea al inicio de la respuesta, ni tampoco se permiten dos signos menos. Si no se escribe ninguna respuesta, el programa presentará el mensaje correspondiente indicando que debe introducirse un valor. Unas impresiones de pantalla para la resta se presentan a continuación: Para el efecto inicial de presentación, en el cual van cambiando imágenes consecutivamente, se usan objetos Timer, uno para cada imagen, que tienen programados tiempos diferentes, por ejemplo el primer Timer con la propiedad Interval en 750, el segundo 1500, el tercero 2250 y así sucesivamente. En cada uno de los Timer se programa qué imagen va a aparecer y qué imagen va a desaparecer, y se desactivan las otras imágenes que no se quiere que aparezcan en un momento determinado. CÓDIGO DEL PROGRAMA FORMULARIO acercade1 Public Class acercade1 Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click Me.Hide() 'Oculta el formulario actual. portada1.Show() 'muestra el formulario "portada1". End Sub End Class FORMULARIO avanzado1 Public Class avanzado1 Protected Overrides Sub OnPaint(ByVal Pintar As PaintEventArgs) Dim Elipse As New Drawing2D.GraphicsPath() Dim Rectangulo As New Rectangle(8, 28, Me.Width - 13, Me.Height - 40) 'La coordenada "x" de la esquina superior izquierda del rectángulo tiene el valor de 7 para que n o se vea el borde izquierdo del formulario. La coordenada "y" de la esquina superior izquierda del rectángulo tiene el valor de 26, con lo cual se logra que no aparezca la barra de título en el formulario. El ancho del rectángulo es "Me.Width - 13" para que no se vea el borde derecho del formulario. El alto del rectángulo es "Me.Height - 31" para que no se vea la línea inferior del borde. Elipse.AddEllipse(Rectangulo) Me.Region = New Region(Elipse) End Sub Private Sub regresar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles menu.Click, menu.Click menu2.Show() 'Llama al formulario "menu2". Me.Hide() 'Oculta el formulario actual. End Sub Private Sub seleccionar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles seleccionar.Click If RadioButtonsuma.Checked = True Then sumaavanzado1.Show() 'Llama al formulario "sumaavanzado1". Me.Hide() 'Oculta el formulario actual. End If If RadioButtonresta.Checked = True Then restaavanzado1.Show() 'Llama al formulario "restaavanzado1". Me.Hide() 'Oculta el formulario actual. End If If RadioButtonmultiplicacion.Checked = True Then multiplicacionavanzado1.Show() 'Llama al formulario "multiplicacionavanzado1". Me.Hide() 'Oculta el formulario actual. End If If RadioButtondivision.Checked = True Then divisionavanzado1.Show() 'Llama al formulario "divisionavanzado1". Me.Hide() 'Oculta el formulario actual. End If If (RadioButtonsuma.Checked = False) And (RadioButtonresta.Checked = False) And (RadioButtonmultiplicacion.Checked = False) And (RadioButtondivision.Checked = False) Then MsgBox("Seleccione la operación matemática que desea realizar", MsgBoxStyle.Exclamation, "Juego de Operaciones Matemáticas para Bachilleres") End If End Sub End Class FORMULARIO basico1 Public Class basico1 Protected Overrides Sub OnPaint(ByVal Pintar As PaintEventArgs) Dim Elipse As New Drawing2D.GraphicsPath() Dim Rectangulo As New Rectangle(8, 28, Me.Width - 13, Me.Height - 40) 'La coordenada "x" de la esquina superior izquierda del rectángulo tiene el valor de 7 para que n o se vea el borde izquierdo del formulario. La coordenada "y" de la esquina superior izquierda del rectángulo tiene el valor de 26, con lo cual se logra que no aparezca la barra de título en el formulario. El ancho del rectángulo es "Me.Width - 13" para que no se vea el borde derecho del formulario. El alto del rectángulo es "Me.Height - 31" para que no se vea la línea inferior del borde. Elipse.AddEllipse(Rectangulo) Me.Region = New Region(Elipse) End Sub Private Sub seleccionar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles seleccionar.Click If RadioButtonsuma.Checked = True Then sumabasico1.Show() 'Llama al formulario "sumabasico1". Me.Hide() 'Oculta el formulario actual. End If If RadioButtonresta.Checked = True Then restabasico1.Show() 'Llama al formulario "restabasico1". Me.Hide() 'Oculta el formulario actual. End If If RadioButtonmultiplicacion.Checked = True Then multiplicacionbasico1.Show() 'Llama al formulario "multiplicacionbasico1". Me.Hide() 'Oculta el formulario actual. End If If RadioButtondivision.Checked = True Then divisionbasico1.Show() 'Llama al formulario "divisionbasico1". Me.Hide() 'Oculta el formulario actual. End If If (RadioButtonsuma.Checked = False) And (RadioButtonresta.Checked = False) And (RadioButtonmultiplicacion.Checked = False) And (RadioButtondivision.Checked = False) Then MsgBox("Seleccione la operación matemática que desea realizar", MsgBoxStyle.Exclamation, "Juego de Operaciones Matemáticas para Bachilleres") End If End Sub Private Sub regresar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles menu.Click, menu.Click menu2.Show() 'Llama al formulario "menu2". Me.Hide() 'Oculta el formulario actual. End Sub End Class FORMULARIO divisionavanzado1 Public Class divisionavanzado1 Protected Overrides Sub OnPaint(ByVal Pintar As PaintEventArgs) Dim Elipse As New Drawing2D.GraphicsPath() Dim Rectangulo As New Rectangle(8, 28, Me.Width - 13, Me.Height - 40) 'La coordenada "x" de la esquina superior izquierda del rectángulo tiene el valor de 7 para que n o se vea el borde izquierdo del formulario. La coordenada "y" de la esquina superior izquierda del rectángulo tiene el valor de 26, con lo cual se logra que no aparezca la barra de título en el formulario. El ancho del rectángulo es "Me.Width - 13" para que no se vea el borde derecho del formulario. El alto del rectángulo es "Me.Height - 31" para que no se vea la línea inferior del borde. Elipse.AddEllipse(Rectangulo) Me.Region = New Region(Elipse) End Sub 'Las siguientes variables deben ser públicas para que vayan almacenando valores y que los pierdan hasta que explícitamente se programe un cambio de valores o cuando se cierre el formulario. Public respuestaaciertos As Integer 'Variable que contabiliza el número de aciertos. Public respuestadesaciertos As Integer 'Variable que contabiliza el número de desaciertos. Private Sub divisionavanzado1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'Al cargar el formulario ya deben aparecer números: numero1.Text = obtenernumerorandom(1, 99) + "/" + obtenernumerorandom(1, 99) 'Imprime un número random entre 1 y 99 contatenado con "+" concatenado con un número random entre 1 y 99, para obtener algo como "34/32", y eso se imprime en el TextBox "numero1". numero2.Text = obtenernumerorandom(1, 99) + "/" + obtenernumerorandom(1, 99) 'Imprime un número random entre 1 y 99 contatenado con "+" concatenado con un número random entre 1 y 99, para obtener algo como "33/32", y eso se imprime en el TextBox "numero2". aciertos.Text = "0" desaciertos.Text = "0" End Sub Private Sub menu1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles menu1.Click Dim mensaje As String mensaje = MsgBox("Regresar al menú cancelará su juego actual. ¿Desea continuar?", MsgBoxStyle.YesNo, "Juego de Operaciones Básicas para Bachilleres") If mensaje = 6 Then menu2.Show() 'Llama al formulario "menu2". Me.Close() 'Cierra el formulario actual. Else 'No hace nada porque no se ha decidido por parte del usuario regresar al menú. End If End Sub Private Sub division1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles division1.Click If respuesta.Text = "" Then 'Si el usuario no ha escrito una respuesta. MsgBox("Escriba la respuesta que considere correcta.", MsgBoxStyle.Exclamation, "Juego de Operaciones Matemáticas para Bachilleres") respuesta.Focus() 'Se ubica el cursor en el cuadro de texto de respuestas para que el usuario escriba su respuesta. Else 'Encontrar el numerador y el denominador del "numero1". Dim longitudcadena1 As Integer = Len(numero1.Text) 'Variable para almacenar la longitud de la cadena que hay en el Textbox "numero1". Dim caracterevaluado1 As String 'Para evaluar caracter por caracter con el Mid(). Dim posicionpleca1 As Integer 'Para determinar el número de la posición en la que se encuentra la pleca dentro de la cadena. Dim numerador1 As String 'Almacena el numerador del Textbox que se está evaluando. Dim denominador1 As String 'Almacena el denominador del Textbox que se está evaluando. Dim banderapleca1 As Integer 'Bandera o marcador que devolverá 1 si se encontró una pleca en la cadena, y 0 en el caso que no se haya encontrado. For ciclo As Integer = 1 To longitudcadena1 'Para evaluar caracter por caracter hasta encontrar una "/". caracterevaluado1 = Mid(numero1.Text, ciclo, 1) If caracterevaluado1 = "/" Then posicionpleca1 = ciclo banderapleca1 = 1 End If Next If banderapleca1 = 1 Then 'En el caso que se haya encontrado una pleca en la cadena, lo que indica que el usuario introdujo un número fraccionario. numerador1 = Mid(numero1.Text, 1, posicionpleca1 - 1) 'El numerador será desde el primer caracter hasta el que está antes de que se digitara la pleca. denominador1 = Mid(numero1.Text, posicionpleca1 + 1, longitudcadena1 posicionpleca1) 'El denominador será desde un caracter después de la pleca, hasta el último caracter de la cadena. Else 'En el caso que no se haya encontrado una pleca en la cadena, lo que indica que el usiario introdujo un número entero. Debido a que no se pueden meter puntos ni espacios ni caracteres especiales debido a la programación del KeyPress, el no encontrar una pleca garantiza que se introdujo un entero. numerador1 = Mid(numero1.Text, 1, longitudcadena1) denominador1 = 1 End If 'Encontrar el numerador y el denominador del "numero2". Dim longitudcadena2 As Integer = Len(numero2.Text) 'Variable para almacenar la longitud de la cadena que hay en el Textbox "numero2". Dim caracterevaluado2 As String 'Para evaluar caracter por caracter con el Mid(). Dim posicionpleca2 As Integer 'Para determinar el número de la posición en la que se encuentra la pleca dentro de la cadena. Dim numerador2 As String 'Almacena el numerador del Textbox que se está evaluando. Dim denominador2 As String 'Almacena el denominador del Textbox que se está evaluando. Dim banderapleca2 As Integer 'Bandera o marcador que devolverá 1 si se encontró una pleca en la cadena, y 0 en el caso que no se haya encontrado. For ciclo As Integer = 1 To longitudcadena2 'Para evaluar caracter por caracter hasta encontrar una "/". caracterevaluado2 = Mid(numero2.Text, ciclo, 1) If caracterevaluado2 = "/" Then posicionpleca2 = ciclo banderapleca2 = 1 End If Next If banderapleca2 = 1 Then 'En el caso que se haya encontrado una pleca en la cadena, lo que indica que el usuario introdujo un número fraccionario. numerador2 = Mid(numero2.Text, 1, posicionpleca2 - 1) 'El numerador será desde el primer caracter hasta el que está antes de que se digitara la pleca. denominador2 = Mid(numero2.Text, posicionpleca2 + 1, longitudcadena2 posicionpleca2) 'El denominador será desde un caracter después de la pleca, hasta el último caracter de la cadena. Else 'En el caso que no se haya encontrado una pleca en la cadena, lo que indica que el usiario introdujo un número entero. Debido a que no se pueden meter puntos ni espacios ni caracteres especiales debido a la programación del KeyPress, el no encontrar una pleca garantiza que se introdujo un entero. numerador2 = Mid(numero2.Text, 1, longitudcadena2) denominador2 = 1 End If 'Convertir los valores de los TextBox a objetos "Fraccion", mediante la clase. Dim fraccion_numero1 As New Fraccion(numerador1, denominador1) 'Convertir los valores de los TextBox a objetos "Fraccion", mediante la clase. Dim fraccion_numero2 As New Fraccion(numerador2, denominador2) Dim fraccion_respuesta As Fraccion 'Variable que almacenará la respuesta. fraccion_respuesta = fraccion_numero1 / fraccion_numero2 TextBoxoculto.Text = fraccion_respuesta.ToString 'La respuesta es de tipo "Fraccion" (la clase creada) y se transforma a tipo "String" para poder imprimirla en un TextBox. 'Condición para quitar el denominador de 1. If Strings.Right(TextBoxoculto.Text, 2) = "/1" Then 'Si el número tiene como divisor 1. TextBoxoculto.Text = Strings.Left(TextBoxoculto.Text, Strings.Len(TextBoxoculto.Text) - 2) 'Con esto se quita el "/1", por ejemplo si fuera "34/1" quedará solamente "34". End If While Mid(respuesta.Text, 1, 2) = "00" Or Mid(respuesta.Text, 1, 2) = "01" Or Mid(respuesta.Text, 1, 2) = "02" Or Mid(respuesta.Text, 1, 2) = "03" Or Mid(respuesta.Text, 1, 2) = "04" Or Mid(respuesta.Text, 1, 2) = "05" Or Mid(respuesta.Text, 1, 2) = "06" Or Mid(respuesta.Text, 1, 2) = "07" Or Mid(respuesta.Text, 1, 2) = "08" Or Mid(respuesta.Text, 1, 2) = "09" 'Para que los ceros a la izquierda se borren. respuesta.Text = Mid(respuesta.Text, 2, Len(respuesta.Text) - 1) End While Dim plecaubicacion As Integer 'Para saber en qué parte de la cadena se encuentra la pleca. For ciclo As Integer = 1 To Len(respuesta.Text) caracterevaluado1 = Mid(respuesta.Text, ciclo, 1) 'Toma el caracter correspondiente, dependiendo de la iteración en la que vaya el ciclo For. If caracterevaluado1 = "/" Then plecaubicacion = ciclo End If Next While Mid(respuesta.Text, plecaubicacion + 1, 2) = "00" Or Mid(respuesta.Text, plecaubicacion + 1, 2) = "01" Or Mid(respuesta.Text, plecaubicacion + 1, 2) = "02" Or Mid(respuesta.Text, plecaubicacion + 1, 2) = "03" Or Mid(respuesta.Text, plecaubicacion + 1, 2) = "04" Or Mid(respuesta.Text, plecaubicacion + 1, 2) = "05" Or Mid(respuesta.Text, plecaubicacion + 1, 2) = "06" Or Mid(respuesta.Text, plecaubicacion + 1, 2) = "07" Or Mid(respuesta.Text, plecaubicacion + 1, 2) = "08" Or Mid(respuesta.Text, plecaubicacion + 1, 2) = "09" 'Para quitar los ceros del denominador. respuesta.Text = Mid(respuesta.Text, 1, plecaubicacion - 1) + "/" + Mid(respuesta.Text, plecaubicacion + 2, Len(respuesta.Text)) 'Para que si el usuario escribe "433/0000432", cambiará a "443/432". End While If (respuesta.Text = TextBoxoculto.Text) Then 'Si la respuesta introducida por el usuario es igual a la respuesta correcta. Dim mensaje As String mensaje = MsgBox("¡Felicidades, su respuesta es correcta!", MsgBoxStyle.OkOnly, "Juego de Operaciones Matemáticas para Bachilleres") If mensaje = 1 Then 'Si el botón presionado es el "Ok" (que es el único que se le va a presentar entonces ese se tiene que presionar). 'Generación de números aleatorios. numero1.Text = obtenernumerorandom(1, 99) + "/" + obtenernumerorandom(1, 99) 'Imprime un número random entre 1 y 99 contatenado con "+" concatenado con un número random entre 1 y 99, para obtener algo como "34/42", y eso se imprime en el TextBox "numero1". numero2.Text = obtenernumerorandom(1, 99) + "/" + obtenernumerorandom(1, 99) 'Imprime un número random entre 1 y 99 contatenado con "+" concatenado con un número random entre 1 y 99, para obtener algo como "34/42", y eso se imprime en el TextBox "numero2". respuesta.Text = "" 'Para borrar la respuesta anterior y que el usuario escriba una nueva respuesta. respuesta.Focus() 'Para que el cursor esté listo y que el usuario escriba su próxima respuesta. End If respuestaaciertos += 1 'Suma un acierto. aciertos.Text = respuestaaciertos 'Imprime el número de aciertos en el TextBox. If respuestaaciertos + respuestadesaciertos = 20 Then resultado1.aciertos1.Text = aciertos.Text 'El número de aciertos se manda a imprimir al TextBox "aciertos1" que está en el formulario "resultado1". resultado1.desaciertos1.Text = desaciertos.Text 'El número de desaciertos se manda a imprimir al TextBox "desaciertos1" que está en el formulario "resultado1". resultado1.notafinal1.Text = 10 / 20 * Val(aciertos.Text) resultado1.Show() 'Mandar a llamar al formulario de resultados. El juego ha terminado. End If Else 'Si la respuesta introducida por el usuario es diferente de la respuesta correcta. Dim mensaje As String mensaje = MsgBox("¡Incorrecto! La respuesta es: " + TextBoxoculto.Text + ".", MsgBoxStyle.OkOnly, "Juego de Operaciones Matemáticas para Bachilleres") If mensaje = 1 Then 'Si el botón presionado es el "Ok" (que es el único que se le va a presentar entonces ese se tiene que presionar). 'Generación de números aleatorios. numero1.Text = obtenernumerorandom(1, 99) + "/" + obtenernumerorandom(1, 99) 'Imprime un número random entre 1 y 99 contatenado con "+" concatenado con un número random entre 1 y 99, para obtener algo como "34/42", y eso se imprime en el TextBox "numero1". numero2.Text = obtenernumerorandom(1, 99) + "/" + obtenernumerorandom(1, 99) 'Imprime un número random entre 1 y 99 contatenado con "+" concatenado con un número random entre 1 y 99, para obtener algo como "34/42", y eso se imprime en el TextBox "numero2". respuesta.Text = "" 'Para borrar la respuesta anterior y que el usuario escriba una nueva respuesta. respuesta.Focus() 'Para que el cursor esté listo y que el usuario escriba su próxima respuesta. End If respuestadesaciertos += 1 'Suma un desacierto. desaciertos.Text = respuestadesaciertos 'Imprime el número de desaciertos en el TextBox. If respuestaaciertos + respuestadesaciertos = 20 Then resultado1.aciertos1.Text = aciertos.Text 'El número de aciertos se manda a imprimir al TextBox "aciertos1" que está en el formulario "resultado1". resultado1.desaciertos1.Text = desaciertos.Text 'El número de desaciertos se manda a imprimir al TextBox "desaciertos1" que está en el formulario "resultado1". resultado1.notafinal1.Text = 10 / 20 * Val(aciertos.Text) resultado1.Show() 'Mandar a llamar al formulario de resultados. El juego ha terminado. Me.Hide() End If End If End If End Sub Private Sub terminar1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles terminar1.Click Dim mensaje As String mensaje = MsgBox("¿Desea realmente terminar este juego?", MsgBoxStyle.YesNo, "Juego de Operaciones Básicas para Bachilleres") If mensaje = 6 Then resultado1.aciertos1.Text = aciertos.Text 'El número de aciertos se manda a imprimir al TextBox "aciertos1" que está en el formulario "resultado1". resultado1.desaciertos1.Text = desaciertos.Text 'El número de desaciertos se manda a imprimir al TextBox "desaciertos1" que está en el formulario "resultado1". resultado1.notafinal1.Text = 10 / (Val(aciertos.Text) + Val(desaciertos.Text)) * Val(aciertos.Text) 'Determinar e imprimir la nota final. resultado1.Show() 'Mandar a llamar al formulario de resultados. El juego ha terminado. End If End Sub Private Sub respuesta_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles respuesta.KeyPress Dim contadorplecas As Integer Dim longitudcadena As Integer = Len(respuesta.Text) 'Variable para almacenar la longitud de la cadena que hay en un Textbox. Dim caracterevaluado As String 'Para evaluar caracter por caracter con el Mid(). For ciclo As Integer = 1 To longitudcadena 'Para evaluar caracter por caracter hasta encontrar una "/". caracterevaluado = Mid(respuesta.Text, ciclo, 1) If caracterevaluado = "/" Then contadorplecas = contadorplecas + 1 End If Next If (Asc(e.KeyChar) >= 47 And Asc(e.KeyChar) <= 57) Or Asc(e.KeyChar) = 8 Then 'Los únicos caracteres que se permitirá introducir en el Textbox serán los números del 0 al 9 (ASCII del 48 al 57); la pleca ("/"), que es el ASCII 47; el signo menos ("-"), y el retroceso de espacio o backspace para borrar texto introducido, que es el ASCII 8. If (Asc(e.KeyChar) = 47) Then 'Si se presione la tecla de la pleca ("/"). If (contadorplecas > 0) Then 'Cuando se pretenda introducir una segunda pleca. e.KeyChar = "" 'Reemplaza la tecla digitada con el valor de nada para que no se puedan introducir caracteres inválidos. End If End If Else e.KeyChar = "" 'Reemplaza la tecla digitada con el valor de nada para que no se puedan introducir caracteres inválidos. End If End Sub End Class FORMULARIO divisionbasico1 Imports System.Math 'Esto se pone porque será necesario usar la función Round(), y si no se pone esta línea no estará disponible esa función, que servirá para programar que se usen solamente dos dígitos significativos (precisión) en las respuestas. Public Class divisionbasico1 Protected Overrides Sub OnPaint(ByVal Pintar As PaintEventArgs) Dim Elipse As New Drawing2D.GraphicsPath() Dim Rectangulo As New Rectangle(8, 28, Me.Width - 13, Me.Height - 40) 'La coordenada "x" de la esquina superior izquierda del rectángulo tiene el valor de 7 para que n o se vea el borde izquierdo del formulario. La coordenada "y" de la esquina superior izquierda del rectángulo tiene el valor de 26, con lo cual se logra que no aparezca la barra de título en el formulario. El ancho del rectángulo es "Me.Width - 13" para que no se vea el borde derecho del formulario. El alto del rectángulo es "Me.Height - 31" para que no se vea la línea inferior del borde. Elipse.AddEllipse(Rectangulo) Me.Region = New Region(Elipse) End Sub 'Las siguientes variables deben ser públicas para que vayan almacenando valores y que los pierdan hasta que explícitamente se programe un cambio de valores o cuando se cierre el formulario. Public respuestaaciertos As Integer 'Variable que contabiliza el número de aciertos. Public respuestadesaciertos As Integer 'Variable que contabiliza el número de desaciertos. Private Sub divisionbasico1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'Al cargar el formulario ya deben aparecer números: numero1.Text = obtenernumerorandom(1, 999) 'Imprime un número random entre 1 y 999 en el TextBox "numero1". numero2.Text = obtenernumerorandom(1, 999) 'Imprime un número random entre 1 y 999 en el TextBox "numero2". aciertos.Text = "0" desaciertos.Text = "0" End Sub Private Sub menu1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles menu1.Click Dim mensaje As String mensaje = MsgBox("Regresar al menú cancelará su juego actual. ¿Desea continuar?", MsgBoxStyle.YesNo, "Juego de Operaciones Básicas para Bachilleres") If mensaje = 6 Then menu2.Show() 'Llama al formulario "menu2". Me.Close() 'Cierra el formulario actual. Else 'No hace nada porque no se ha decidido por parte del usuario regresar al menú. End If End Sub Private Sub terminar1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles terminar1.Click Dim mensaje As String mensaje = MsgBox("¿Desea realmente terminar este juego?", MsgBoxStyle.YesNo, "Juego de Operaciones Básicas para Bachilleres") If mensaje = 6 Then resultado1.aciertos1.Text = aciertos.Text 'El número de aciertos se manda a imprimir al TextBox "aciertos1" que está en el formulario "resultado1". resultado1.desaciertos1.Text = desaciertos.Text 'El número de desaciertos se manda a imprimir al TextBox "desaciertos1" que está en el formulario "resultado1". resultado1.notafinal1.Text = 10 / (Val(aciertos.Text) + Val(desaciertos.Text)) * Val(aciertos.Text) 'Determinar e imprimir la nota final. resultado1.Show() 'Mandar a llamar al formulario de resultados. El juego ha terminado. End If End Sub Private Sub division1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles division1.Click If respuesta.Text = "" Then 'Si el usuario no ha escrito una respuesta. MsgBox("Escriba la respuesta que considere correcta.", MsgBoxStyle.Exclamation, "Juego de Operaciones Matemáticas para Bachilleres") respuesta.Focus() 'Se ubica el cursor en el cuadro de texto de respuestas para que el usuario escriba su respuesta. Else Dim caracterevaluado1 As String Dim existepunto As Boolean = False 'Valdrá 1 si existe un punto en la respuesta y 0 si no existe. Dim puntoubicacion As Integer 'Para saber en qué parte de la cadena se encuentra el punto decimal. For ciclo As Integer = 1 To Len(respuesta.Text) caracterevaluado1 = Mid(respuesta.Text, ciclo, 1) 'Toma el caracter correspondiente, dependiendo de la iteración en la que vaya el ciclo For. If caracterevaluado1 = "." Then puntoubicacion = ciclo existepunto = True End If Next If existepunto = True Then 'Si existe un punto decimal se hacen todas las siguientes evaluaciones. respuesta.Text = Mid(respuesta.Text, 1, puntoubicacion + 2) 'Si se escribió "343.043243" se transformará a "343.04". Cualquier valor se deja con 2 decimales. While Mid(respuesta.Text, 1, 2) = "00" Or Mid(respuesta.Text, 1, 2) = "01" Or Mid(respuesta.Text, 1, 2) = "02" Or Mid(respuesta.Text, 1, 2) = "03" Or Mid(respuesta.Text, 1, 2) = "04" Or Mid(respuesta.Text, 1, 2) = "05" Or Mid(respuesta.Text, 1, 2) = "06" Or Mid(respuesta.Text, 1, 2) = "07" Or Mid(respuesta.Text, 1, 2) = "08" Or Mid(respuesta.Text, 1, 2) = "09" 'Para que los ceros a la izquierda se borren, que solamente se permita un cero antes del punto, si es que se va a escribir un cero. respuesta.Text = Mid(respuesta.Text, 2, Len(respuesta.Text) - 1) End While If Mid(respuesta.Text, 2, 3) = ".00" Then 'Si al final de la respuesta se tiene "2.00", se convertiría en "2". respuesta.Text = Mid(respuesta.Text, 1, 1) End If If Len(respuesta.Text) = 3 And Mid(respuesta.Text, 2, 2) = ".0" Then 'Si la respuesta es "8.0", se convertiría en "8". respuesta.Text = Mid(respuesta.Text, 1, 1) End If If Mid(respuesta.Text, 1, 1) = "." Then 'Si comienza la respuesta con ".", concatenarle "0". Por ejemplo, ".34" lo convertiría en "0.34" respuesta.Text = "0" + respuesta.Text End If If Mid(respuesta.Text, 4, 1) = "0" Then 'Si la respuesta es "1.3" y el usuario escribe "1.30", el sistema se lo cambiaría a "1.3". respuesta.Text = Mid(respuesta.Text, 1, 3) End If If Mid(respuesta.Text, Len(respuesta.Text), 1) = "." Then 'Si al final de la respuesta hay un punto, por ejemplo "93." lo convertiría en "93". respuesta.Text = Mid(respuesta.Text, 1, Len(respuesta.Text) - 1) End If End If TextBoxoculto.Text = Round(Val(numero1.Text) / Val(numero2.Text), 2) 'Se guarda en el TextBox oculto la respuesta correcta. Se usan dos dígitos significativos (precisión). While Mid(respuesta.Text, 1, 2) = "00" Or Mid(respuesta.Text, 1, 2) = "01" Or Mid(respuesta.Text, 1, 2) = "02" Or Mid(respuesta.Text, 1, 2) = "03" Or Mid(respuesta.Text, 1, 2) = "04" Or Mid(respuesta.Text, 1, 2) = "05" Or Mid(respuesta.Text, 1, 2) = "06" Or Mid(respuesta.Text, 1, 2) = "07" Or Mid(respuesta.Text, 1, 2) = "08" Or Mid(respuesta.Text, 1, 2) = "09" 'Para que los ceros a la izquierda se borren. respuesta.Text = Mid(respuesta.Text, 2, Len(respuesta.Text) - 1) End While If (respuesta.Text = TextBoxoculto.Text) Then 'Si la respuesta introducida por el usuario es igual a la respuesta correcta. Dim mensaje As String mensaje = MsgBox("¡Felicidades, su respuesta es correcta!", MsgBoxStyle.OkOnly, "Juego de Operaciones Matemáticas para Bachilleres") If mensaje = 1 Then 'Si el botón presionado es el "Ok" (que es el único que se le va a presentar entonces ese se tiene que presionar). 'Generación de números aleatorios. numero1.Text = obtenernumerorandom(1, 999) 'Imprime un número random entre 1 y 999 en el TextBox "numero1". numero2.Text = obtenernumerorandom(1, 999) 'Imprime un número random entre 1 y 999 en el TextBox "numero2". respuesta.Text = "" 'Para borrar la respuesta anterior y que el usuario escriba una nueva respuesta. respuesta.Focus() 'Para que el cursor esté listo y que el usuario escriba su próxima respuesta. End If respuestaaciertos += 1 'Suma un acierto. aciertos.Text = respuestaaciertos 'Imprime el número de aciertos en el TextBox. If respuestaaciertos + respuestadesaciertos = 20 Then resultado1.aciertos1.Text = aciertos.Text 'El número de aciertos se manda a imprimir al TextBox "aciertos1" que está en el formulario "resultado1". resultado1.desaciertos1.Text = desaciertos.Text 'El número de desaciertos se manda a imprimir al TextBox "desaciertos1" que está en el formulario "resultado1". resultado1.notafinal1.Text = 10 / 20 * Val(aciertos.Text) resultado1.Show() 'Mandar a llamar al formulario de resultados. El juego ha terminado. Me.Close() 'Cierra el formulario actual. End If Else Dim mensaje As String mensaje = MsgBox("¡Incorrecto! La respuesta es: " + TextBoxoculto.Text + ".", MsgBoxStyle.OkOnly, "Juego de Operaciones Matemáticas para Bachilleres") If mensaje = 1 Then 'Si el botón presionado es el "Ok" (que es el único que se le va a presentar entonces ese se tiene que presionar). 'Generación de números aleatorios. numero1.Text = obtenernumerorandom(1, 999) 'Imprime un número random entre 1 y 999 en el TextBox "numero1". numero2.Text = obtenernumerorandom(1, 999) 'Imprime un número random entre 1 y 999 en el TextBox "numero2". respuesta.Text = "" 'Para borrar la respuesta anterior y que el usuario escriba una nueva respuesta. respuesta.Focus() 'Para que el cursor esté listo y que el usuario escriba su próxima respuesta. End If respuestadesaciertos += 1 'Suma un desacierto. desaciertos.Text = respuestadesaciertos 'Imprime el número de desaciertos en el TextBox. If respuestaaciertos + respuestadesaciertos = 20 Then resultado1.aciertos1.Text = aciertos.Text 'El número de aciertos se manda a imprimir al TextBox "aciertos1" que está en el formulario "resultado1". resultado1.desaciertos1.Text = desaciertos.Text 'El número de desaciertos se manda a imprimir al TextBox "desaciertos1" que está en el formulario "resultado1". resultado1.notafinal1.Text = 10 / 20 * Val(aciertos.Text) resultado1.Show() 'Mandar a llamar al formulario de resultados. El juego ha terminado. Me.Close() 'Cierra el formulario actual. End If End If End If End Sub Private Sub respuesta_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles respuesta.KeyPress If (Asc(e.KeyChar) >= 48 And Asc(e.KeyChar) <= 57) Or (Asc(e.KeyChar)) = 8 Then 'Los únicos caracteres que se permiritá introducir en el TextBox serán los números del 0 al 9 (ASCII del 48 al 57) y se permitirá también usar el Backspace (ASCII 8) para borrar. El signo menos (ASCII 45) se evalúa más adelante. 'No se hace nada porque el caracte presionado es válido. Else If (Asc(e.KeyChar)) = 46 Then 'Si se introduce un punto, se evaluará que no haya más de uno. Dim contadorpuntos As Integer 'Para programar que no se permitan varios signos puntos en la respuesta. Dim caracterevaluado As String 'Para evaluar caracter por caracter con el Mid(). Dim longitudcadena As Integer = Len(respuesta.Text) 'Variable para almacenar la longitud de la cadena que hay en el text box "respuesta". For ciclo As Integer = 1 To longitudcadena 'Para evaluar caracter por caracter hasta encontrar un punto. caracterevaluado = Mid(respuesta.Text, ciclo, 1) 'Toma el caracter correspondiente, dependiendo de la iteración en la que vaya el ciclo For. If caracterevaluado = "." Then contadorpuntos += 1 End If Next If contadorpuntos > 0 Then 'Si ya se ha digitado un signo menos. e.KeyChar = "" 'Reemplaza la letra o caracter digitado por un valor vacío, de manera que no se permita la introducción de más de un punto. End If Else 'Si el caracter introducido es inválido. e.KeyChar = "" 'Reemplaza la letra o caracter digitado por un valor vacío, de manera que no se permita la introducción de caracteres inválidos. End If End If End Sub End Class FORMULARIO divisionintermedio1 Imports System.Math 'Esto se pone porque será necesario usar la función Round(), y si no se pone esta línea no estará disponible esa función, que servirá para programar que se usen solamente dos dígitos significativos (precisión) en las respuestas. Public Class divisionintermedio1 Protected Overrides Sub OnPaint(ByVal Pintar As PaintEventArgs) Dim Elipse As New Drawing2D.GraphicsPath() Dim Rectangulo As New Rectangle(8, 28, Me.Width - 13, Me.Height - 40) 'La coordenada "x" de la esquina superior izquierda del rectángulo tiene el valor de 7 para que n o se vea el borde izquierdo del formulario. La coordenada "y" de la esquina superior izquierda del rectángulo tiene el valor de 26, con lo cual se logra que no aparezca la barra de título en el formulario. El ancho del rectángulo es "Me.Width - 13" para que no se vea el borde derecho del formulario. El alto del rectángulo es "Me.Height - 31" para que no se vea la línea inferior del borde. Elipse.AddEllipse(Rectangulo) Me.Region = New Region(Elipse) End Sub 'Las siguientes variables deben ser públicas para que vayan almacenando valores y que los pierdan hasta que explícitamente se programe un cambio de valores o cuando se cierre el formulario. Public respuestaaciertos As Integer 'Variable que contabiliza el número de aciertos. Public respuestadesaciertos As Integer 'Variable que contabiliza el número de desaciertos. Private Sub divisionintermedio1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'Al cargar el formulario ya deben aparecer números: numero1.Text = obtenernumerorandom(100, 999999) 'Imprime un número random entre 100 y 999999 en el TextBox "numero1". numero2.Text = obtenernumerorandom(100, 999999) 'Imprime un número random entre 100 y 999999 en el TextBox "numero2". aciertos.Text = "0" desaciertos.Text = "0" End Sub Private Sub menu1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles menu1.Click Dim mensaje As String mensaje = MsgBox("Regresar al menú cancelará su juego actual. ¿Desea continuar?", MsgBoxStyle.YesNo, "Juego de Operaciones Básicas para Bachilleres") If mensaje = 6 Then menu2.Show() 'Llama al formulario "menu2". Me.Close() 'Cierra el formulario actual. Else 'No hace nada porque no se ha decidido por parte del usuario regresar al menú. End If End Sub Private Sub terminar1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles terminar1.Click Dim mensaje As String mensaje = MsgBox("¿Desea realmente terminar este juego?", MsgBoxStyle.YesNo, "Juego de Operaciones Básicas para Bachilleres") If mensaje = 6 Then resultado1.aciertos1.Text = aciertos.Text 'El número de aciertos se manda a imprimir al TextBox "aciertos1" que está en el formulario "resultado1". resultado1.desaciertos1.Text = desaciertos.Text 'El número de desaciertos se manda a imprimir al TextBox "desaciertos1" que está en el formulario "resultado1". resultado1.notafinal1.Text = 10 / (Val(aciertos.Text) + Val(desaciertos.Text)) * Val(aciertos.Text) 'Determinar e imprimir la nota final. resultado1.Show() 'Mandar a llamar al formulario de resultados. El juego ha terminado. End If End Sub Private Sub division1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles division1.Click If respuesta.Text = "" Then 'Si el usuario no ha escrito una respuesta. MsgBox("Escriba la respuesta que considere correcta.", MsgBoxStyle.Exclamation, "Juego de Operaciones Matemáticas para Bachilleres") respuesta.Focus() 'Se ubica el cursor en el cuadro de texto de respuestas para que el usuario escriba su respuesta. Else Dim caracterevaluado1 As String Dim existepunto As Boolean = False 'Valdrá 1 si existe un punto en la respuesta y 0 si no existe. Dim puntoubicacion As Integer 'Para saber en qué parte de la cadena se encuentra el punto decimal. For ciclo As Integer = 1 To Len(respuesta.Text) caracterevaluado1 = Mid(respuesta.Text, ciclo, 1) 'Toma el caracter correspondiente, dependiendo de la iteración en la que vaya el ciclo For. If caracterevaluado1 = "." Then puntoubicacion = ciclo existepunto = True End If Next If existepunto = True Then 'Si existe un punto decimal se hacen todas las siguientes evaluaciones. respuesta.Text = Mid(respuesta.Text, 1, puntoubicacion + 2) 'Si se escribió "343.043243" se transformará a "343.04". Cualquier valor se deja con 2 decimales. While Mid(respuesta.Text, 1, 2) = "00" Or Mid(respuesta.Text, 1, 2) = "01" Or Mid(respuesta.Text, 1, 2) = "02" Or Mid(respuesta.Text, 1, 2) = "03" Or Mid(respuesta.Text, 1, 2) = "04" Or Mid(respuesta.Text, 1, 2) = "05" Or Mid(respuesta.Text, 1, 2) = "06" Or Mid(respuesta.Text, 1, 2) = "07" Or Mid(respuesta.Text, 1, 2) = "08" Or Mid(respuesta.Text, 1, 2) = "09" 'Para que los ceros a la izquierda se borren, que solamente se permita un cero antes del punto, si es que se va a escribir un cero. respuesta.Text = Mid(respuesta.Text, 2, Len(respuesta.Text) - 1) End While If Mid(respuesta.Text, 2, 3) = ".00" Then 'Si al final de la respuesta se tiene "2.00", se convertiría en "2". respuesta.Text = Mid(respuesta.Text, 1, 1) End If If Len(respuesta.Text) = 3 And Mid(respuesta.Text, 2, 2) = ".0" Then 'Si la respuesta es "8.0", se convertiría en "8". respuesta.Text = Mid(respuesta.Text, 1, 1) End If If Mid(respuesta.Text, 1, 1) = "." Then 'Si comienza la respuesta con ".", concatenarle "0". Por ejemplo, ".34" lo convertiría en "0.34" respuesta.Text = "0" + respuesta.Text End If If Mid(respuesta.Text, 4, 1) = "0" Then 'Si la respuesta es "1.3" y el usuario escribe "1.30", el sistema se lo cambiaría a "1.3". respuesta.Text = Mid(respuesta.Text, 1, 3) End If If Mid(respuesta.Text, Len(respuesta.Text), 1) = "." Then 'Si al final de la respuesta hay un punto, por ejemplo "93." lo convertiría en "93". respuesta.Text = Mid(respuesta.Text, 1, Len(respuesta.Text) - 1) End If End If TextBoxoculto.Text = Round(Val(numero1.Text) / Val(numero2.Text), 2) 'Se guarda en el TextBox oculto la respuesta correcta. Se usan dos dígitos significativos (precisión). While Mid(respuesta.Text, 1, 2) = "00" Or Mid(respuesta.Text, 1, 2) = "01" Or Mid(respuesta.Text, 1, 2) = "02" Or Mid(respuesta.Text, 1, 2) = "03" Or Mid(respuesta.Text, 1, 2) = "04" Or Mid(respuesta.Text, 1, 2) = "05" Or Mid(respuesta.Text, 1, 2) = "06" Or Mid(respuesta.Text, 1, 2) = "07" Or Mid(respuesta.Text, 1, 2) = "08" Or Mid(respuesta.Text, 1, 2) = "09" 'Para que los ceros a la izquierda se borren. respuesta.Text = Mid(respuesta.Text, 2, Len(respuesta.Text) - 1) End While If (respuesta.Text = TextBoxoculto.Text) Then 'Si la respuesta introducida por el usuario es igual a la respuesta correcta. Dim mensaje As String mensaje = MsgBox("¡Felicidades, su respuesta es correcta!", MsgBoxStyle.OkOnly, "Juego de Operaciones Matemáticas para Bachilleres") If mensaje = 1 Then 'Si el botón presionado es el "Ok" (que es el único que se le va a presentar entonces ese se tiene que presionar). 'Generación de números aleatorios. numero1.Text = obtenernumerorandom(100, 999999) 'Imprime un número random entre 100 y 999999 en el TextBox "numero1". numero2.Text = obtenernumerorandom(100, 999999) 'Imprime un número random entre 100 y 999999 en el TextBox "numero2". respuesta.Text = "" 'Para borrar la respuesta anterior y que el usuario escriba una nueva respuesta. respuesta.Focus() 'Para que el cursor esté listo y que el usuario escriba su próxima respuesta. End If respuestaaciertos += 1 'Suma un acierto. aciertos.Text = respuestaaciertos 'Imprime el número de aciertos en el TextBox. If respuestaaciertos + respuestadesaciertos = 20 Then resultado1.aciertos1.Text = aciertos.Text 'El número de aciertos se manda a imprimir al TextBox "aciertos1" que está en el formulario "resultado1". resultado1.desaciertos1.Text = desaciertos.Text 'El número de desaciertos se manda a imprimir al TextBox "desaciertos1" que está en el formulario "resultado1". resultado1.notafinal1.Text = 10 / 20 * Val(aciertos.Text) resultado1.Show() 'Mandar a llamar al formulario de resultados. El juego ha terminado. Me.Close() 'Cierra el formulario actual. End If Else Dim mensaje As String mensaje = MsgBox("¡Incorrecto! La respuesta es: " + TextBoxoculto.Text + ".", MsgBoxStyle.OkOnly, "Juego de Operaciones Matemáticas para Bachilleres") If mensaje = 1 Then 'Si el botón presionado es el "Ok" (que es el único que se le va a presentar entonces ese se tiene que presionar). 'Generación de números aleatorios. numero1.Text = obtenernumerorandom(100, 999999) 'Imprime un número random entre 100 y 999999 en el TextBox "numero1". numero2.Text = obtenernumerorandom(100, 999999) 'Imprime un número random entre 100 y 999999 en el TextBox "numero2". respuesta.Text = "" 'Para borrar la respuesta anterior y que el usuario escriba una nueva respuesta. respuesta.Focus() 'Para que el cursor esté listo y que el usuario escriba su próxima respuesta. End If respuestadesaciertos += 1 'Suma un desacierto. desaciertos.Text = respuestadesaciertos 'Imprime el número de desaciertos en el TextBox. If respuestaaciertos + respuestadesaciertos = 20 Then resultado1.aciertos1.Text = aciertos.Text 'El número de aciertos se manda a imprimir al TextBox "aciertos1" que está en el formulario "resultado1". resultado1.desaciertos1.Text = desaciertos.Text 'El número de desaciertos se manda a imprimir al TextBox "desaciertos1" que está en el formulario "resultado1". resultado1.notafinal1.Text = 10 / 20 * Val(aciertos.Text) resultado1.Show() 'Mandar a llamar al formulario de resultados. El juego ha terminado. Me.Close() 'Cierra el formulario actual. End If End If End If End Sub Private Sub respuesta_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles respuesta.KeyPress If (Asc(e.KeyChar) >= 48 And Asc(e.KeyChar) <= 57) Or (Asc(e.KeyChar)) = 8 Then 'Los únicos caracteres que se permiritá introducir en el TextBox serán los números del 0 al 9 (ASCII del 48 al 57) y se permitirá también usar el Backspace (ASCII 8) para borrar. El signo menos (ASCII 45) se evalúa más adelante. 'No se hace nada porque el caracte presionado es válido. Else If (Asc(e.KeyChar)) = 46 Then 'Si se introduce un punto, se evaluará que no haya más de uno. Dim contadorpuntos As Integer 'Para programar que no se permitan varios signos puntos en la respuesta. Dim caracterevaluado As String 'Para evaluar caracter por caracter con el Mid(). Dim longitudcadena As Integer = Len(respuesta.Text) 'Variable para almacenar la longitud de la cadena que hay en el text box "respuesta". For ciclo As Integer = 1 To longitudcadena 'Para evaluar caracter por caracter hasta encontrar un punto. caracterevaluado = Mid(respuesta.Text, ciclo, 1) 'Toma el caracter correspondiente, dependiendo de la iteración en la que vaya el ciclo For. If caracterevaluado = "." Then contadorpuntos += 1 End If Next If contadorpuntos > 0 Then 'Si ya se ha digitado un signo menos. e.KeyChar = "" 'Reemplaza la letra o caracter digitado por un valor vacío, de manera que no se permita la introducción de más de un punto. End If Else 'Si el caracter introducido es inválido. e.KeyChar = "" 'Reemplaza la letra o caracter digitado por un valor vacío, de manera que no se permita la introducción de caracteres inválidos. End If End If End Sub End Class FORMULARIO Form1 Public Class Form1 Protected Overrides Sub OnPaint(ByVal Pintar As PaintEventArgs) Dim Elipse As New Drawing2D.GraphicsPath() Dim Rectangulo As New Rectangle(8, 28, Me.Width - 13, Me.Height - 40) 'La coordenada "x" de la esquina superior izquierda del rectángulo tiene el valor de 7 para que n o se vea el borde izquierdo del formulario. La coordenada "y" de la esquina superior izquierda del rectángulo tiene el valor de 26, con lo cual se logra que no aparezca la barra de título en el formulario. El ancho del rectángulo es "Me.Width - 13" para que no se vea el borde derecho del formulario. El alto del rectángulo es "Me.Height - 31" para que no se vea la línea inferior del borde. Elipse.AddEllipse(Rectangulo) Me.Region = New Region(Elipse) End Sub Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick suma.Visible = False resta.Visible = True Timer1.Enabled = False 'Para desactivarlo. End Sub Private Sub Timer2_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer2.Tick resta.Visible = False multiplicacion.Visible = True Timer2.Enabled = False 'Para desactivarlo. End Sub Private Sub Timer3_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer3.Tick multiplicacion.Visible = False division.Visible = True Timer3.Enabled = False 'Para desactivarlo. End Sub Private Sub Timer4_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer4.Tick division.Visible = False fraccionmultiplicacion.Visible = True Timer4.Enabled = False 'Para desactivarlo. End Sub Private Sub Timer5_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer5.Tick fraccionmultiplicacion.Visible = False fracciondivision.Visible = True Timer5.Enabled = False 'Para desactivarlo. End Sub Private Sub Timer6_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer6.Tick fracciondivision.Visible = False suma.Visible = True Timer6.Enabled = False 'Para desactivarlo. End Sub Private Sub Timer7_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer7.Tick suma.Visible = False resta.Visible = True Timer7.Enabled = False 'Para desactivarlo. End Sub Private Sub Timer8_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer8.Tick resta.Visible = False multiplicacion.Visible = True Timer8.Enabled = False 'Para desactivarlo. End Sub Private Sub Timer9_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer9.Tick multiplicacion.Visible = False division.Visible = True Timer9.Enabled = False 'Para desactivarlo. End Sub Private Sub Timer10_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer10.Tick division.Visible = False fraccionmultiplicacion.Visible = True Timer10.Enabled = False 'Para desactivarlo. End Sub Private Sub Timer11_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer11.Tick fraccionmultiplicacion.Visible = False fracciondivision.Visible = True Timer11.Enabled = False 'Para desactivarlo. End Sub Private Sub Timer12_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer12.Tick fracciondivision.Visible = False bienvenido.Visible = True AxShockwaveFlash1.Visible = False botonentrar.Visible = True botonentrar.Select() 'Para que automáticamente esté seleccionado el botón "botonentrar" cuando desaparezca la animación y desaparezca también el elemento flash que dice "Cargando...", y que simplemente presionando Enter pueda el usuario entrar al siguiente formulario sin tener que utilizar el mouse. End Sub Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load suma.Visible = True resta.Visible = False multiplicacion.Visible = False division.Visible = False fraccionmultiplicacion.Visible = False fracciondivision.Visible = False bienvenido.Visible = False End Sub Private Sub botonentrar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles botonentrar.Click portada1.Show() 'Llama al formulario "portada". Me.Hide() 'Oculta el formulario actual. portada1.botoncomenzar.Select() 'Para que automáticamente esté seleccionado el botón "botoncomenzar" cuando la persona se vaya al formulario de la portada, de manera que simplemente presionando Enter pueda el usuario entrar al siguiente formulario sin tener que utilizar el mouse. Se le pone "portada." al inicio porque se está invocando o haciendo referencia a un objeto de un formulario externo, entonces primero se especifica el formulario en el que se encuentra el objeto y luego el objeto en sí. End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) resultado1.Show() 'Llama al formulario "resultado1". Me.Hide() 'Oculta el formulario actual. End Sub Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) portada1.Show() 'Llama al formulario "portada". Me.Hide() 'Oculta el formulario actual. End Sub End Class MÓDULO fracción Public Structure Fraccion 'Pudo haber sido también "Public Class Fraccion" y los resultados hubiesen sido los mismos. ' Las dos partes de una fracción. Public Denominador As Integer Public Numerador As Integer Public Sub New(ByVal numerador As Integer, ByVal denominador As Integer) Me.Numerador = numerador Me.Denominador = denominador End Sub Public Shared Operator +(ByVal x As Fraccion, ByVal y As Fraccion) _ As Fraccion Return Normalizar(x.Numerador * y.Denominador + _ y.Numerador * x.Denominador, x.Denominador * y.Denominador) End Operator Public Shared Operator -(ByVal x As Fraccion, ByVal y As Fraccion) _ As Fraccion Return Normalizar(x.Numerador * y.Denominador - _ y.Numerador * x.Denominador, x.Denominador * y.Denominador) End Operator Public Shared Operator *(ByVal x As Fraccion, ByVal y As Fraccion) _ As Fraccion Return Normalizar(x.Numerador * y.Numerador, _ x.Denominador * y.Denominador) End Operator Public Shared Operator /(ByVal x As Fraccion, ByVal y As Fraccion) _ As Fraccion Return Normalizar(x.Numerador * y.Denominador, _ x.Denominador * y.Numerador) End Operator ' Reducir a fracción. Private Shared Function Normalizar(ByVal numerador As Integer, _ ByVal denominador As Integer) As Fraccion If (numerador <> 0) And (denominador <> 0) Then ' Arreglar los signos. If denominador < 0 Then denominador *= -1 numerador *= -1 End If Dim divisor As Integer = MCD(numerador, denominador) numerador \= divisor denominador \= divisor End If Return New Fraccion(numerador, denominador) End Function ' Retorna el máximo común divisor usando el algoritmo de Euclides. Private Shared Function MCD(ByVal x As Integer, ByVal y As Integer) _ As Integer Dim temp As Integer x = Math.Abs(x) y = Math.Abs(y) Do While (y <> 0) temp = x Mod y x = y y = temp Loop Return x End Function ' Convierte la fracción a la forma decimal. Public Function ObtenerDouble() As Double Return CType(Me.Numerador, Double) / _ CType(Me.Denominador, Double) End Function ' Obtener una cadena que represente a la fracción. Public Overrides Function ToString() As String Return Me.Numerador.ToString & "/" & Me.Denominador.ToString End Function End Structure 'Aquí hubiese sido "End Class" si se hubiera usado "Public Class Fraction" en vez de "Public Structure Fraction" FORMULARIO intermedio1 Public Class intermedio1 Protected Overrides Sub OnPaint(ByVal Pintar As PaintEventArgs) Dim Elipse As New Drawing2D.GraphicsPath() Dim Rectangulo As New Rectangle(8, 28, Me.Width - 13, Me.Height - 40) 'La coordenada "x" de la esquina superior izquierda del rectángulo tiene el valor de 7 para que n o se vea el borde izquierdo del formulario. La coordenada "y" de la esquina superior izquierda del rectángulo tiene el valor de 26, con lo cual se logra que no aparezca la barra de título en el formulario. El ancho del rectángulo es "Me.Width - 13" para que no se vea el borde derecho del formulario. El alto del rectángulo es "Me.Height - 31" para que no se vea la línea inferior del borde. Elipse.AddEllipse(Rectangulo) Me.Region = New Region(Elipse) End Sub Private Sub regresar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles menu.Click, menu.Click menu2.Show() 'Llama al formulario "menu2". Me.Hide() 'Oculta el formulario actual. End Sub Private Sub seleccionar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles seleccionar.Click If RadioButtonsuma.Checked = True Then sumaintermedio1.Show() 'Llama al formulario "sumaintermedio1". Me.Hide() 'Oculta el formulario actual. End If If RadioButtonresta.Checked = True Then restaintermedio1.Show() 'Llama al formulario "restaintermedio1". Me.Hide() 'Oculta el formulario actual. End If If RadioButtonmultiplicacion.Checked = True Then multiplicacionintermedio1.Show() 'Llama al formulario "multiplicacionintermedio1". Me.Hide() 'Oculta el formulario actual. End If If RadioButtondivision.Checked = True Then divisionintermedio1.Show() 'Llama al formulario "divisionintermedio1". Me.Hide() 'Oculta el formulario actual. End If If (RadioButtonsuma.Checked = False) And (RadioButtonresta.Checked = False) And (RadioButtonmultiplicacion.Checked = False) And (RadioButtondivision.Checked = False) Then MsgBox("Seleccione la operación matemática que desea realizar", MsgBoxStyle.Exclamation, "Juego de Operaciones Matemáticas para Bachilleres") End If End Sub End Class FORMULARIO menu2 Public Class menu2 Protected Overrides Sub OnPaint(ByVal Pintar As PaintEventArgs) Dim Elipse As New Drawing2D.GraphicsPath() Dim Rectangulo As New Rectangle(8, 28, Me.Width - 13, Me.Height - 40) 'La coordenada "x" de la esquina superior izquierda del rectángulo tiene el valor de 7 para que n o se vea el borde izquierdo del formulario. La coordenada "y" de la esquina superior izquierda del rectángulo tiene el valor de 26, con lo cual se logra que no aparezca la barra de título en el formulario. El ancho del rectángulo es "Me.Width - 13" para que no se vea el borde derecho del formulario. El alto del rectángulo es "Me.Height - 31" para que no se vea la línea inferior del borde. Elipse.AddEllipse(Rectangulo) Me.Region = New Region(Elipse) End Sub Private Sub portada_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles portada.Click portada1.Show() 'Llama al formulario "portada". Me.Hide() 'Oculta el formulario actual. portada1.botoncomenzar.Select() 'Para que automáticamente esté seleccionado el botón "botoncomenzar" cuando la persona se vaya al formulario de la portada, de manera que simplemente presionando Enter pueda el usuario entrar al siguiente formulario sin tener que utilizar el mouse. Se le pone "portada." al inicio porque se está invocando o haciendo referencia a un objeto de un formulario externo, entonces primero se especifica el formulario en el que se encuentra el objeto y luego el objeto en sí. End Sub Private Sub basico_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles basico.Click basico1.Show() 'Llama al formulario "basico1". Me.Hide() 'Oculta el formulario actual. End Sub Private Sub intermedio_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles intermedio.Click intermedio1.Show() 'Llama al formulario "intermedio1". Me.Hide() 'Oculta el formulario actual. End Sub Private Sub avanzado_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles avanzado.Click avanzado1.Show() 'Llama al formulario "basico1". Me.Hide() 'Oculta el formulario actual. End Sub Private Sub salir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles salir.Click Dim mensaje As String mensaje = MsgBox("¿Desea realmente salir del programa?", MsgBoxStyle.YesNo, "Juego de Operaciones Básicas para Bachilleres") If mensaje = 6 Then End End If End Sub End Class MÓDULO Module1 Module Module1 Public Function obtenernumerorandom(ByVal numerominimo As Integer, ByVal numeromaximo As Integer) As String 'Cuando el formulario "sumabasico1" carga: Randomize() 'Fijar la semilla aleatoria para usarla con la función Rnd(). 'La función Rnd() devuelve un número random menor que 1 pero mayor que 0. 'La siguiente línea de código devuelve un valor random entre el "numerominimo" y el "numeromaximo" que son pasados como argumentos de esta función. obtenernumerorandom = CInt(Int((numeromaximo - numerominimo + 1) * Rnd() + numerominimo)) End Function End Module FORMULARIO multiplicacionavanzado1 Public Class multiplicacionavanzado1 Protected Overrides Sub OnPaint(ByVal Pintar As PaintEventArgs) Dim Elipse As New Drawing2D.GraphicsPath() Dim Rectangulo As New Rectangle(8, 28, Me.Width - 13, Me.Height - 40) 'La coordenada "x" de la esquina superior izquierda del rectángulo tiene el valor de 7 para que n o se vea el borde izquierdo del formulario. La coordenada "y" de la esquina superior izquierda del rectángulo tiene el valor de 26, con lo cual se logra que no aparezca la barra de título en el formulario. El ancho del rectángulo es "Me.Width - 13" para que no se vea el borde derecho del formulario. El alto del rectángulo es "Me.Height - 31" para que no se vea la línea inferior del borde. Elipse.AddEllipse(Rectangulo) Me.Region = New Region(Elipse) End Sub 'Las siguientes variables deben ser públicas para que vayan almacenando valores y que los pierdan hasta que explícitamente se programe un cambio de valores o cuando se cierre el formulario. Public respuestaaciertos As Integer 'Variable que contabiliza el número de aciertos. Public respuestadesaciertos As Integer 'Variable que contabiliza el número de desaciertos. Private Sub multiplicacionavanzado1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'Al cargar el formulario ya deben aparecer números: numero1.Text = obtenernumerorandom(1, 99) + "/" + obtenernumerorandom(1, 99) 'Imprime un número random entre 1 y 99 contatenado con "+" concatenado con un número random entre 1 y 99, para obtener algo como "34/32", y eso se imprime en el TextBox "numero1". numero2.Text = obtenernumerorandom(1, 99) + "/" + obtenernumerorandom(1, 99) 'Imprime un número random entre 1 y 99 contatenado con "+" concatenado con un número random entre 1 y 99, para obtener algo como "33/32", y eso se imprime en el TextBox "numero2". aciertos.Text = "0" desaciertos.Text = "0" End Sub Private Sub menu1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles menu1.Click Dim mensaje As String mensaje = MsgBox("Regresar al menú cancelará su juego actual. ¿Desea continuar?", MsgBoxStyle.YesNo, "Juego de Operaciones Básicas para Bachilleres") If mensaje = 6 Then menu2.Show() 'Llama al formulario "menu2". Me.Close() 'Cierra el formulario actual. Else 'No hace nada porque no se ha decidido por parte del usuario regresar al menú. End If End Sub Private Sub multiplicacion1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles multiplicacion1.Click If respuesta.Text = "" Then 'Si el usuario no ha escrito una respuesta. MsgBox("Escriba la respuesta que considere correcta.", MsgBoxStyle.Exclamation, "Juego de Operaciones Matemáticas para Bachilleres") respuesta.Focus() 'Se ubica el cursor en el cuadro de texto de respuestas para que el usuario escriba su respuesta. Else 'Encontrar el numerador y el denominador del "numero1". Dim longitudcadena1 As Integer = Len(numero1.Text) 'Variable para almacenar la longitud de la cadena que hay en el Textbox "numero1". Dim caracterevaluado1 As String 'Para evaluar caracter por caracter con el Mid(). Dim posicionpleca1 As Integer 'Para determinar el número de la posición en la que se encuentra la pleca dentro de la cadena. Dim numerador1 As String 'Almacena el numerador del Textbox que se está evaluando. Dim denominador1 As String 'Almacena el denominador del Textbox que se está evaluando. Dim banderapleca1 As Integer 'Bandera o marcador que devolverá 1 si se encontró una pleca en la cadena, y 0 en el caso que no se haya encontrado. For ciclo As Integer = 1 To longitudcadena1 'Para evaluar caracter por caracter hasta encontrar una "/". caracterevaluado1 = Mid(numero1.Text, ciclo, 1) If caracterevaluado1 = "/" Then posicionpleca1 = ciclo banderapleca1 = 1 End If Next If banderapleca1 = 1 Then 'En el caso que se haya encontrado una pleca en la cadena, lo que indica que el usuario introdujo un número fraccionario. numerador1 = Mid(numero1.Text, 1, posicionpleca1 - 1) 'El numerador será desde el primer caracter hasta el que está antes de que se digitara la pleca. denominador1 = Mid(numero1.Text, posicionpleca1 + 1, longitudcadena1 posicionpleca1) 'El denominador será desde un caracter después de la pleca, hasta el último caracter de la cadena. Else 'En el caso que no se haya encontrado una pleca en la cadena, lo que indica que el usiario introdujo un número entero. Debido a que no se pueden meter puntos ni espacios ni caracteres especiales debido a la programación del KeyPress, el no encontrar una pleca garantiza que se introdujo un entero. numerador1 = Mid(numero1.Text, 1, longitudcadena1) denominador1 = 1 End If 'Encontrar el numerador y el denominador del "numero2". Dim longitudcadena2 As Integer = Len(numero2.Text) 'Variable para almacenar la longitud de la cadena que hay en el Textbox "numero2". Dim caracterevaluado2 As String 'Para evaluar caracter por caracter con el Mid(). Dim posicionpleca2 As Integer 'Para determinar el número de la posición en la que se encuentra la pleca dentro de la cadena. Dim numerador2 As String 'Almacena el numerador del Textbox que se está evaluando. Dim denominador2 As String 'Almacena el denominador del Textbox que se está evaluando. Dim banderapleca2 As Integer 'Bandera o marcador que devolverá 1 si se encontró una pleca en la cadena, y 0 en el caso que no se haya encontrado. For ciclo As Integer = 1 To longitudcadena2 'Para evaluar caracter por caracter hasta encontrar una "/". caracterevaluado2 = Mid(numero2.Text, ciclo, 1) If caracterevaluado2 = "/" Then posicionpleca2 = ciclo banderapleca2 = 1 End If Next If banderapleca2 = 1 Then 'En el caso que se haya encontrado una pleca en la cadena, lo que indica que el usuario introdujo un número fraccionario. numerador2 = Mid(numero2.Text, 1, posicionpleca2 - 1) 'El numerador será desde el primer caracter hasta el que está antes de que se digitara la pleca. denominador2 = Mid(numero2.Text, posicionpleca2 + 1, longitudcadena2 posicionpleca2) 'El denominador será desde un caracter después de la pleca, hasta el último caracter de la cadena. Else 'En el caso que no se haya encontrado una pleca en la cadena, lo que indica que el usiario introdujo un número entero. Debido a que no se pueden meter puntos ni espacios ni caracteres especiales debido a la programación del KeyPress, el no encontrar una pleca garantiza que se introdujo un entero. numerador2 = Mid(numero2.Text, 1, longitudcadena2) denominador2 = 1 End If 'Convertir los valores de los TextBox a objetos "Fraccion", mediante la clase. Dim fraccion_numero1 As New Fraccion(numerador1, denominador1) 'Convertir los valores de los TextBox a objetos "Fraccion", mediante la clase. Dim fraccion_numero2 As New Fraccion(numerador2, denominador2) Dim fraccion_respuesta As Fraccion 'Variable que almacenará la respuesta. fraccion_respuesta = fraccion_numero1 * fraccion_numero2 TextBoxoculto.Text = fraccion_respuesta.ToString 'La respuesta es de tipo "Fraccion" (la clase creada) y se transforma a tipo "String" para poder imprimirla en un TextBox. 'Condición para quitar el denominador de 1. If Strings.Right(TextBoxoculto.Text, 2) = "/1" Then 'Si el número tiene como divisor 1. TextBoxoculto.Text = Strings.Left(TextBoxoculto.Text, Strings.Len(TextBoxoculto.Text) - 2) 'Con esto se quita el "/1", por ejemplo si fuera "34/1" quedará solamente "34". End If While Mid(respuesta.Text, 1, 2) = "00" Or Mid(respuesta.Text, 1, 2) = "01" Or Mid(respuesta.Text, 1, 2) = "02" Or Mid(respuesta.Text, 1, 2) = "03" Or Mid(respuesta.Text, 1, 2) = "04" Or Mid(respuesta.Text, 1, 2) = "05" Or Mid(respuesta.Text, 1, 2) = "06" Or Mid(respuesta.Text, 1, 2) = "07" Or Mid(respuesta.Text, 1, 2) = "08" Or Mid(respuesta.Text, 1, 2) = "09" 'Para que los ceros a la izquierda se borren. respuesta.Text = Mid(respuesta.Text, 2, Len(respuesta.Text) - 1) End While Dim plecaubicacion As Integer 'Para saber en qué parte de la cadena se encuentra la pleca. For ciclo As Integer = 1 To Len(respuesta.Text) caracterevaluado1 = Mid(respuesta.Text, ciclo, 1) 'Toma el caracter correspondiente, dependiendo de la iteración en la que vaya el ciclo For. If caracterevaluado1 = "/" Then plecaubicacion = ciclo End If Next While Mid(respuesta.Text, plecaubicacion + 1, 2) = "00" Or Mid(respuesta.Text, plecaubicacion + 1, 2) = "01" Or Mid(respuesta.Text, plecaubicacion + 1, 2) = "02" Or Mid(respuesta.Text, plecaubicacion + 1, 2) = "03" Or Mid(respuesta.Text, plecaubicacion + 1, 2) = "04" Or Mid(respuesta.Text, plecaubicacion + 1, 2) = "05" Or Mid(respuesta.Text, plecaubicacion + 1, 2) = "06" Or Mid(respuesta.Text, plecaubicacion + 1, 2) = "07" Or Mid(respuesta.Text, plecaubicacion + 1, 2) = "08" Or Mid(respuesta.Text, plecaubicacion + 1, 2) = "09" 'Para quitar los ceros del denominador. respuesta.Text = Mid(respuesta.Text, 1, plecaubicacion - 1) + "/" + Mid(respuesta.Text, plecaubicacion + 2, Len(respuesta.Text)) 'Para que si el usuario escribe "433/0000432", cambiará a "443/432". End While If (respuesta.Text = TextBoxoculto.Text) Then 'Si la respuesta introducida por el usuario es igual a la respuesta correcta. Dim mensaje As String mensaje = MsgBox("¡Felicidades, su respuesta es correcta!", MsgBoxStyle.OkOnly, "Juego de Operaciones Matemáticas para Bachilleres") If mensaje = 1 Then 'Si el botón presionado es el "Ok" (que es el único que se le va a presentar entonces ese se tiene que presionar). 'Generación de números aleatorios. numero1.Text = obtenernumerorandom(1, 99) + "/" + obtenernumerorandom(1, 99) 'Imprime un número random entre 1 y 99 contatenado con "+" concatenado con un número random entre 1 y 99, para obtener algo como "34/42", y eso se imprime en el TextBox "numero1". numero2.Text = obtenernumerorandom(1, 99) + "/" + obtenernumerorandom(1, 99) 'Imprime un número random entre 1 y 99 contatenado con "+" concatenado con un número random entre 1 y 99, para obtener algo como "34/42", y eso se imprime en el TextBox "numero2". respuesta.Text = "" 'Para borrar la respuesta anterior y que el usuario escriba una nueva respuesta. respuesta.Focus() 'Para que el cursor esté listo y que el usuario escriba su próxima respuesta. End If respuestaaciertos += 1 'Suma un acierto. aciertos.Text = respuestaaciertos 'Imprime el número de aciertos en el TextBox. If respuestaaciertos + respuestadesaciertos = 20 Then resultado1.aciertos1.Text = aciertos.Text 'El número de aciertos se manda a imprimir al TextBox "aciertos1" que está en el formulario "resultado1". resultado1.desaciertos1.Text = desaciertos.Text 'El número de desaciertos se manda a imprimir al TextBox "desaciertos1" que está en el formulario "resultado1". resultado1.notafinal1.Text = 10 / 20 * Val(aciertos.Text) resultado1.Show() 'Mandar a llamar al formulario de resultados. El juego ha terminado. End If Else 'Si la respuesta introducida por el usuario es diferente de la respuesta correcta. Dim mensaje As String mensaje = MsgBox("¡Incorrecto! La respuesta es: " + TextBoxoculto.Text + ".", MsgBoxStyle.OkOnly, "Juego de Operaciones Matemáticas para Bachilleres") If mensaje = 1 Then 'Si el botón presionado es el "Ok" (que es el único que se le va a presentar entonces ese se tiene que presionar). 'Generación de números aleatorios. numero1.Text = obtenernumerorandom(1, 99) + "/" + obtenernumerorandom(1, 99) 'Imprime un número random entre 1 y 99 contatenado con "+" concatenado con un número random entre 1 y 99, para obtener algo como "34/42", y eso se imprime en el TextBox "numero1". numero2.Text = obtenernumerorandom(1, 99) + "/" + obtenernumerorandom(1, 99) 'Imprime un número random entre 1 y 99 contatenado con "+" concatenado con un número random entre 1 y 99, para obtener algo como "34/42", y eso se imprime en el TextBox "numero2". respuesta.Text = "" 'Para borrar la respuesta anterior y que el usuario escriba una nueva respuesta. respuesta.Focus() 'Para que el cursor esté listo y que el usuario escriba su próxima respuesta. End If respuestadesaciertos += 1 'Suma un desacierto. desaciertos.Text = respuestadesaciertos 'Imprime el número de desaciertos en el TextBox. If respuestaaciertos + respuestadesaciertos = 20 Then resultado1.aciertos1.Text = aciertos.Text 'El número de aciertos se manda a imprimir al TextBox "aciertos1" que está en el formulario "resultado1". resultado1.desaciertos1.Text = desaciertos.Text 'El número de desaciertos se manda a imprimir al TextBox "desaciertos1" que está en el formulario "resultado1". resultado1.notafinal1.Text = 10 / 20 * Val(aciertos.Text) resultado1.Show() 'Mandar a llamar al formulario de resultados. El juego ha terminado. Me.Hide() End If End If End If End Sub Private Sub terminar1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles terminar1.Click Dim mensaje As String mensaje = MsgBox("¿Desea realmente terminar este juego?", MsgBoxStyle.YesNo, "Juego de Operaciones Básicas para Bachilleres") If mensaje = 6 Then resultado1.aciertos1.Text = aciertos.Text 'El número de aciertos se manda a imprimir al TextBox "aciertos1" que está en el formulario "resultado1". resultado1.desaciertos1.Text = desaciertos.Text 'El número de desaciertos se manda a imprimir al TextBox "desaciertos1" que está en el formulario "resultado1". resultado1.notafinal1.Text = 10 / (Val(aciertos.Text) + Val(desaciertos.Text)) * Val(aciertos.Text) 'Determinar e imprimir la nota final. resultado1.Show() 'Mandar a llamar al formulario de resultados. El juego ha terminado. End If End Sub Private Sub respuesta_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles respuesta.KeyPress Dim contadorplecas As Integer Dim longitudcadena As Integer = Len(respuesta.Text) 'Variable para almacenar la longitud de la cadena que hay en un Textbox. Dim caracterevaluado As String 'Para evaluar caracter por caracter con el Mid(). For ciclo As Integer = 1 To longitudcadena 'Para evaluar caracter por caracter hasta encontrar una "/". caracterevaluado = Mid(respuesta.Text, ciclo, 1) If caracterevaluado = "/" Then contadorplecas = contadorplecas + 1 End If Next If (Asc(e.KeyChar) >= 47 And Asc(e.KeyChar) <= 57) Or Asc(e.KeyChar) = 8 Then 'Los únicos caracteres que se permitirá introducir en el Textbox serán los números del 0 al 9 (ASCII del 48 al 57); la pleca ("/"), que es el ASCII 47; el signo menos ("-"), y el retroceso de espacio o backspace para borrar texto introducido, que es el ASCII 8. If (Asc(e.KeyChar) = 47) Then 'Si se presione la tecla de la pleca ("/"). If (contadorplecas > 0) Then 'Cuando se pretenda introducir una segunda pleca. e.KeyChar = "" 'Reemplaza la tecla digitada con el valor de nada para que no se puedan introducir caracteres inválidos. End If End If Else e.KeyChar = "" 'Reemplaza la tecla digitada con el valor de nada para que no se puedan introducir caracteres inválidos. End If End Sub End Class FORMULARIO multiplicacionbasico1 Public Class multiplicacionbasico1 Protected Overrides Sub OnPaint(ByVal Pintar As PaintEventArgs) Dim Elipse As New Drawing2D.GraphicsPath() Dim Rectangulo As New Rectangle(8, 28, Me.Width - 13, Me.Height - 40) 'La coordenada "x" de la esquina superior izquierda del rectángulo tiene el valor de 7 para que n o se vea el borde izquierdo del formulario. La coordenada "y" de la esquina superior izquierda del rectángulo tiene el valor de 26, con lo cual se logra que no aparezca la barra de título en el formulario. El ancho del rectángulo es "Me.Width - 13" para que no se vea el borde derecho del formulario. El alto del rectángulo es "Me.Height - 31" para que no se vea la línea inferior del borde. Elipse.AddEllipse(Rectangulo) Me.Region = New Region(Elipse) End Sub 'Las siguientes variables deben ser públicas para que vayan almacenando valores y que los pierdan hasta que explícitamente se programe un cambio de valores o cuando se cierre el formulario. Public respuestaaciertos As Integer 'Variable que contabiliza el número de aciertos. Public respuestadesaciertos As Integer 'Variable que contabiliza el número de desaciertos. Private Sub multiplicacionbasico1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'Al cargar el formulario ya deben aparecer números: numero1.Text = obtenernumerorandom(1, 999) 'Imprime un número random entre 1 y 999 en el TextBox "numero1". numero2.Text = obtenernumerorandom(1, 999) 'Imprime un número random entre 1 y 999 en el TextBox "numero2". aciertos.Text = "0" desaciertos.Text = "0" End Sub Private Sub menu1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles menu1.Click Dim mensaje As String mensaje = MsgBox("Regresar al menú cancelará su juego actual. ¿Desea continuar?", MsgBoxStyle.YesNo, "Juego de Operaciones Básicas para Bachilleres") If mensaje = 6 Then menu2.Show() 'Llama al formulario "menu2". Me.Close() 'Cierra el formulario actual. Else 'No hace nada porque no se ha decidido por parte del usuario regresar al menú. End If End Sub Private Sub terminar1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles terminar1.Click Dim mensaje As String mensaje = MsgBox("¿Desea realmente terminar este juego?", MsgBoxStyle.YesNo, "Juego de Operaciones Básicas para Bachilleres") If mensaje = 6 Then resultado1.aciertos1.Text = aciertos.Text 'El número de aciertos se manda a imprimir al TextBox "aciertos1" que está en el formulario "resultado1". resultado1.desaciertos1.Text = desaciertos.Text 'El número de desaciertos se manda a imprimir al TextBox "desaciertos1" que está en el formulario "resultado1". resultado1.notafinal1.Text = 10 / (Val(aciertos.Text) + Val(desaciertos.Text)) * Val(aciertos.Text) 'Determinar e imprimir la nota final. resultado1.Show() 'Mandar a llamar al formulario de resultados. El juego ha terminado. End If End Sub Private Sub multiplicacion1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles multiplicacion1.Click If respuesta.Text = "" Then 'Si el usuario no ha escrito una respuesta. MsgBox("Escriba la respuesta que considere correcta.", MsgBoxStyle.Exclamation, "Juego de Operaciones Matemáticas para Bachilleres") respuesta.Focus() 'Se ubica el cursor en el cuadro de texto de respuestas para que el usuario escriba su respuesta. Else TextBoxoculto.Text = Val(numero1.Text) * Val(numero2.Text) 'Se guarda en el TextBox oculto la respuesta correcta. While Mid(respuesta.Text, 1, 2) = "00" Or Mid(respuesta.Text, 1, 2) = "01" Or Mid(respuesta.Text, 1, 2) = "02" Or Mid(respuesta.Text, 1, 2) = "03" Or Mid(respuesta.Text, 1, 2) = "04" Or Mid(respuesta.Text, 1, 2) = "05" Or Mid(respuesta.Text, 1, 2) = "06" Or Mid(respuesta.Text, 1, 2) = "07" Or Mid(respuesta.Text, 1, 2) = "08" Or Mid(respuesta.Text, 1, 2) = "09" 'Para que los ceros a la izquierda se borren. respuesta.Text = Mid(respuesta.Text, 2, Len(respuesta.Text) - 1) End While If (respuesta.Text = TextBoxoculto.Text) Then 'Si la respuesta introducida por el usuario es igual a la respuesta correcta. Dim mensaje As String mensaje = MsgBox("¡Felicidades, su respuesta es correcta!", MsgBoxStyle.OkOnly, "Juego de Operaciones Matemáticas para Bachilleres") If mensaje = 1 Then 'Si el botón presionado es el "Ok" (que es el único que se le va a presentar entonces ese se tiene que presionar). 'Generación de números aleatorios. numero1.Text = obtenernumerorandom(1, 999) 'Imprime un número random entre 1 y 999 en el TextBox "numero1". numero2.Text = obtenernumerorandom(1, 999) 'Imprime un número random entre 1 y 999 en el TextBox "numero2". respuesta.Text = "" 'Para borrar la respuesta anterior y que el usuario escriba una nueva respuesta. respuesta.Focus() 'Para que el cursor esté listo y que el usuario escriba su próxima respuesta. End If respuestaaciertos += 1 'Suma un acierto. aciertos.Text = respuestaaciertos 'Imprime el número de aciertos en el TextBox. If respuestaaciertos + respuestadesaciertos = 20 Then resultado1.aciertos1.Text = aciertos.Text 'El número de aciertos se manda a imprimir al TextBox "aciertos1" que está en el formulario "resultado1". resultado1.desaciertos1.Text = desaciertos.Text 'El número de desaciertos se manda a imprimir al TextBox "desaciertos1" que está en el formulario "resultado1". resultado1.notafinal1.Text = 10 / 20 * Val(aciertos.Text) resultado1.Show() 'Mandar a llamar al formulario de resultados. El juego ha terminado. Me.Close() 'Cierra el formulario actual. End If Else Dim mensaje As String mensaje = MsgBox("¡Incorrecto! La respuesta es: " + TextBoxoculto.Text + ".", MsgBoxStyle.OkOnly, "Juego de Operaciones Matemáticas para Bachilleres") If mensaje = 1 Then 'Si el botón presionado es el "Ok" (que es el único que se le va a presentar entonces ese se tiene que presionar). 'Generación de números aleatorios. numero1.Text = obtenernumerorandom(1, 999) 'Imprime un número random entre 1 y 999 en el TextBox "numero1". numero2.Text = obtenernumerorandom(1, 999) 'Imprime un número random entre 1 y 999 en el TextBox "numero2". respuesta.Text = "" 'Para borrar la respuesta anterior y que el usuario escriba una nueva respuesta. respuesta.Focus() 'Para que el cursor esté listo y que el usuario escriba su próxima respuesta. End If respuestadesaciertos += 1 'Suma un desacierto. desaciertos.Text = respuestadesaciertos 'Imprime el número de desaciertos en el TextBox. If respuestaaciertos + respuestadesaciertos = 20 Then resultado1.aciertos1.Text = aciertos.Text 'El número de aciertos se manda a imprimir al TextBox "aciertos1" que está en el formulario "resultado1". resultado1.desaciertos1.Text = desaciertos.Text 'El número de desaciertos se manda a imprimir al TextBox "desaciertos1" que está en el formulario "resultado1". resultado1.notafinal1.Text = 10 / 20 * Val(aciertos.Text) resultado1.Show() 'Mandar a llamar al formulario de resultados. El juego ha terminado. Me.Close() 'Cierra el formulario actual. End If End If End If End Sub Private Sub respuesta_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles respuesta.KeyPress If (Asc(e.KeyChar) >= 48 And Asc(e.KeyChar) <= 57) Or (Asc(e.KeyChar) = 8) Then 'Los únicos caracteres que se permitirá introducir en el TextBox serán los números del 0 al 9 (ASCII del 48 al 57). 'No se hace nada porque el caracter presionado es válido. Else e.KeyChar = "" 'Reemplaza la tecla digitada con un valor Void o vacío, para que no puedan introducir caracteres inválidos. End If End Sub End Class FORMULARIO multiplicacionintermedio1 Public Class multiplicacionintermedio1 Protected Overrides Sub OnPaint(ByVal Pintar As PaintEventArgs) Dim Elipse As New Drawing2D.GraphicsPath() Dim Rectangulo As New Rectangle(8, 28, Me.Width - 13, Me.Height - 40) 'La coordenada "x" de la esquina superior izquierda del rectángulo tiene el valor de 7 para que n o se vea el borde izquierdo del formulario. La coordenada "y" de la esquina superior izquierda del rectángulo tiene el valor de 26, con lo cual se logra que no aparezca la barra de título en el formulario. El ancho del rectángulo es "Me.Width - 13" para que no se vea el borde derecho del formulario. El alto del rectángulo es "Me.Height - 31" para que no se vea la línea inferior del borde. Elipse.AddEllipse(Rectangulo) Me.Region = New Region(Elipse) End Sub 'Las siguientes variables deben ser públicas para que vayan almacenando valores y que los pierdan hasta que explícitamente se programe un cambio de valores o cuando se cierre el formulario. Public respuestaaciertos As Integer 'Variable que contabiliza el número de aciertos. Public respuestadesaciertos As Integer 'Variable que contabiliza el número de desaciertos. Private Sub multiplicacionintermedio1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'Al cargar el formulario ya deben aparecer números: numero1.Text = obtenernumerorandom(100, 999999) 'Imprime un número random entre 100 y 999999 en el TextBox "numero1". numero2.Text = obtenernumerorandom(100, 999999) 'Imprime un número random entre 100 y 999999 en el TextBox "numero2". aciertos.Text = "0" desaciertos.Text = "0" End Sub Private Sub menu1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles menu1.Click Dim mensaje As String mensaje = MsgBox("Regresar al menú cancelará su juego actual. ¿Desea continuar?", MsgBoxStyle.YesNo, "Juego de Operaciones Básicas para Bachilleres") If mensaje = 6 Then menu2.Show() 'Llama al formulario "menu2". Me.Close() 'Cierra el formulario actual. Else 'No hace nada porque no se ha decidido por parte del usuario regresar al menú. End If End Sub Private Sub terminar1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles terminar1.Click Dim mensaje As String mensaje = MsgBox("¿Desea realmente terminar este juego?", MsgBoxStyle.YesNo, "Juego de Operaciones Básicas para Bachilleres") If mensaje = 6 Then resultado1.aciertos1.Text = aciertos.Text 'El número de aciertos se manda a imprimir al TextBox "aciertos1" que está en el formulario "resultado1". resultado1.desaciertos1.Text = desaciertos.Text 'El número de desaciertos se manda a imprimir al TextBox "desaciertos1" que está en el formulario "resultado1". resultado1.notafinal1.Text = 10 / (Val(aciertos.Text) + Val(desaciertos.Text)) * Val(aciertos.Text) 'Determinar e imprimir la nota final. resultado1.Show() 'Mandar a llamar al formulario de resultados. El juego ha terminado. End If End Sub Private Sub multiplicacion1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles multiplicacion1.Click If respuesta.Text = "" Then 'Si el usuario no ha escrito una respuesta. MsgBox("Escriba la respuesta que considere correcta.", MsgBoxStyle.Exclamation, "Juego de Operaciones Matemáticas para Bachilleres") respuesta.Focus() 'Se ubica el cursor en el cuadro de texto de respuestas para que el usuario escriba su respuesta. Else TextBoxoculto.Text = Val(numero1.Text) * Val(numero2.Text) 'Se guarda en el TextBox oculto la respuesta correcta. While Mid(respuesta.Text, 1, 2) = "00" Or Mid(respuesta.Text, 1, 2) = "01" Or Mid(respuesta.Text, 1, 2) = "02" Or Mid(respuesta.Text, 1, 2) = "03" Or Mid(respuesta.Text, 1, 2) = "04" Or Mid(respuesta.Text, 1, 2) = "05" Or Mid(respuesta.Text, 1, 2) = "06" Or Mid(respuesta.Text, 1, 2) = "07" Or Mid(respuesta.Text, 1, 2) = "08" Or Mid(respuesta.Text, 1, 2) = "09" 'Para que los ceros a la izquierda se borren. respuesta.Text = Mid(respuesta.Text, 2, Len(respuesta.Text) - 1) End While If (respuesta.Text = TextBoxoculto.Text) Then 'Si la respuesta introducida por el usuario es igual a la respuesta correcta. Dim mensaje As String mensaje = MsgBox("¡Felicidades, su respuesta es correcta!", MsgBoxStyle.OkOnly, "Juego de Operaciones Matemáticas para Bachilleres") If mensaje = 1 Then 'Si el botón presionado es el "Ok" (que es el único que se le va a presentar entonces ese se tiene que presionar). 'Generación de números aleatorios. numero1.Text = obtenernumerorandom(100, 999999) 'Imprime un número random entre 100 y 999999 en el TextBox "numero1". numero2.Text = obtenernumerorandom(100, 999999) 'Imprime un número random entre 100 y 999999 en el TextBox "numero2". respuesta.Text = "" 'Para borrar la respuesta anterior y que el usuario escriba una nueva respuesta. respuesta.Focus() 'Para que el cursor esté listo y que el usuario escriba su próxima respuesta. End If respuestaaciertos += 1 'Suma un acierto. aciertos.Text = respuestaaciertos 'Imprime el número de aciertos en el TextBox. If respuestaaciertos + respuestadesaciertos = 20 Then resultado1.aciertos1.Text = aciertos.Text 'El número de aciertos se manda a imprimir al TextBox "aciertos1" que está en el formulario "resultado1". resultado1.desaciertos1.Text = desaciertos.Text 'El número de desaciertos se manda a imprimir al TextBox "desaciertos1" que está en el formulario "resultado1". resultado1.notafinal1.Text = 10 / 20 * Val(aciertos.Text) resultado1.Show() 'Mandar a llamar al formulario de resultados. El juego ha terminado. Me.Close() 'Cierra el formulario actual. End If Else Dim mensaje As String mensaje = MsgBox("¡Incorrecto! La respuesta es: " + TextBoxoculto.Text + ".", MsgBoxStyle.OkOnly, "Juego de Operaciones Matemáticas para Bachilleres") If mensaje = 1 Then 'Si el botón presionado es el "Ok" (que es el único que se le va a presentar entonces ese se tiene que presionar). 'Generación de números aleatorios. numero1.Text = obtenernumerorandom(100, 999999) 'Imprime un número random entre 100 y 999999 en el TextBox "numero1". numero2.Text = obtenernumerorandom(100, 999999) 'Imprime un número random entre 100 y 999999 en el TextBox "numero2". respuesta.Text = "" 'Para borrar la respuesta anterior y que el usuario escriba una nueva respuesta. respuesta.Focus() 'Para que el cursor esté listo y que el usuario escriba su próxima respuesta. End If respuestadesaciertos += 1 'Suma un desacierto. desaciertos.Text = respuestadesaciertos 'Imprime el número de desaciertos en el TextBox. If respuestaaciertos + respuestadesaciertos = 20 Then resultado1.aciertos1.Text = aciertos.Text 'El número de aciertos se manda a imprimir al TextBox "aciertos1" que está en el formulario "resultado1". resultado1.desaciertos1.Text = desaciertos.Text 'El número de desaciertos se manda a imprimir al TextBox "desaciertos1" que está en el formulario "resultado1". resultado1.notafinal1.Text = 10 / 20 * Val(aciertos.Text) resultado1.Show() 'Mandar a llamar al formulario de resultados. El juego ha terminado. Me.Close() 'Cierra el formulario actual. End If End If End If End Sub Private Sub respuesta_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles respuesta.KeyPress If (Asc(e.KeyChar) >= 48 And Asc(e.KeyChar) <= 57) Or (Asc(e.KeyChar) = 8) Then 'Los únicos caracteres que se permitirá introducir en el TextBox serán los números del 0 al 9 (ASCII del 48 al 57). 'No se hace nada porque el caracter presionado es válido. Else e.KeyChar = "" 'Reemplaza la tecla digitada con un valor Void o vacío, para que no puedan introducir caracteres inválidos. End If End Sub End Class FORMULARIO portada1 Public Class portada1 Protected Overrides Sub OnPaint(ByVal Pintar As PaintEventArgs) Dim Elipse As New Drawing2D.GraphicsPath() Dim Rectangulo As New Rectangle(8, 28, Me.Width - 13, Me.Height - 40) 'La coordenada "x" de la esquina superior izquierda del rectángulo tiene el valor de 7 para que n o se vea el borde izquierdo del formulario. La coordenada "y" de la esquina superior izquierda del rectángulo tiene el valor de 26, con lo cual se logra que no aparezca la barra de título en el formulario. El ancho del rectángulo es "Me.Width - 13" para que no se vea el borde derecho del formulario. El alto del rectángulo es "Me.Height - 31" para que no se vea la línea inferior del borde. Elipse.AddEllipse(Rectangulo) Me.Region = New Region(Elipse) End Sub Private Sub botoncomenzar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles botoncomenzar.Click menu2.Show() 'Llama al formulario "menu2". Me.Hide() 'Oculta el formulario actual. menu2.portada.Select() 'Para que automáticamente esté seleccionado el botón "basico" cuando la persona se vaya al formulario del menú, de manera que simplemente presionando Enter pueda el usuario entrar al siguiente formulario sin tener que utilizar el mouse. Si le pone "menu1." al inicio porque se está invocando o haciendo referencia a un objeto de un formulario externo, entonces promero se especifica el formulario en el que se encuentra el objeto y luego el objeto en sí. End Sub Private Sub acercade_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles acercade.Click acercade1.Show() 'Muestra el formulario "acercade1". Me.Hide() 'Oculta el formulario actual. End Sub End Class FORMULARIO restaavanzado1 Public Class restaavanzado1 Protected Overrides Sub OnPaint(ByVal Pintar As PaintEventArgs) Dim Elipse As New Drawing2D.GraphicsPath() Dim Rectangulo As New Rectangle(8, 28, Me.Width - 13, Me.Height - 40) 'La coordenada "x" de la esquina superior izquierda del rectángulo tiene el valor de 7 para que n o se vea el borde izquierdo del formulario. La coordenada "y" de la esquina superior izquierda del rectángulo tiene el valor de 26, con lo cual se logra que no aparezca la barra de título en el formulario. El ancho del rectángulo es "Me.Width - 13" para que no se vea el borde derecho del formulario. El alto del rectángulo es "Me.Height - 31" para que no se vea la línea inferior del borde. Elipse.AddEllipse(Rectangulo) Me.Region = New Region(Elipse) End Sub 'Las siguientes variables deben ser públicas para que vayan almacenando valores y que los pierdan hasta que explícitamente se programe un cambio de valores o cuando se cierre el formulario. Public respuestaaciertos As Integer 'Variable que contabiliza el número de aciertos. Public respuestadesaciertos As Integer 'Variable que contabiliza el número de desaciertos. Private Sub restaavanzado1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'Al cargar el formulario ya deben aparecer números: numero1.Text = obtenernumerorandom(1, 99) + "/" + obtenernumerorandom(1, 99) 'Imprime un número random entre 1 y 99 contatenado con "+" concatenado con un número random entre 1 y 99, para obtener algo como "33/32", y eso se imprime en el TextBox "numero1". numero2.Text = obtenernumerorandom(1, 99) + "/" + obtenernumerorandom(1, 99) 'Imprime un número random entre 1 y 99 contatenado con "+" concatenado con un número random entre 1 y 99, para obtener algo como "34/32", y eso se imprime en el TextBox "numero2". aciertos.Text = "0" desaciertos.Text = "0" End Sub Private Sub menu1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles menu1.Click Dim mensaje As String mensaje = MsgBox("Regresar al menú cancelará su juego actual. ¿Desea continuar?", MsgBoxStyle.YesNo, "Juego de Operaciones Básicas para Bachilleres") If mensaje = 6 Then menu2.Show() 'Llama al formulario "menu2". Me.Close() 'Cierra el formulario actual. Else 'No hace nada porque no se ha decidido por parte del usuario regresar al menú. End If End Sub Private Sub restar1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles restar1.Click If respuesta.Text = "" Then 'Si el usuario no ha escrito una respuesta. MsgBox("Escriba la respuesta que considere correcta.", MsgBoxStyle.Exclamation, "Juego de Operaciones Matemáticas para Bachilleres") respuesta.Focus() 'Se ubica el cursor en el cuadro de texto de respuestas para que el usuario escriba su respuesta. Else 'Encontrar el numerador y el denominador del "numero1". Dim longitudcadena1 As Integer = Len(numero1.Text) 'Variable para almacenar la longitud de la cadena que hay en el Textbox "numero1". Dim caracterevaluado1 As String 'Para evaluar caracter por caracter con el Mid(). Dim posicionpleca1 As Integer 'Para determinar el número de la posición en la que se encuentra la pleca dentro de la cadena. Dim numerador1 As String 'Almacena el numerador del Textbox que se está evaluando. Dim denominador1 As String 'Almacena el denominador del Textbox que se está evaluando. Dim banderapleca1 As Integer 'Bandera o marcador que devolverá 1 si se encontró una pleca en la cadena, y 0 en el caso que no se haya encontrado. For ciclo As Integer = 1 To longitudcadena1 'Para evaluar caracter por caracter hasta encontrar una "/". caracterevaluado1 = Mid(numero1.Text, ciclo, 1) If caracterevaluado1 = "/" Then posicionpleca1 = ciclo banderapleca1 = 1 End If Next If banderapleca1 = 1 Then 'En el caso que se haya encontrado una pleca en la cadena, lo que indica que el usuario introdujo un número fraccionario. numerador1 = Mid(numero1.Text, 1, posicionpleca1 - 1) 'El numerador será desde el primer caracter hasta el que está antes de que se digitara la pleca. denominador1 = Mid(numero1.Text, posicionpleca1 + 1, longitudcadena1 posicionpleca1) 'El denominador será desde un caracter después de la pleca, hasta el último caracter de la cadena. Else 'En el caso que no se haya encontrado una pleca en la cadena, lo que indica que el usiario introdujo un número entero. Debido a que no se pueden meter puntos ni espacios ni caracteres especiales debido a la programación del KeyPress, el no encontrar una pleca garantiza que se introdujo un entero. numerador1 = Mid(numero1.Text, 1, longitudcadena1) denominador1 = 1 End If 'Encontrar el numerador y el denominador del "numero2". Dim longitudcadena2 As Integer = Len(numero2.Text) 'Variable para almacenar la longitud de la cadena que hay en el Textbox "numero2". Dim caracterevaluado2 As String 'Para evaluar caracter por caracter con el Mid(). Dim posicionpleca2 As Integer 'Para determinar el número de la posición en la que se encuentra la pleca dentro de la cadena. Dim numerador2 As String 'Almacena el numerador del Textbox que se está evaluando. Dim denominador2 As String 'Almacena el denominador del Textbox que se está evaluando. Dim banderapleca2 As Integer 'Bandera o marcador que devolverá 1 si se encontró una pleca en la cadena, y 0 en el caso que no se haya encontrado. For ciclo As Integer = 1 To longitudcadena2 'Para evaluar caracter por caracter hasta encontrar una "/". caracterevaluado2 = Mid(numero2.Text, ciclo, 1) If caracterevaluado2 = "/" Then posicionpleca2 = ciclo banderapleca2 = 1 End If Next If banderapleca2 = 1 Then 'En el caso que se haya encontrado una pleca en la cadena, lo que indica que el usuario introdujo un número fraccionario. numerador2 = Mid(numero2.Text, 1, posicionpleca2 - 1) 'El numerador será desde el primer caracter hasta el que está antes de que se digitara la pleca. denominador2 = Mid(numero2.Text, posicionpleca2 + 1, longitudcadena2 posicionpleca2) 'El denominador será desde un caracter después de la pleca, hasta el último caracter de la cadena. Else 'En el caso que no se haya encontrado una pleca en la cadena, lo que indica que el usiario introdujo un número entero. Debido a que no se pueden meter puntos ni espacios ni caracteres especiales debido a la programación del KeyPress, el no encontrar una pleca garantiza que se introdujo un entero. numerador2 = Mid(numero2.Text, 1, longitudcadena2) denominador2 = 1 End If 'Convertir los valores de los TextBox a objetos "Fraccion", mediante la clase. Dim fraccion_numero1 As New Fraccion(numerador1, denominador1) 'Convertir los valores de los TextBox a objetos "Fraccion", mediante la clase. Dim fraccion_numero2 As New Fraccion(numerador2, denominador2) Dim fraccion_respuesta As Fraccion 'Variable que almacenará la respuesta. fraccion_respuesta = fraccion_numero1 - fraccion_numero2 TextBoxoculto.Text = fraccion_respuesta.ToString 'La respuesta es de tipo "Fraccion" (la clase creada) y se transforma a tipo "String" para poder imprimirla en un TextBox. 'Condición para quitar el denominador de 1. If Strings.Right(TextBoxoculto.Text, 2) = "/1" Then 'Si el número tiene como divisor 1. TextBoxoculto.Text = Strings.Left(TextBoxoculto.Text, Strings.Len(TextBoxoculto.Text) - 2) 'Con esto se quita el "/1", por ejemplo si fuera "34/1" quedará solamente "34". End If Dim plecaubicacion As Integer 'Para saber en qué parte de la cadena se encuentra la pleca. For ciclo As Integer = 1 To Len(respuesta.Text) caracterevaluado1 = Mid(respuesta.Text, ciclo, 1) 'Toma el caracter correspondiente, dependiendo de la iteración en la que vaya el ciclo For. If caracterevaluado1 = "/" Then plecaubicacion = ciclo End If Next If Mid(respuesta.Text, plecaubicacion + 1, 1) = "-" Then 'Si el signo menos viene con el denominador. respuesta.Text = "-" + Mid(respuesta.Text, 1, plecaubicacion - 1) + "/" + Mid(respuesta.Text, plecaubicacion + 2, Len(respuesta.Text)) 'Si se escribiera "423/-42" se cambiaría por "-423/42". End If If Mid(respuesta.Text, 1, 1) = "-" Then 'Si el número es negativo. respuesta.Text = Mid(respuesta.Text, 2, Len(respuesta.Text)) While Mid(respuesta.Text, 1, 2) = "00" Or Mid(respuesta.Text, 1, 2) = "01" Or Mid(respuesta.Text, 1, 2) = "02" Or Mid(respuesta.Text, 1, 2) = "03" Or Mid(respuesta.Text, 1, 2) = "04" Or Mid(respuesta.Text, 1, 2) = "05" Or Mid(respuesta.Text, 1, 2) = "06" Or Mid(respuesta.Text, 1, 2) = "07" Or Mid(respuesta.Text, 1, 2) = "08" Or Mid(respuesta.Text, 1, 2) = "09" 'Para que los ceros a la izquierda se borren. respuesta.Text = Mid(respuesta.Text, 2, Len(respuesta.Text) - 1) End While For ciclo As Integer = 1 To Len(respuesta.Text) caracterevaluado1 = Mid(respuesta.Text, ciclo, 1) 'Toma el caracter correspondiente, dependiendo de la iteración en la que vaya el ciclo For. If caracterevaluado1 = "/" Then plecaubicacion = ciclo End If Next While Mid(respuesta.Text, plecaubicacion + 1, 2) = "00" Or Mid(respuesta.Text, plecaubicacion + 1, 2) = "01" Or Mid(respuesta.Text, plecaubicacion + 1, 2) = "02" Or Mid(respuesta.Text, plecaubicacion + 1, 2) = "03" Or Mid(respuesta.Text, plecaubicacion + 1, 2) = "04" Or Mid(respuesta.Text, plecaubicacion + 1, 2) = "05" Or Mid(respuesta.Text, plecaubicacion + 1, 2) = "06" Or Mid(respuesta.Text, plecaubicacion + 1, 2) = "07" Or Mid(respuesta.Text, plecaubicacion + 1, 2) = "08" Or Mid(respuesta.Text, plecaubicacion + 1, 2) = "09" 'Para quitar los ceros del denominador. respuesta.Text = Mid(respuesta.Text, 1, plecaubicacion - 1) + "/" + Mid(respuesta.Text, plecaubicacion + 2, Len(respuesta.Text)) 'Para que si el usuario escribe "433/0000432", cambiará a "443/432". End While respuesta.Text = "-" + respuesta.Text Else 'Si el número es positivo. While Mid(respuesta.Text, 1, 2) = "00" Or Mid(respuesta.Text, 1, 2) = "01" Or Mid(respuesta.Text, 1, 2) = "02" Or Mid(respuesta.Text, 1, 2) = "03" Or Mid(respuesta.Text, 1, 2) = "04" Or Mid(respuesta.Text, 1, 2) = "05" Or Mid(respuesta.Text, 1, 2) = "06" Or Mid(respuesta.Text, 1, 2) = "07" Or Mid(respuesta.Text, 1, 2) = "08" Or Mid(respuesta.Text, 1, 2) = "09" 'Para que los ceros a la izquierda se borren. respuesta.Text = Mid(respuesta.Text, 2, Len(respuesta.Text) - 1) End While For ciclo As Integer = 1 To Len(respuesta.Text) caracterevaluado1 = Mid(respuesta.Text, ciclo, 1) 'Toma el caracter correspondiente, dependiendo de la iteración en la que vaya el ciclo For. If caracterevaluado1 = "/" Then plecaubicacion = ciclo End If Next While Mid(respuesta.Text, plecaubicacion + 1, 2) = "00" Or Mid(respuesta.Text, plecaubicacion + 1, 2) = "01" Or Mid(respuesta.Text, plecaubicacion + 1, 2) = "02" Or Mid(respuesta.Text, plecaubicacion + 1, 2) = "03" Or Mid(respuesta.Text, plecaubicacion + 1, 2) = "04" Or Mid(respuesta.Text, plecaubicacion + 1, 2) = "05" Or Mid(respuesta.Text, plecaubicacion + 1, 2) = "06" Or Mid(respuesta.Text, plecaubicacion + 1, 2) = "07" Or Mid(respuesta.Text, plecaubicacion + 1, 2) = "08" Or Mid(respuesta.Text, plecaubicacion + 1, 2) = "09" 'Para quitar los ceros del denominador. respuesta.Text = Mid(respuesta.Text, 1, plecaubicacion - 1) + "/" + Mid(respuesta.Text, plecaubicacion + 2, Len(respuesta.Text)) 'Para que si el usuario escribe "433/0000432", cambiará a "443/432". End While End If If (respuesta.Text = TextBoxoculto.Text) Then 'Si la respuesta introducida por el usuario es igual a la respuesta correcta. Dim mensaje As String mensaje = MsgBox("¡Felicidades, su respuesta es correcta!", MsgBoxStyle.OkOnly, "Juego de Operaciones Matemáticas para Bachilleres") If mensaje = 1 Then 'Si el botón presionado es el "Ok" (que es el único que se le va a presentar entonces ese se tiene que presionar). 'Generación de números aleatorios. numero1.Text = obtenernumerorandom(1, 99) + "/" + obtenernumerorandom(1, 99) 'Imprime un número random entre 1 y 99 contatenado con "+" concatenado con un número random entre 1 y 99, para obtener algo como "34/42", y eso se imprime en el TextBox "numero1". numero2.Text = obtenernumerorandom(1, 99) + "/" + obtenernumerorandom(1, 99) 'Imprime un número random entre 1 y 99 contatenado con "+" concatenado con un número random entre 1 y 99, para obtener algo como "34/42", y eso se imprime en el TextBox "numero2". respuesta.Text = "" 'Para borrar la respuesta anterior y que el usuario escriba una nueva respuesta. respuesta.Focus() 'Para que el cursor esté listo y que el usuario escriba su próxima respuesta. End If respuestaaciertos += 1 'Suma un acierto. aciertos.Text = respuestaaciertos 'Imprime el número de aciertos en el TextBox. If respuestaaciertos + respuestadesaciertos = 20 Then resultado1.aciertos1.Text = aciertos.Text 'El número de aciertos se manda a imprimir al TextBox "aciertos1" que está en el formulario "resultado1". resultado1.desaciertos1.Text = desaciertos.Text 'El número de desaciertos se manda a imprimir al TextBox "desaciertos1" que está en el formulario "resultado1". resultado1.notafinal1.Text = 10 / 20 * Val(aciertos.Text) resultado1.Show() 'Mandar a llamar al formulario de resultados. El juego ha terminado. End If Else 'Si la respuesta introducida por el usuario es diferente de la respuesta correcta. Dim mensaje As String mensaje = MsgBox("¡Incorrecto! La respuesta es: " + TextBoxoculto.Text + ".", MsgBoxStyle.OkOnly, "Juego de Operaciones Matemáticas para Bachilleres") If mensaje = 1 Then 'Si el botón presionado es el "Ok" (que es el único que se le va a presentar entonces ese se tiene que presionar). 'Generación de números aleatorios. numero1.Text = obtenernumerorandom(1, 99) + "/" + obtenernumerorandom(1, 99) 'Imprime un número random entre 1 y 99 contatenado con "+" concatenado con un número random entre 1 y 99, para obtener algo como "34/42", y eso se imprime en el TextBox "numero1". numero2.Text = obtenernumerorandom(1, 99) + "/" + obtenernumerorandom(1, 99) 'Imprime un número random entre 1 y 99 contatenado con "+" concatenado con un número random entre 1 y 99, para obtener algo como "34/42", y eso se imprime en el TextBox "numero2". respuesta.Text = "" 'Para borrar la respuesta anterior y que el usuario escriba una nueva respuesta. respuesta.Focus() 'Para que el cursor esté listo y que el usuario escriba su próxima respuesta. End If respuestadesaciertos += 1 'Suma un desacierto. desaciertos.Text = respuestadesaciertos 'Imprime el número de desaciertos en el TextBox. If respuestaaciertos + respuestadesaciertos = 20 Then resultado1.aciertos1.Text = aciertos.Text 'El número de aciertos se manda a imprimir al TextBox "aciertos1" que está en el formulario "resultado1". resultado1.desaciertos1.Text = desaciertos.Text 'El número de desaciertos se manda a imprimir al TextBox "desaciertos1" que está en el formulario "resultado1". resultado1.notafinal1.Text = 10 / 20 * Val(aciertos.Text) resultado1.Show() 'Mandar a llamar al formulario de resultados. El juego ha terminado. Me.Hide() End If End If End If End Sub Private Sub terminar1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles terminar1.Click Dim mensaje As String mensaje = MsgBox("¿Desea realmente terminar este juego?", MsgBoxStyle.YesNo, "Juego de Operaciones Básicas para Bachilleres") If mensaje = 6 Then resultado1.aciertos1.Text = aciertos.Text 'El número de aciertos se manda a imprimir al TextBox "aciertos1" que está en el formulario "resultado1". resultado1.desaciertos1.Text = desaciertos.Text 'El número de desaciertos se manda a imprimir al TextBox "desaciertos1" que está en el formulario "resultado1". resultado1.notafinal1.Text = 10 / (Val(aciertos.Text) + Val(desaciertos.Text)) * Val(aciertos.Text) 'Determinar e imprimir la nota final. resultado1.Show() 'Mandar a llamar al formulario de resultados. El juego ha terminado. End If End Sub Private Sub respuesta_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles respuesta.KeyPress Dim contadorplecas As Integer Dim contadormenos As Integer Dim longitudcadena As Integer = Len(respuesta.Text) 'Variable para almacenar la longitud de la cadena que hay en un Textbox. Dim caracterevaluado As String 'Para evaluar caracter por caracter con el Mid(). For ciclo As Integer = 1 To longitudcadena 'Para evaluar caracter por caracter hasta encontrar una "/". caracterevaluado = Mid(respuesta.Text, ciclo, 1) If caracterevaluado = "/" Then contadorplecas = contadorplecas + 1 End If If caracterevaluado = "-" Then contadormenos = contadormenos + 1 End If Next If (Asc(e.KeyChar) >= 47 And Asc(e.KeyChar) <= 57) Or Asc(e.KeyChar) = 8 Or Asc(e.KeyChar) = 45 Then 'Los únicos caracteres que se permitirá introducir en el Textbox serán los números del 0 al 9 (ASCII del 48 al 57); la pleca ("/"), que es el ASCII 47; el signo menos ("-"), que es el ASCII 45; y el retroceso de espacio o backspace para borrar texto introducido, que es el ASCII 8. If (Asc(e.KeyChar) = 47) Then 'Si se presione la tecla de la pleca ("/"). If (contadorplecas > 0) Then 'Cuando se pretenda introducir una segunda pleca. e.KeyChar = "" 'Reemplaza la tecla digitada con el valor de nada para que no se puedan introducir caracteres inválidos. End If End If If (Asc(e.KeyChar) = 45) Then 'Si se presione la tecla del signo menos ("-"). If (contadormenos > 0) Then 'Cuando se pretenda introducir una segunda pleca. e.KeyChar = "" 'Reemplaza la tecla digitada con el valor de nada para que no se puedan introducir caracteres inválidos. End If End If Else e.KeyChar = "" 'Reemplaza la tecla digitada con el valor de nada para que no se puedan introducir caracteres inválidos. End If End Sub End Class FORMULARIO restabasico1 Public Class restabasico1 Protected Overrides Sub OnPaint(ByVal Pintar As PaintEventArgs) Dim Elipse As New Drawing2D.GraphicsPath() Dim Rectangulo As New Rectangle(8, 28, Me.Width - 13, Me.Height - 40) 'La coordenada "x" de la esquina superior izquierda del rectángulo tiene el valor de 7 para que n o se vea el borde izquierdo del formulario. La coordenada "y" de la esquina superior izquierda del rectángulo tiene el valor de 26, con lo cual se logra que no aparezca la barra de título en el formulario. El ancho del rectángulo es "Me.Width - 13" para que no se vea el borde derecho del formulario. El alto del rectángulo es "Me.Height - 31" para que no se vea la línea inferior del borde. Elipse.AddEllipse(Rectangulo) Me.Region = New Region(Elipse) End Sub 'Las siguientes variables deben ser públicas para que vayan almacenando valores y que los pierdan hasta que explícitamente se programe un cambio de valores o cuando se cierre el formulario. Public respuestaaciertos As Integer 'Variable que contabiliza el número de aciertos. Public respuestadesaciertos As Integer 'Variable que contabiliza el número de desaciertos. Private Sub restabasico1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'Al cargar el formulario ya deben aparecer números: numero1.Text = obtenernumerorandom(1, 99) 'Imprime un número random entre 1 y 99 en el TextBox "numero1". numero2.Text = obtenernumerorandom(1, 99) 'Imprime un número random entre 1 y 99 en el TextBox "numero2". aciertos.Text = "0" desaciertos.Text = "0" End Sub Private Sub menu1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles menu1.Click Dim mensaje As String mensaje = MsgBox("Regresar al menú cancelará su juego actual. ¿Desea continuar?", MsgBoxStyle.YesNo, "Juego de Operaciones Básicas para Bachilleres") If mensaje = 6 Then menu2.Show() 'Llama al formulario "menu2". Me.Close() 'Cierra el formulario actual. Else 'No hace nada porque no se ha decidido por parte del usuario regresar al menú. End If End Sub Private Sub terminar1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles terminar1.Click Dim mensaje As String mensaje = MsgBox("¿Desea realmente terminar este juego?", MsgBoxStyle.YesNo, "Juego de Operaciones Básicas para Bachilleres") If mensaje = 6 Then resultado1.aciertos1.Text = aciertos.Text 'El número de aciertos se manda a imprimir al TextBox "aciertos1" que está en el formulario "resultado1". resultado1.desaciertos1.Text = desaciertos.Text 'El número de desaciertos se manda a imprimir al TextBox "desaciertos1" que está en el formulario "resultado1". resultado1.notafinal1.Text = 10 / (Val(aciertos.Text) + Val(desaciertos.Text)) * Val(aciertos.Text) 'Determinar e imprimir la nota final. resultado1.Show() 'Mandar a llamar al formulario de resultados. El juego ha terminado. End If End Sub Private Sub restar1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles restar1.Click If respuesta.Text = "" Then 'Si el usuario no ha escrito una respuesta. MsgBox("Escriba la respuesta que considere correcta.", MsgBoxStyle.Exclamation, "Juego de Operaciones Matemáticas para Bachilleres") respuesta.Focus() 'Se ubica el cursor en el cuadro de texto de respuestas para que el usuario escriba su respuesta. Else TextBoxoculto.Text = Val(numero1.Text) - Val(numero2.Text) 'Se guarda en el TextBox oculto la respuesta correcta. If Mid(respuesta.Text, 1, 1) = "-" Then 'Si el número es negativo. respuesta.Text = Mid(respuesta.Text, 2, Len(respuesta.Text)) While Mid(respuesta.Text, 1, 2) = "00" Or Mid(respuesta.Text, 1, 2) = "01" Or Mid(respuesta.Text, 1, 2) = "02" Or Mid(respuesta.Text, 1, 2) = "03" Or Mid(respuesta.Text, 1, 2) = "04" Or Mid(respuesta.Text, 1, 2) = "05" Or Mid(respuesta.Text, 1, 2) = "06" Or Mid(respuesta.Text, 1, 2) = "07" Or Mid(respuesta.Text, 1, 2) = "08" Or Mid(respuesta.Text, 1, 2) = "09" 'Para que los ceros a la izquierda se borren. respuesta.Text = Mid(respuesta.Text, 2, Len(respuesta.Text) - 1) End While respuesta.Text = "-" + respuesta.Text Else 'Si el número es positivo. While Mid(respuesta.Text, 1, 2) = "00" Or Mid(respuesta.Text, 1, 2) = "01" Or Mid(respuesta.Text, 1, 2) = "02" Or Mid(respuesta.Text, 1, 2) = "03" Or Mid(respuesta.Text, 1, 2) = "04" Or Mid(respuesta.Text, 1, 2) = "05" Or Mid(respuesta.Text, 1, 2) = "06" Or Mid(respuesta.Text, 1, 2) = "07" Or Mid(respuesta.Text, 1, 2) = "08" Or Mid(respuesta.Text, 1, 2) = "09" 'Para que los ceros a la izquierda se borren. respuesta.Text = Mid(respuesta.Text, 2, Len(respuesta.Text) - 1) End While End If If (respuesta.Text = TextBoxoculto.Text) Then 'Si la respuesta introducida por el usuario es igual a la respuesta correcta. Dim mensaje As String mensaje = MsgBox("¡Felicidades, su respuesta es correcta!", MsgBoxStyle.OkOnly, "Juego de Operaciones Matemáticas para Bachilleres") If mensaje = 1 Then 'Si el botón presionado es el "Ok" (que es el único que se le va a presentar entonces ese se tiene que presionar). 'Generación de números aleatorios. numero1.Text = obtenernumerorandom(1, 999) 'Imprime un número random entre 1 y 999 en el TextBox "numero1". numero2.Text = obtenernumerorandom(1, 999) 'Imprime un número random entre 1 y 999 en el TextBox "numero2". respuesta.Text = "" 'Para borrar la respuesta anterior y que el usuario escriba una nueva respuesta. respuesta.Focus() 'Para que el cursor esté listo y que el usuario escriba su próxima respuesta. End If respuestaaciertos += 1 'Suma un acierto. aciertos.Text = respuestaaciertos 'Imprime el número de aciertos en el TextBox. If respuestaaciertos + respuestadesaciertos = 20 Then resultado1.aciertos1.Text = aciertos.Text 'El número de aciertos se manda a imprimir al TextBox "aciertos1" que está en el formulario "resultado1". resultado1.desaciertos1.Text = desaciertos.Text 'El número de desaciertos se manda a imprimir al TextBox "desaciertos1" que está en el formulario "resultado1". resultado1.notafinal1.Text = 10 / 20 * Val(aciertos.Text) resultado1.Show() 'Mandar a llamar al formulario de resultados. El juego ha terminado. Me.Close() 'Cierra el formulario actual. End If Else Dim mensaje As String mensaje = MsgBox("¡Incorrecto! La respuesta es: " + TextBoxoculto.Text + ".", MsgBoxStyle.OkOnly, "Juego de Operaciones Matemáticas para Bachilleres") If mensaje = 1 Then 'Si el botón presionado es el "Ok" (que es el único que se le va a presentar entonces ese se tiene que presionar). 'Generación de números aleatorios. numero1.Text = obtenernumerorandom(1, 999) 'Imprime un número random entre 1 y 999 en el TextBox "numero1". numero2.Text = obtenernumerorandom(1, 999) 'Imprime un número random entre 1 y 999 en el TextBox "numero2". respuesta.Text = "" 'Para borrar la respuesta anterior y que el usuario escriba una nueva respuesta. respuesta.Focus() 'Para que el cursor esté listo y que el usuario escriba su próxima respuesta. End If respuestadesaciertos += 1 'Suma un desacierto. desaciertos.Text = respuestadesaciertos 'Imprime el número de desaciertos en el TextBox. If respuestaaciertos + respuestadesaciertos = 20 Then resultado1.aciertos1.Text = aciertos.Text 'El número de aciertos se manda a imprimir al TextBox "aciertos1" que está en el formulario "resultado1". resultado1.desaciertos1.Text = desaciertos.Text 'El número de desaciertos se manda a imprimir al TextBox "desaciertos1" que está en el formulario "resultado1". resultado1.notafinal1.Text = 10 / 20 * Val(aciertos.Text) resultado1.Show() 'Mandar a llamar al formulario de resultados. El juego ha terminado. Me.Close() 'Cierra el formulario actual. End If End If End If End Sub Private Sub respuesta_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles respuesta.KeyPress If (Asc(e.KeyChar) >= 48 And Asc(e.KeyChar) <= 57) Or (Asc(e.KeyChar)) = 8 Then 'Los únicos caracteres que se permiritá introducir en el TextBox serán los números del 0 al 9 (ASCII del 48 al 57) y se permitirá también usar el Backspace (ASCII 8) para borrar. El signo menos (ASCII 45) se evalúa más adelante. 'No se hace nada porque el caracte presionado es válido. Else If (Asc(e.KeyChar)) = 45 Then 'Si se introduce un signo menos, se evaluará que no haya más de uno. Dim contadormenos As Integer 'Para programar que no se permitan varios signos menos en la respuesta. Dim caracterevaluado As String 'Para evaluar caracter por caracter con el Mid(). Dim longitudcadena As Integer = Len(respuesta.Text) 'Variable para almacenar la longitud de la cadena que hay en el text box "respuesta". For ciclo As Integer = 1 To longitudcadena 'Para evaluar caracter por caracter hasta encontrar un signo menos. caracterevaluado = Mid(respuesta.Text, ciclo, 1) 'Toma el caracter correspondiente, dependiendo de la iteración en la que vaya el ciclo For. If ciclo = 1 Then 'Si el signo menos se digita al principio, no en medio ni al final. contadormenos += 1 Else If caracterevaluado = "-" Then 'Si el signo menos se digita en una posición que no es al principio, lo que se programa es que borre ese signo digitado, de modo que no se permitirá escribirlo en una posición que no sea al principio. e.KeyChar = "" MsgBox("El signo menos sólo puede aparecer al inicio de la respuesta.", MsgBoxStyle.Exclamation, "Juego de Operaciones Básicas para Bachilleres") End If End If Next If contadormenos > 0 Then 'Si ya se ha digitado un signo menos. e.KeyChar = "" 'Reemplaza la letra o caracter digitado por un valor vacío, de manera que no se permita la introducción de más de un punto. End If Else 'Si el caracter introducido es inválido. e.KeyChar = "" 'Reemplaza la letra o caracter digitado por un valor vacío, de manera que no se permita la introducción de caracteres inválidos. End If End If End Sub End Class FORMULARIO restaintermedio1 Public Class restaintermedio1 Protected Overrides Sub OnPaint(ByVal Pintar As PaintEventArgs) Dim Elipse As New Drawing2D.GraphicsPath() Dim Rectangulo As New Rectangle(8, 28, Me.Width - 13, Me.Height - 40) 'La coordenada "x" de la esquina superior izquierda del rectángulo tiene el valor de 7 para que n o se vea el borde izquierdo del formulario. La coordenada "y" de la esquina superior izquierda del rectángulo tiene el valor de 26, con lo cual se logra que no aparezca la barra de título en el formulario. El ancho del rectángulo es "Me.Width - 13" para que no se vea el borde derecho del formulario. El alto del rectángulo es "Me.Height - 31" para que no se vea la línea inferior del borde. Elipse.AddEllipse(Rectangulo) Me.Region = New Region(Elipse) End Sub 'Las siguientes variables deben ser públicas para que vayan almacenando valores y que los pierdan hasta que explícitamente se programe un cambio de valores o cuando se cierre el formulario. Public respuestaaciertos As Integer 'Variable que contabiliza el número de aciertos. Public respuestadesaciertos As Integer 'Variable que contabiliza el número de desaciertos. Private Sub restaintermedio1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'Al cargar el formulario ya deben aparecer números: numero1.Text = obtenernumerorandom(100, 999999) 'Imprime un número random entre 100 y 999999 en el TextBox "numero1". numero2.Text = obtenernumerorandom(100, 999999) 'Imprime un número random entre 100 y 999999 en el TextBox "numero2". aciertos.Text = "0" desaciertos.Text = "0" End Sub Private Sub menu1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles menu1.Click Dim mensaje As String mensaje = MsgBox("Regresar al menú cancelará su juego actual. ¿Desea continuar?", MsgBoxStyle.YesNo, "Juego de Operaciones Básicas para Bachilleres") If mensaje = 6 Then menu2.Show() 'Llama al formulario "menu2". Me.Close() 'Cierra el formulario actual. Else 'No hace nada porque no se ha decidido por parte del usuario regresar al menú. End If End Sub Private Sub terminar1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles terminar1.Click Dim mensaje As String mensaje = MsgBox("¿Desea realmente terminar este juego?", MsgBoxStyle.YesNo, "Juego de Operaciones Básicas para Bachilleres") If mensaje = 6 Then resultado1.aciertos1.Text = aciertos.Text 'El número de aciertos se manda a imprimir al TextBox "aciertos1" que está en el formulario "resultado1". resultado1.desaciertos1.Text = desaciertos.Text 'El número de desaciertos se manda a imprimir al TextBox "desaciertos1" que está en el formulario "resultado1". resultado1.notafinal1.Text = 10 / (Val(aciertos.Text) + Val(desaciertos.Text)) * Val(aciertos.Text) 'Determinar e imprimir la nota final. resultado1.Show() 'Mandar a llamar al formulario de resultados. El juego ha terminado. End If End Sub Private Sub restar1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles restar1.Click If respuesta.Text = "" Then 'Si el usuario no ha escrito una respuesta. MsgBox("Escriba la respuesta que considere correcta.", MsgBoxStyle.Exclamation, "Juego de Operaciones Matemáticas para Bachilleres") respuesta.Focus() 'Se ubica el cursor en el cuadro de texto de respuestas para que el usuario escriba su respuesta. Else TextBoxoculto.Text = Val(numero1.Text) - Val(numero2.Text) 'Se guarda en el TextBox oculto la respuesta correcta. If Mid(respuesta.Text, 1, 1) = "-" Then 'Si el número es negativo. respuesta.Text = Mid(respuesta.Text, 2, Len(respuesta.Text)) While Mid(respuesta.Text, 1, 2) = "00" Or Mid(respuesta.Text, 1, 2) = "01" Or Mid(respuesta.Text, 1, 2) = "02" Or Mid(respuesta.Text, 1, 2) = "03" Or Mid(respuesta.Text, 1, 2) = "04" Or Mid(respuesta.Text, 1, 2) = "05" Or Mid(respuesta.Text, 1, 2) = "06" Or Mid(respuesta.Text, 1, 2) = "07" Or Mid(respuesta.Text, 1, 2) = "08" Or Mid(respuesta.Text, 1, 2) = "09" 'Para que los ceros a la izquierda se borren. respuesta.Text = Mid(respuesta.Text, 2, Len(respuesta.Text) - 1) End While respuesta.Text = "-" + respuesta.Text Else 'Si el número es positivo. While Mid(respuesta.Text, 1, 2) = "00" Or Mid(respuesta.Text, 1, 2) = "01" Or Mid(respuesta.Text, 1, 2) = "02" Or Mid(respuesta.Text, 1, 2) = "03" Or Mid(respuesta.Text, 1, 2) = "04" Or Mid(respuesta.Text, 1, 2) = "05" Or Mid(respuesta.Text, 1, 2) = "06" Or Mid(respuesta.Text, 1, 2) = "07" Or Mid(respuesta.Text, 1, 2) = "08" Or Mid(respuesta.Text, 1, 2) = "09" 'Para que los ceros a la izquierda se borren. respuesta.Text = Mid(respuesta.Text, 2, Len(respuesta.Text) - 1) End While End If If (respuesta.Text = TextBoxoculto.Text) Then 'Si la respuesta introducida por el usuario es igual a la respuesta correcta. Dim mensaje As String mensaje = MsgBox("¡Felicidades, su respuesta es correcta!", MsgBoxStyle.OkOnly, "Juego de Operaciones Matemáticas para Bachilleres") If mensaje = 1 Then 'Si el botón presionado es el "Ok" (que es el único que se le va a presentar entonces ese se tiene que presionar). 'Generación de números aleatorios. numero1.Text = obtenernumerorandom(100, 999999) 'Imprime un número random entre 100 y 999999 en el TextBox "numero1". numero2.Text = obtenernumerorandom(100, 999999) 'Imprime un número random entre 100 y 999999 en el TextBox "numero2". respuesta.Text = "" 'Para borrar la respuesta anterior y que el usuario escriba una nueva respuesta. respuesta.Focus() 'Para que el cursor esté listo y que el usuario escriba su próxima respuesta. End If respuestaaciertos += 1 'Suma un acierto. aciertos.Text = respuestaaciertos 'Imprime el número de aciertos en el TextBox. If respuestaaciertos + respuestadesaciertos = 20 Then resultado1.aciertos1.Text = aciertos.Text 'El número de aciertos se manda a imprimir al TextBox "aciertos1" que está en el formulario "resultado1". resultado1.desaciertos1.Text = desaciertos.Text 'El número de desaciertos se manda a imprimir al TextBox "desaciertos1" que está en el formulario "resultado1". resultado1.notafinal1.Text = 10 / 20 * Val(aciertos.Text) resultado1.Show() 'Mandar a llamar al formulario de resultados. El juego ha terminado. Me.Close() 'Cierra el formulario actual. End If Else Dim mensaje As String mensaje = MsgBox("¡Incorrecto! La respuesta es: " + TextBoxoculto.Text + ".", MsgBoxStyle.OkOnly, "Juego de Operaciones Matemáticas para Bachilleres") If mensaje = 1 Then 'Si el botón presionado es el "Ok" (que es el único que se le va a presentar entonces ese se tiene que presionar). 'Generación de números aleatorios. numero1.Text = obtenernumerorandom(100, 999999) 'Imprime un número random entre 100 y 999999 en el TextBox "numero1". numero2.Text = obtenernumerorandom(100, 999999) 'Imprime un número random entre 100 y 999999 en el TextBox "numero2". respuesta.Text = "" 'Para borrar la respuesta anterior y que el usuario escriba una nueva respuesta. respuesta.Focus() 'Para que el cursor esté listo y que el usuario escriba su próxima respuesta. End If respuestadesaciertos += 1 'Suma un desacierto. desaciertos.Text = respuestadesaciertos 'Imprime el número de desaciertos en el TextBox. If respuestaaciertos + respuestadesaciertos = 20 Then resultado1.aciertos1.Text = aciertos.Text 'El número de aciertos se manda a imprimir al TextBox "aciertos1" que está en el formulario "resultado1". resultado1.desaciertos1.Text = desaciertos.Text 'El número de desaciertos se manda a imprimir al TextBox "desaciertos1" que está en el formulario "resultado1". resultado1.notafinal1.Text = 10 / 20 * Val(aciertos.Text) resultado1.Show() 'Mandar a llamar al formulario de resultados. El juego ha terminado. Me.Close() 'Cierra el formulario actual. End If End If End If End Sub Private Sub respuesta_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles respuesta.KeyPress If (Asc(e.KeyChar) >= 48 And Asc(e.KeyChar) <= 57) Or (Asc(e.KeyChar)) = 8 Then 'Los únicos caracteres que se permiritá introducir en el TextBox serán los números del 0 al 9 (ASCII del 48 al 57) y se permitirá también usar el Backspace (ASCII 8) para borrar. El signo menos (ASCII 45) se evalúa más adelante. 'No se hace nada porque el caracte presionado es válido. Else If (Asc(e.KeyChar)) = 45 Then 'Si se introduce un signo menos, se evaluará que no haya más de uno. Dim contadormenos As Integer 'Para programar que no se permitan varios signos menos en la respuesta. Dim caracterevaluado As String 'Para evaluar caracter por caracter con el Mid(). Dim longitudcadena As Integer = Len(respuesta.Text) 'Variable para almacenar la longitud de la cadena que hay en el text box "respuesta". For ciclo As Integer = 1 To longitudcadena 'Para evaluar caracter por caracter hasta encontrar un signo menos. caracterevaluado = Mid(respuesta.Text, ciclo, 1) 'Toma el caracter correspondiente, dependiendo de la iteración en la que vaya el ciclo For. If ciclo = 1 Then 'Si el signo menos se digita al principio, no en medio ni al final. contadormenos += 1 Else If caracterevaluado = "-" Then 'Si el signo menos se digita en una posición que no es al principio, lo que se programa es que borre ese signo digitado, de modo que no se permitirá escribirlo en una posición que no sea al principio. e.KeyChar = "" MsgBox("El signo menos sólo puede aparecer al inicio de la respuesta.", MsgBoxStyle.Exclamation, "Juego de Operaciones Básicas para Bachilleres") End If End If Next If contadormenos > 0 Then 'Si ya se ha digitado un signo menos. e.KeyChar = "" 'Reemplaza la letra o caracter digitado por un valor vacío, de manera que no se permita la introducción de más de un punto. End If Else 'Si el caracter introducido es inválido. e.KeyChar = "" 'Reemplaza la letra o caracter digitado por un valor vacío, de manera que no se permita la introducción de caracteres inválidos. End If End If End Sub End Class FORMULARIO resultado1 Public Class resultado1 Protected Overrides Sub OnPaint(ByVal Pintar As PaintEventArgs) Dim Elipse As New Drawing2D.GraphicsPath() Dim Rectangulo As New Rectangle(8, 28, Me.Width - 13, Me.Height - 40) 'La coordenada "x" de la esquina superior izquierda del rectángulo tiene el valor de 7 para que n o se vea el borde izquierdo del formulario. La coordenada "y" de la esquina superior izquierda del rectángulo tiene el valor de 26, con lo cual se logra que no aparezca la barra de título en el formulario. El ancho del rectángulo es "Me.Width - 13" para que no se vea el borde derecho del formulario. El alto del rectángulo es "Me.Height - 31" para que no se vea la línea inferior del borde. Elipse.AddEllipse(Rectangulo) Me.Region = New Region(Elipse) End Sub Private Sub resultado1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load If aciertos1.Text = "0" And desaciertos1.Text = "0" Then MsgBox("No se hizo ningún intento.", MsgBoxStyle.Information, "Juego de Operaciones Básicas para Bachilleres 1.0") aciertos1.Text = "---" desaciertos1.Text = "---" notafinal1.Text = "---" End If End Sub Private Sub menu1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles menu1.Click Dim mensaje As String mensaje = MsgBox("¿Desea regresar al menú?", MsgBoxStyle.YesNo, "Juego de Operaciones Básicas para Bachilleres") If mensaje = 6 Then menu2.Show() 'Llama al formulario "menu2". 'Cierra cualquier formulario de operaciones que se encuentre oculto para que pierda todas las variables y cuando se accese otra vez que sea un nuevo juego. sumabasico1.Close() sumaintermedio1.Close() sumaavanzado1.Close() restabasico1.Close() restaintermedio1.Close() restaavanzado1.Close() multiplicacionbasico1.Close() multiplicacionintermedio1.Close() multiplicacionavanzado1.Close() divisionbasico1.Close() divisionintermedio1.Close() divisionavanzado1.Close() Me.Close() 'Cierra el formulario actual. Else 'No hace nada porque no se ha decidido por parte del usuario regresar al menú. End If End Sub End Class FORMULARIO sumaavanzado1 Public Class sumaavanzado1 Protected Overrides Sub OnPaint(ByVal Pintar As PaintEventArgs) Dim Elipse As New Drawing2D.GraphicsPath() Dim Rectangulo As New Rectangle(8, 28, Me.Width - 13, Me.Height - 40) 'La coordenada "x" de la esquina superior izquierda del rectángulo tiene el valor de 7 para que n o se vea el borde izquierdo del formulario. La coordenada "y" de la esquina superior izquierda del rectángulo tiene el valor de 26, con lo cual se logra que no aparezca la barra de título en el formulario. El ancho del rectángulo es "Me.Width - 13" para que no se vea el borde derecho del formulario. El alto del rectángulo es "Me.Height - 31" para que no se vea la línea inferior del borde. Elipse.AddEllipse(Rectangulo) Me.Region = New Region(Elipse) End Sub 'Las siguientes variables deben ser públicas para que vayan almacenando valores y que los pierdan hasta que explícitamente se programe un cambio de valores o cuando se cierre el formulario. Public respuestaaciertos As Integer 'Variable que contabiliza el número de aciertos. Public respuestadesaciertos As Integer 'Variable que contabiliza el número de desaciertos. Private Sub sumaavanzado1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'Al cargar el formulario ya deben aparecer números: numero1.Text = obtenernumerorandom(1, 99) + "/" + obtenernumerorandom(1, 99) 'Imprime un número random entre 1 y 99 contatenado con "+" concatenado con un número random entre 1 y 99, para obtener algo como "34/42", y eso se imprime en el TextBox "numero1". numero2.Text = obtenernumerorandom(1, 99) + "/" + obtenernumerorandom(1, 99) 'Imprime un número random entre 1 y 99 contatenado con "+" concatenado con un número random entre 1 y 99, para obtener algo como "34/42", y eso se imprime en el TextBox "numero2". aciertos.Text = "0" desaciertos.Text = "0" End Sub Private Sub menu1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles menu1.Click Dim mensaje As String mensaje = MsgBox("Regresar al menú cancelará su juego actual. ¿Desea continuar?", MsgBoxStyle.YesNo, "Juego de Operaciones Básicas para Bachilleres") If mensaje = 6 Then menu2.Show() 'Llama al formulario "menu2". Me.Close() 'Cierra el formulario actual. Else 'No hace nada porque no se ha decidido por parte del usuario regresar al menú. End If End Sub Private Sub sumar1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles sumar1.Click If respuesta.Text = "" Then 'Si el usuario no ha escrito una respuesta. MsgBox("Escriba la respuesta que considere correcta.", MsgBoxStyle.Exclamation, "Juego de Operaciones Matemáticas para Bachilleres") respuesta.Focus() 'Se ubica el cursor en el cuadro de texto de respuestas para que el usuario escriba su respuesta. Else 'Encontrar el numerador y el denominador del "numero1". Dim longitudcadena1 As Integer = Len(numero1.Text) 'Variable para almacenar la longitud de la cadena que hay en el Textbox "numero1". Dim caracterevaluado1 As String 'Para evaluar caracter por caracter con el Mid(). Dim posicionpleca1 As Integer 'Para determinar el número de la posición en la que se encuentra la pleca dentro de la cadena. Dim numerador1 As String 'Almacena el numerador del Textbox que se está evaluando. Dim denominador1 As String 'Almacena el denominador del Textbox que se está evaluando. Dim banderapleca1 As Integer 'Bandera o marcador que devolverá 1 si se encontró una pleca en la cadena, y 0 en el caso que no se haya encontrado. For ciclo As Integer = 1 To longitudcadena1 'Para evaluar caracter por caracter hasta encontrar una "/". caracterevaluado1 = Mid(numero1.Text, ciclo, 1) If caracterevaluado1 = "/" Then posicionpleca1 = ciclo banderapleca1 = 1 End If Next If banderapleca1 = 1 Then 'En el caso que se haya encontrado una pleca en la cadena, lo que indica que el usuario introdujo un número fraccionario. numerador1 = Mid(numero1.Text, 1, posicionpleca1 - 1) 'El numerador será desde el primer caracter hasta el que está antes de que se digitara la pleca. denominador1 = Mid(numero1.Text, posicionpleca1 + 1, longitudcadena1 posicionpleca1) 'El denominador será desde un caracter después de la pleca, hasta el último caracter de la cadena. Else 'En el caso que no se haya encontrado una pleca en la cadena, lo que indica que el usiario introdujo un número entero. Debido a que no se pueden meter puntos ni espacios ni caracteres especiales debido a la programación del KeyPress, el no encontrar una pleca garantiza que se introdujo un entero. numerador1 = Mid(numero1.Text, 1, longitudcadena1) denominador1 = 1 End If 'Encontrar el numerador y el denominador del "numero2". Dim longitudcadena2 As Integer = Len(numero2.Text) 'Variable para almacenar la longitud de la cadena que hay en el Textbox "numero2". Dim caracterevaluado2 As String 'Para evaluar caracter por caracter con el Mid(). Dim posicionpleca2 As Integer 'Para determinar el número de la posición en la que se encuentra la pleca dentro de la cadena. Dim numerador2 As String 'Almacena el numerador del Textbox que se está evaluando. Dim denominador2 As String 'Almacena el denominador del Textbox que se está evaluando. Dim banderapleca2 As Integer 'Bandera o marcador que devolverá 1 si se encontró una pleca en la cadena, y 0 en el caso que no se haya encontrado. For ciclo As Integer = 1 To longitudcadena2 'Para evaluar caracter por caracter hasta encontrar una "/". caracterevaluado2 = Mid(numero2.Text, ciclo, 1) If caracterevaluado2 = "/" Then posicionpleca2 = ciclo banderapleca2 = 1 End If Next If banderapleca2 = 1 Then 'En el caso que se haya encontrado una pleca en la cadena, lo que indica que el usuario introdujo un número fraccionario. numerador2 = Mid(numero2.Text, 1, posicionpleca2 - 1) 'El numerador será desde el primer caracter hasta el que está antes de que se digitara la pleca. denominador2 = Mid(numero2.Text, posicionpleca2 + 1, longitudcadena2 posicionpleca2) 'El denominador será desde un caracter después de la pleca, hasta el último caracter de la cadena. Else 'En el caso que no se haya encontrado una pleca en la cadena, lo que indica que el usiario introdujo un número entero. Debido a que no se pueden meter puntos ni espacios ni caracteres especiales debido a la programación del KeyPress, el no encontrar una pleca garantiza que se introdujo un entero. numerador2 = Mid(numero2.Text, 1, longitudcadena2) denominador2 = 1 End If 'Convertir los valores de los TextBox a objetos "Fraccion", mediante la clase. Dim fraccion_numero1 As New Fraccion(numerador1, denominador1) 'Convertir los valores de los TextBox a objetos "Fraccion", mediante la clase. Dim fraccion_numero2 As New Fraccion(numerador2, denominador2) Dim fraccion_respuesta As Fraccion 'Variable que almacenará la respuesta. fraccion_respuesta = fraccion_numero1 + fraccion_numero2 TextBoxoculto.Text = fraccion_respuesta.ToString 'La respuesta es de tipo "Fraccion" (la clase creada) y se transforma a tipo "String" para poder imprimirla en un TextBox. 'Condición para quitar el denominador de 1. If Strings.Right(TextBoxoculto.Text, 2) = "/1" Then 'Si el número tiene como divisor 1. TextBoxoculto.Text = Strings.Left(TextBoxoculto.Text, Strings.Len(TextBoxoculto.Text) - 2) 'Con esto se quita el "/1", por ejemplo si fuera "34/1" quedará solamente "34". End If While Mid(respuesta.Text, 1, 2) = "00" Or Mid(respuesta.Text, 1, 2) = "01" Or Mid(respuesta.Text, 1, 2) = "02" Or Mid(respuesta.Text, 1, 2) = "03" Or Mid(respuesta.Text, 1, 2) = "04" Or Mid(respuesta.Text, 1, 2) = "05" Or Mid(respuesta.Text, 1, 2) = "06" Or Mid(respuesta.Text, 1, 2) = "07" Or Mid(respuesta.Text, 1, 2) = "08" Or Mid(respuesta.Text, 1, 2) = "09" 'Para que los ceros a la izquierda se borren. respuesta.Text = Mid(respuesta.Text, 2, Len(respuesta.Text) - 1) End While Dim plecaubicacion As Integer 'Para saber en qué parte de la cadena se encuentra la pleca. For ciclo As Integer = 1 To Len(respuesta.Text) caracterevaluado1 = Mid(respuesta.Text, ciclo, 1) 'Toma el caracter correspondiente, dependiendo de la iteración en la que vaya el ciclo For. If caracterevaluado1 = "/" Then plecaubicacion = ciclo End If Next While Mid(respuesta.Text, plecaubicacion + 1, 2) = "00" Or Mid(respuesta.Text, plecaubicacion + 1, 2) = "01" Or Mid(respuesta.Text, plecaubicacion + 1, 2) = "02" Or Mid(respuesta.Text, plecaubicacion + 1, 2) = "03" Or Mid(respuesta.Text, plecaubicacion + 1, 2) = "04" Or Mid(respuesta.Text, plecaubicacion + 1, 2) = "05" Or Mid(respuesta.Text, plecaubicacion + 1, 2) = "06" Or Mid(respuesta.Text, plecaubicacion + 1, 2) = "07" Or Mid(respuesta.Text, plecaubicacion + 1, 2) = "08" Or Mid(respuesta.Text, plecaubicacion + 1, 2) = "09" 'Para quitar los ceros del denominador. respuesta.Text = Mid(respuesta.Text, 1, plecaubicacion - 1) + "/" + Mid(respuesta.Text, plecaubicacion + 2, Len(respuesta.Text)) 'Para que si el usuario escribe "433/0000432", cambiará a "443/432". End While If (respuesta.Text = TextBoxoculto.Text) Then 'Si la respuesta introducida por el usuario es igual a la respuesta correcta. Dim mensaje As String mensaje = MsgBox("¡Felicidades, su respuesta es correcta!", MsgBoxStyle.OkOnly, "Juego de Operaciones Matemáticas para Bachilleres") If mensaje = 1 Then 'Si el botón presionado es el "Ok" (que es el único que se le va a presentar entonces ese se tiene que presionar). 'Generación de números aleatorios. numero1.Text = obtenernumerorandom(1, 99) + "/" + obtenernumerorandom(1, 99) 'Imprime un número random entre 1 y 99 contatenado con "+" concatenado con un número random entre 1 y 99, para obtener algo como "34/42", y eso se imprime en el TextBox "numero1". numero2.Text = obtenernumerorandom(1, 99) + "/" + obtenernumerorandom(1, 99) 'Imprime un número random entre 1 y 99 contatenado con "+" concatenado con un número random entre 1 y 99, para obtener algo como "34/42", y eso se imprime en el TextBox "numero2". respuesta.Text = "" 'Para borrar la respuesta anterior y que el usuario escriba una nueva respuesta. respuesta.Focus() 'Para que el cursor esté listo y que el usuario escriba su próxima respuesta. End If respuestaaciertos += 1 'Suma un acierto. aciertos.Text = respuestaaciertos 'Imprime el número de aciertos en el TextBox. If respuestaaciertos + respuestadesaciertos = 20 Then resultado1.aciertos1.Text = aciertos.Text 'El número de aciertos se manda a imprimir al TextBox "aciertos1" que está en el formulario "resultado1". resultado1.desaciertos1.Text = desaciertos.Text 'El número de desaciertos se manda a imprimir al TextBox "desaciertos1" que está en el formulario "resultado1". resultado1.notafinal1.Text = 10 / 20 * Val(aciertos.Text) resultado1.Show() 'Mandar a llamar al formulario de resultados. El juego ha terminado. Me.Close() 'Cierra el formulario actual. End If Else 'Si la respuesta introducida por el usuario es diferente de la respuesta correcta. Dim mensaje As String mensaje = MsgBox("¡Incorrecto! La respuesta es: " + TextBoxoculto.Text + ".", MsgBoxStyle.OkOnly, "Juego de Operaciones Matemáticas para Bachilleres") If mensaje = 1 Then 'Si el botón presionado es el "Ok" (que es el único que se le va a presentar entonces ese se tiene que presionar). 'Generación de números aleatorios. numero1.Text = obtenernumerorandom(1, 99) + "/" + obtenernumerorandom(1, 99) 'Imprime un número random entre 1 y 99 contatenado con "+" concatenado con un número random entre 1 y 99, para obtener algo como "34/42", y eso se imprime en el TextBox "numero1". numero2.Text = obtenernumerorandom(1, 99) + "/" + obtenernumerorandom(1, 99) 'Imprime un número random entre 1 y 99 contatenado con "+" concatenado con un número random entre 1 y 99, para obtener algo como "34/42", y eso se imprime en el TextBox "numero2". respuesta.Text = "" 'Para borrar la respuesta anterior y que el usuario escriba una nueva respuesta. respuesta.Focus() 'Para que el cursor esté listo y que el usuario escriba su próxima respuesta. End If respuestadesaciertos += 1 'Suma un desacierto. desaciertos.Text = respuestadesaciertos 'Imprime el número de desaciertos en el TextBox. If respuestaaciertos + respuestadesaciertos = 20 Then resultado1.aciertos1.Text = aciertos.Text 'El número de aciertos se manda a imprimir al TextBox "aciertos1" que está en el formulario "resultado1". resultado1.desaciertos1.Text = desaciertos.Text 'El número de desaciertos se manda a imprimir al TextBox "desaciertos1" que está en el formulario "resultado1". resultado1.notafinal1.Text = 10 / 20 * Val(aciertos.Text) resultado1.Show() 'Mandar a llamar al formulario de resultados. El juego ha terminado. Me.Close() 'Cierra el formulario actual. End If End If End If End Sub Private Sub respuesta_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles respuesta.KeyPress Dim contadorplecas As Integer Dim longitudcadena As Integer = Len(respuesta.Text) 'Variable para almacenar la longitud de la cadena que hay en un Textbox. Dim caracterevaluado As String 'Para evaluar caracter por caracter con el Mid(). For ciclo As Integer = 1 To longitudcadena 'Para evaluar caracter por caracter hasta encontrar una "/". caracterevaluado = Mid(respuesta.Text, ciclo, 1) If caracterevaluado = "/" Then contadorplecas = contadorplecas + 1 End If Next If (Asc(e.KeyChar) >= 47 And Asc(e.KeyChar) <= 57) Or Asc(e.KeyChar) = 8 Then 'Los únicos caracteres que se permitirá introducir en el Textbox serán los números del 0 al 9 (ASCII del 48 al 57); la pleca ("/"), que es el ASCII 47; el signo menos ("-"), y el retroceso de espacio o backspace para borrar texto introducido, que es el ASCII 8. If (Asc(e.KeyChar) = 47) Then 'Si se presione la tecla de la pleca ("/"). If (contadorplecas > 0) Then 'Cuando se pretenda introducir una segunda pleca. e.KeyChar = "" 'Reemplaza la tecla digitada con el valor de nada para que no se puedan introducir caracteres inválidos. End If End If Else e.KeyChar = "" 'Reemplaza la tecla digitada con el valor de nada para que no se puedan introducir caracteres inválidos. End If End Sub Private Sub terminar1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles terminar1.Click Dim mensaje As String mensaje = MsgBox("¿Desea realmente terminar este juego?", MsgBoxStyle.YesNo, "Juego de Operaciones Básicas para Bachilleres") If mensaje = 6 Then resultado1.aciertos1.Text = aciertos.Text 'El número de aciertos se manda a imprimir al TextBox "aciertos1" que está en el formulario "resultado1". resultado1.desaciertos1.Text = desaciertos.Text 'El número de desaciertos se manda a imprimir al TextBox "desaciertos1" que está en el formulario "resultado1". resultado1.notafinal1.Text = 10 / (Val(aciertos.Text) + Val(desaciertos.Text)) * Val(aciertos.Text) 'Determinar e imprimir la nota final. resultado1.Show() 'Mandar a llamar al formulario de resultados. El juego ha terminado. End If End Sub End Class FORMULARIO sumabasico1 Public Class sumabasico1 Protected Overrides Sub OnPaint(ByVal Pintar As PaintEventArgs) Dim Elipse As New Drawing2D.GraphicsPath() Dim Rectangulo As New Rectangle(8, 28, Me.Width - 13, Me.Height - 40) 'La coordenada "x" de la esquina superior izquierda del rectángulo tiene el valor de 7 para que n o se vea el borde izquierdo del formulario. La coordenada "y" de la esquina superior izquierda del rectángulo tiene el valor de 26, con lo cual se logra que no aparezca la barra de título en el formulario. El ancho del rectángulo es "Me.Width - 13" para que no se vea el borde derecho del formulario. El alto del rectángulo es "Me.Height - 31" para que no se vea la línea inferior del borde. Elipse.AddEllipse(Rectangulo) Me.Region = New Region(Elipse) End Sub 'Las siguientes variables deben ser públicas para que vayan almacenando valores y que los pierdan hasta que explícitamente se programe un cambio de valores o cuando se cierre el formulario. Public respuestaaciertos As Integer 'Variable que contabiliza el número de aciertos. Public respuestadesaciertos As Integer 'Variable que contabiliza el número de desaciertos. Private Sub sumabasico1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'Al cargar el formulario ya deben aparecer números: numero1.Text = obtenernumerorandom(1, 999) 'Imprime un número random entre 1 y 999 en el TextBox "numero1". numero2.Text = obtenernumerorandom(1, 999) 'Imprime un número random entre 1 y 999 en el TextBox "numero2". aciertos.Text = "0" desaciertos.Text = "0" End Sub Private Sub TextBox3_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles respuesta.KeyPress If (Asc(e.KeyChar) >= 48 And Asc(e.KeyChar) <= 57) Or (Asc(e.KeyChar) = 8) Then 'Los únicos caracteres que se permitirá introducir en el TextBox serán los números del 0 al 9 (ASCII del 48 al 57). 'No se hace nada porque el caracter presionado es válido. Else e.KeyChar = "" 'Reemplaza la tecla digitada con un valor Void o vacío, para que no puedan introducir caracteres inválidos. End If End Sub Private Sub menu1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles menu1.Click Dim mensaje As String mensaje = MsgBox("Regresar al menú cancelará su juego actual. ¿Desea continuar?", MsgBoxStyle.YesNo, "Juego de Operaciones Básicas para Bachilleres") If mensaje = 6 Then menu2.Show() 'Llama al formulario "menu2". Me.Close() 'Cierra el formulario actual. Else 'No hace nada porque no se ha decidido por parte del usuario regresar al menú. End If End Sub Private Sub sumar1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles sumar1.Click If respuesta.Text = "" Then 'Si el usuario no ha escrito una respuesta. MsgBox("Escriba la respuesta que considere correcta.", MsgBoxStyle.Exclamation, "Juego de Operaciones Matemáticas para Bachilleres") respuesta.Focus() 'Se ubica el cursor en el cuadro de texto de respuestas para que el usuario escriba su respuesta. Else TextBoxoculto.Text = Val(numero1.Text) + Val(numero2.Text) 'Se guarda en el TextBox oculto la respuesta correcta. While Mid(respuesta.Text, 1, 2) = "00" Or Mid(respuesta.Text, 1, 2) = "01" Or Mid(respuesta.Text, 1, 2) = "02" Or Mid(respuesta.Text, 1, 2) = "03" Or Mid(respuesta.Text, 1, 2) = "04" Or Mid(respuesta.Text, 1, 2) = "05" Or Mid(respuesta.Text, 1, 2) = "06" Or Mid(respuesta.Text, 1, 2) = "07" Or Mid(respuesta.Text, 1, 2) = "08" Or Mid(respuesta.Text, 1, 2) = "09" 'Para que los ceros a la izquierda se borren. respuesta.Text = Mid(respuesta.Text, 2, Len(respuesta.Text) - 1) End While If (respuesta.Text = TextBoxoculto.Text) Then 'Si la respuesta introducida por el usuario es igual a la respuesta correcta. Dim mensaje As String mensaje = MsgBox("¡Felicidades, su respuesta es correcta!", MsgBoxStyle.OkOnly, "Juego de Operaciones Matemáticas para Bachilleres") If mensaje = 1 Then 'Si el botón presionado es el "Ok" (que es el único que se le va a presentar entonces ese se tiene que presionar). 'Generación de números aleatorios. numero1.Text = obtenernumerorandom(1, 999) 'Imprime un número random entre 1 y 999 en el TextBox "numero1". numero2.Text = obtenernumerorandom(1, 999) 'Imprime un número random entre 1 y 999 en el TextBox "numero2". respuesta.Text = "" 'Para borrar la respuesta anterior y que el usuario escriba una nueva respuesta. respuesta.Focus() 'Para que el cursor esté listo y que el usuario escriba su próxima respuesta. End If respuestaaciertos += 1 'Suma un acierto. aciertos.Text = respuestaaciertos 'Imprime el número de aciertos en el TextBox. If respuestaaciertos + respuestadesaciertos = 20 Then resultado1.aciertos1.Text = aciertos.Text 'El número de aciertos se manda a imprimir al TextBox "aciertos1" que está en el formulario "resultado1". resultado1.desaciertos1.Text = desaciertos.Text 'El número de desaciertos se manda a imprimir al TextBox "desaciertos1" que está en el formulario "resultado1". resultado1.notafinal1.Text = 10 / 20 * Val(aciertos.Text) resultado1.Show() 'Mandar a llamar al formulario de resultados. El juego ha terminado. Me.Close() 'Cierra el formulario actual. End If Else Dim mensaje As String mensaje = MsgBox("¡Incorrecto! La respuesta es: " + TextBoxoculto.Text + ".", MsgBoxStyle.OkOnly, "Juego de Operaciones Matemáticas para Bachilleres") If mensaje = 1 Then 'Si el botón presionado es el "Ok" (que es el único que se le va a presentar entonces ese se tiene que presionar). 'Generación de números aleatorios. numero1.Text = obtenernumerorandom(1, 999) 'Imprime un número random entre 1 y 999 en el TextBox "numero1". numero2.Text = obtenernumerorandom(1, 999) 'Imprime un número random entre 1 y 999 en el TextBox "numero2". respuesta.Text = "" 'Para borrar la respuesta anterior y que el usuario escriba una nueva respuesta. respuesta.Focus() 'Para que el cursor esté listo y que el usuario escriba su próxima respuesta. End If respuestadesaciertos += 1 'Suma un desacierto. desaciertos.Text = respuestadesaciertos 'Imprime el número de desaciertos en el TextBox. If respuestaaciertos + respuestadesaciertos = 20 Then resultado1.aciertos1.Text = aciertos.Text 'El número de aciertos se manda a imprimir al TextBox "aciertos1" que está en el formulario "resultado1". resultado1.desaciertos1.Text = desaciertos.Text 'El número de desaciertos se manda a imprimir al TextBox "desaciertos1" que está en el formulario "resultado1". resultado1.notafinal1.Text = 10 / 20 * Val(aciertos.Text) resultado1.Show() 'Mandar a llamar al formulario de resultados. El juego ha terminado. Me.Close() 'Cierra el formulario actual. End If End If End If End Sub Private Sub terminar1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles terminar1.Click Dim mensaje As String mensaje = MsgBox("¿Desea realmente terminar este juego?", MsgBoxStyle.YesNo, "Juego de Operaciones Básicas para Bachilleres") If mensaje = 6 Then resultado1.aciertos1.Text = aciertos.Text 'El número de aciertos se manda a imprimir al TextBox "aciertos1" que está en el formulario "resultado1". resultado1.desaciertos1.Text = desaciertos.Text 'El número de desaciertos se manda a imprimir al TextBox "desaciertos1" que está en el formulario "resultado1". resultado1.notafinal1.Text = 10 / (Val(aciertos.Text) + Val(desaciertos.Text)) * Val(aciertos.Text) 'Determinar e imprimir la nota final. resultado1.Show() 'Mandar a llamar al formulario de resultados. El juego ha terminado. End If End Sub End Class FORMULARIO sumaintermedio1 Public Class sumaintermedio1 Protected Overrides Sub OnPaint(ByVal Pintar As PaintEventArgs) Dim Elipse As New Drawing2D.GraphicsPath() Dim Rectangulo As New Rectangle(8, 28, Me.Width - 13, Me.Height - 40) 'La coordenada "x" de la esquina superior izquierda del rectángulo tiene el valor de 7 para que n o se vea el borde izquierdo del formulario. La coordenada "y" de la esquina superior izquierda del rectángulo tiene el valor de 26, con lo cual se logra que no aparezca la barra de título en el formulario. El ancho del rectángulo es "Me.Width - 13" para que no se vea el borde derecho del formulario. El alto del rectángulo es "Me.Height - 31" para que no se vea la línea inferior del borde. Elipse.AddEllipse(Rectangulo) Me.Region = New Region(Elipse) End Sub 'Las siguientes variables deben ser públicas para que vayan almacenando valores y que los pierdan hasta que explícitamente se programe un cambio de valores o cuando se cierre el formulario. Public respuestaaciertos As Integer 'Variable que contabiliza el número de aciertos. Public respuestadesaciertos As Integer 'Variable que contabiliza el número de desaciertos. Private Sub sumaintermedio1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 'Al cargar el formulario ya deben aparecer números: numero1.Text = obtenernumerorandom(100, 999999) 'Imprime un número random entre 100 y 999999 en el TextBox "numero1". numero2.Text = obtenernumerorandom(100, 999999) 'Imprime un número random entre 100 y 999999 en el TextBox "numero2". aciertos.Text = "0" desaciertos.Text = "0" End Sub Private Sub menu1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles menu1.Click Dim mensaje As String mensaje = MsgBox("Regresar al menú cancelará su juego actual. ¿Desea continuar?", MsgBoxStyle.YesNo, "Juego de Operaciones Básicas para Bachilleres") If mensaje = 6 Then menu2.Show() 'Llama al formulario "menu2". Me.Close() 'Cierra el formulario actual. Else 'No hace nada porque no se ha decidido por parte del usuario regresar al menú. End If End Sub Private Sub terminar1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles terminar1.Click Dim mensaje As String mensaje = MsgBox("¿Desea realmente terminar este juego?", MsgBoxStyle.YesNo, "Juego de Operaciones Básicas para Bachilleres") If mensaje = 6 Then resultado1.aciertos1.Text = aciertos.Text 'El número de aciertos se manda a imprimir al TextBox "aciertos1" que está en el formulario "resultado1". resultado1.desaciertos1.Text = desaciertos.Text 'El número de desaciertos se manda a imprimir al TextBox "desaciertos1" que está en el formulario "resultado1". resultado1.notafinal1.Text = 10 / (Val(aciertos.Text) + Val(desaciertos.Text)) * Val(aciertos.Text) 'Determinar e imprimir la nota final. resultado1.Show() 'Mandar a llamar al formulario de resultados. El juego ha terminado. End If End Sub Private Sub sumar1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles sumar1.Click If respuesta.Text = "" Then 'Si el usuario no ha escrito una respuesta. MsgBox("Escriba la respuesta que considere correcta.", MsgBoxStyle.Exclamation, "Juego de Operaciones Matemáticas para Bachilleres") respuesta.Focus() 'Se ubica el cursor en el cuadro de texto de respuestas para que el usuario escriba su respuesta. Else TextBoxoculto.Text = Val(numero1.Text) + Val(numero2.Text) 'Se guarda en el TextBox oculto la respuesta correcta. While Mid(respuesta.Text, 1, 2) = "00" Or Mid(respuesta.Text, 1, 2) = "01" Or Mid(respuesta.Text, 1, 2) = "02" Or Mid(respuesta.Text, 1, 2) = "03" Or Mid(respuesta.Text, 1, 2) = "04" Or Mid(respuesta.Text, 1, 2) = "05" Or Mid(respuesta.Text, 1, 2) = "06" Or Mid(respuesta.Text, 1, 2) = "07" Or Mid(respuesta.Text, 1, 2) = "08" Or Mid(respuesta.Text, 1, 2) = "09" 'Para que los ceros a la izquierda se borren. respuesta.Text = Mid(respuesta.Text, 2, Len(respuesta.Text) - 1) End While If (respuesta.Text = TextBoxoculto.Text) Then 'Si la respuesta introducida por el usuario es igual a la respuesta correcta. Dim mensaje As String mensaje = MsgBox("¡Felicidades, su respuesta es correcta!", MsgBoxStyle.OkOnly, "Juego de Operaciones Matemáticas para Bachilleres") If mensaje = 1 Then 'Si el botón presionado es el "Ok" (que es el único que se le va a presentar entonces ese se tiene que presionar). 'Generación de números aleatorios. numero1.Text = obtenernumerorandom(100, 999999) 'Imprime un número random entre 100 y 999999 en el TextBox "numero1". numero2.Text = obtenernumerorandom(100, 999999) 'Imprime un número random entre 100 y 999999 en el TextBox "numero2". respuesta.Text = "" 'Para borrar la respuesta anterior y que el usuario escriba una nueva respuesta. respuesta.Focus() 'Para que el cursor esté listo y que el usuario escriba su próxima respuesta. End If respuestaaciertos += 1 'Suma un acierto. aciertos.Text = respuestaaciertos 'Imprime el número de aciertos en el TextBox. If respuestaaciertos + respuestadesaciertos = 20 Then resultado1.aciertos1.Text = aciertos.Text 'El número de aciertos se manda a imprimir al TextBox "aciertos1" que está en el formulario "resultado1". resultado1.desaciertos1.Text = desaciertos.Text 'El número de desaciertos se manda a imprimir al TextBox "desaciertos1" que está en el formulario "resultado1". resultado1.notafinal1.Text = 10 / 20 * Val(aciertos.Text) resultado1.Show() 'Mandar a llamar al formulario de resultados. El juego ha terminado. Me.Close() 'Cierra el formulario actual. End If Else Dim mensaje As String mensaje = MsgBox("¡Incorrecto! La respuesta es: " + TextBoxoculto.Text + ".", MsgBoxStyle.OkOnly, "Juego de Operaciones Matemáticas para Bachilleres") If mensaje = 1 Then 'Si el botón presionado es el "Ok" (que es el único que se le va a presentar entonces ese se tiene que presionar). 'Generación de números aleatorios. numero1.Text = obtenernumerorandom(100, 999999) 'Imprime un número random entre 100 y 999999 en el TextBox "numero1". numero2.Text = obtenernumerorandom(100, 999999) 'Imprime un número random entre 100 y 999999 en el TextBox "numero2". respuesta.Text = "" 'Para borrar la respuesta anterior y que el usuario escriba una nueva respuesta. respuesta.Focus() 'Para que el cursor esté listo y que el usuario escriba su próxima respuesta. End If respuestadesaciertos += 1 'Suma un desacierto. desaciertos.Text = respuestadesaciertos 'Imprime el número de desaciertos en el TextBox. If respuestaaciertos + respuestadesaciertos = 20 Then resultado1.aciertos1.Text = aciertos.Text 'El número de aciertos se manda a imprimir al TextBox "aciertos1" que está en el formulario "resultado1". resultado1.desaciertos1.Text = desaciertos.Text 'El número de desaciertos se manda a imprimir al TextBox "desaciertos1" que está en el formulario "resultado1". resultado1.notafinal1.Text = 10 / 20 * Val(aciertos.Text) resultado1.Show() 'Mandar a llamar al formulario de resultados. El juego ha terminado. Me.Close() 'Cierra el formulario actual. End If End If End If End Sub Private Sub respuesta_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles respuesta.KeyPress If (Asc(e.KeyChar) >= 48 And Asc(e.KeyChar) <= 57) Or (Asc(e.KeyChar) = 8) Then 'Los únicos caracteres que se permitirá introducir en el TextBox serán los números del 0 al 9 (ASCII del 48 al 57). 'No se hace nada porque el caracter presionado es válido. Else e.KeyChar = "" 'Reemplaza la tecla digitada con un valor Void o vacío, para que no puedan introducir caracteres inválidos. End If End Sub End Class Jaime Montoya [email protected] www.jaimemontoya.com Santa Ana, 9 de marzo de 2008 El Salvador