'Entrenador Bmorse
'================
'Inicialmente se enva 1 letra conforme vaya mejorando
'tu recepci¢n la cantidad de letras y velocidad se
'incrementar hasta convertirte en un telegrafista avanzado.
DECLARE SUB CLOCK ()
DECLARE SUB DATOS (X AS INTEGER)
DECLARE FUNCTION VentAnas$ (X!, Y!, ANCHO!, ALTO!, COLORIN!)
DECLARE SUB TX (mensaje AS STRING, modo AS INTEGER)
DECLARE SUB MORSE (caracter AS STRING)
DECLARE SUB RAYA ()
DECLARE SUB ESPACIO ()
DECLARE SUB PUNTO ()
DIM mensaje AS STRING
DIM recibido AS STRING
COMMON SHARED freq AS INTEGER, wpm AS SINGLE, ticks AS SINGLE
COMMON SHARED respuesta AS STRING, Lmensaje AS INTEGER, modo AS INTEGER
COMMON SHARED mensajes AS INTEGER, correctos AS INTEGER, errores AS INTEGER
COMMON SHARED eficacia AS INTEGER, incremento AS INTEGER, nivel AS INTEGER
' === CONFIGURACION == '
freq = 700 'Frecuencia del Tono en HZ
wpm = 15 'Velocidad en palabras por minuto, m¡nimo 15
mensaje = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" 'Texto para practicar
modo = 0 'Modo 0 es aleatorio, Modo 1 es normal
Lmensaje = 1 'Cantidad inicial de caracteres que se enviar n en la pr ctica
incremento = 10 'Cada cu nto avanzamos de nivel
CALL CLOCK
REM SCREEN 9 'Ventana de 640x 350y
REM TEXTO y=25, x = 40
SCREEN 1 'Ventana de 320x 200y
REM COLOR 1, 0
CLS
LOCATE 12, 5
PRINT " Transmisi¢n empieza en..."
SLEEP 2
LOCATE 12, 5
PRINT " 3 "
CALL TX("E", 1)
LOCATE 12, 5
SLEEP 1
PRINT " 2"
CALL TX("E", 1)
LOCATE 12, 5
SLEEP 1
PRINT " 1"
CALL TX("E", 1)
SLEEP 2
RANDOMIZE TIMER
DO
CLS
LOCATE 12, 12
PRINT "Transmisi¢n..."
CALL TX(mensaje, 0)
mensajes = mensajes + 1
CLS
CALL DATOS(0)
LOCATE 12, 15
INPUT "¨Mensaje"; recibido
recibido = UCASE$(recibido)
IF recibido = respuesta THEN
CLS
LOCATE 13, 13
PRINT "!Correcto!: "; respuesta
SOUND 1000, .5
SOUND 1500, .5
SOUND 0, .1
correctos = correctos + 1
CALL DATOS(1)
SLEEP 1
SALIDA = 1
ELSE
IF recibido = "" THEN
SALIDA = 0
ELSE
SALIDA = 1
CLS
LOCATE 13, 13
PRINT "!Error!: "; respuesta
SOUND 100, .5
SOUND 300, .5
SOUND 100, 1
SOUND 0, .3
errores = errores + 1
CALL DATOS(1)
SLEEP 2
END IF
END IF
respuesta = ""
LOOP WHILE SALIDA > 0
CLS
LOCATE 12, 12
PRINT "Fin de transmisi¢n"
SLEEP 2
LOCATE 19, 6
PRINT "Bmorse, entrenador telegr fico"
LOCATE 21, 14
PRINT "
[email protected]"
LOCATE 22, 5
PRINT "Chiapas, Mxico. noviembre 2024"
wpm = 30
CALL CLOCK
CALL TX("73", 1)
SLEEP 2
SUB CLOCK
'Se calcula los wpm (Palabras por minuto) para convertirlo a
'ticks del reloj del sistema porque esa es la base de tiempo
'de QBasic para la funci¢n SOUND.
unidades = wpm * 50 '50 por el est ndar PARIS
dits = 60 / unidades
ticks = dits * 18.2
END SUB
SUB DATOS (EVALUAR AS INTEGER)
X = 19
Y = 15
IF EVALUAR = 1 THEN
eficacia = ((correctos - errores) / mensajes) * 100
END IF
IF eficacia < 0 THEN
eficacia = 0
END IF
IF eficacia >= 90 AND mensajes >= incremento THEN
wpm = wpm + 1
CALL CLOCK
incremento = mensajes + 10
END IF
IF correctos < 0 THEN
correctos = 0
END IF
IF errores < 0 THEN
errores = 0
END IF
SELECT CASE wpm
CASE 15 TO 16
LOCATE 2, 2
PRINT "Nivel: Aprendiz *"
CASE 17 TO 18
LOCATE 2, 2
PRINT "Nivel: Principiante **"
Lmensaje = 2
CASE 19 TO 21
LOCATE 2, 2
PRINT "Nivel: Intermedio ***"
Lmensaje = 3
CASE 22 TO 30
LOCATE 2, 2
PRINT "Nivel: Avanzado ****"
Lmensaje = 4
END SELECT
LOCATE X, Y
PRINT " Env¡os:"; mensajes
LOCATE X + 1, Y
PRINT "Correcto:"; correctos
LOCATE X + 2, Y
PRINT " Errores:"; errores
LOCATE X + 3, Y
PRINT "Eficacia:"; eficacia; "%"
LOCATE X + 4, Y
PRINT " WPM:"; wpm
LOCATE X + 5, 12
PRINT "(Enter para salir)"
END SUB
SUB ESPACIO
SOUND 0, ticks
END SUB
SUB MORSE (caracter AS STRING)
SELECT CASE caracter
CASE " "
CALL ESPACIO
CALL ESPACIO
CALL ESPACIO
CALL ESPACIO
CALL ESPACIO
CALL ESPACIO
CALL ESPACIO
CASE "A"
CALL PUNTO
CALL RAYA
CASE "B"
CALL RAYA
CALL PUNTO
CALL PUNTO
CALL PUNTO
CASE "C"
CALL RAYA
CALL PUNTO
CALL RAYA
CALL PUNTO
CASE "D"
CALL RAYA
CALL PUNTO
CALL PUNTO
CASE "E"
CALL PUNTO
CASE "F"
CALL PUNTO
CALL PUNTO
CALL RAYA
CALL PUNTO
CASE "G"
CALL RAYA
CALL RAYA
CALL PUNTO
CASE "H"
CALL PUNTO
CALL PUNTO
CALL PUNTO
CALL PUNTO
CASE "I"
CALL PUNTO
CALL PUNTO
CASE "J"
CALL PUNTO
CALL RAYA
CALL RAYA
CALL RAYA
CASE "K"
CALL RAYA
CALL PUNTO
CALL RAYA
CASE "L"
CALL PUNTO
CALL RAYA
CALL PUNTO
CALL PUNTO
CASE "M"
CALL RAYA
CALL RAYA
CASE "N"
CALL RAYA
CALL PUNTO
CASE "O"
CALL RAYA
CALL RAYA
CALL RAYA
CASE "P"
CALL PUNTO
CALL RAYA
CALL RAYA
CALL PUNTO
CASE "Q"
CALL RAYA
CALL RAYA
CALL PUNTO
CALL RAYA
CASE "R"
CALL PUNTO
CALL RAYA
CALL PUNTO
CASE "S"
CALL PUNTO
CALL PUNTO
CALL PUNTO
CASE "T"
CALL RAYA
CASE "U"
CALL PUNTO
CALL PUNTO
CALL RAYA
CASE "V"
CALL PUNTO
CALL PUNTO
CALL PUNTO
CALL RAYA
CASE "W"
CALL PUNTO
CALL RAYA
CALL RAYA
CASE "X"
CALL RAYA
CALL PUNTO
CALL PUNTO
CALL RAYA
CASE "Y"
CALL RAYA
CALL PUNTO
CALL RAYA
CALL RAYA
CASE "Z"
CALL RAYA
CALL RAYA
CALL PUNTO
CALL PUNTO
CASE "1"
CALL PUNTO
CALL RAYA
CALL RAYA
CALL RAYA
CALL RAYA
CASE "2"
CALL PUNTO
CALL PUNTO
CALL RAYA
CALL RAYA
CALL RAYA
CASE "3"
CALL PUNTO
CALL PUNTO
CALL PUNTO
CALL RAYA
CALL RAYA
CASE "4"
CALL PUNTO
CALL PUNTO
CALL PUNTO
CALL PUNTO
CALL RAYA
CASE "5"
CALL PUNTO
CALL PUNTO
CALL PUNTO
CALL PUNTO
CALL PUNTO
CASE "6"
CALL RAYA
CALL PUNTO
CALL PUNTO
CALL PUNTO
CALL PUNTO
CASE "7"
CALL RAYA
CALL RAYA
CALL PUNTO
CALL PUNTO
CALL PUNTO
CASE "8"
CALL RAYA
CALL RAYA
CALL RAYA
CALL PUNTO
CALL PUNTO
CASE "9"
CALL RAYA
CALL RAYA
CALL RAYA
CALL RAYA
CALL PUNTO
CASE "0"
CALL RAYA
CALL RAYA
CALL RAYA
CALL RAYA
CALL RAYA
END SELECT
CALL ESPACIO
CALL ESPACIO
CALL ESPACIO
END SUB
SUB PUNTO
SOUND freq, ticks
SOUND 0, ticks
END SUB
SUB RAYA
SOUND freq, ticks + ticks + ticks
SOUND 0, ticks
END SUB
SUB TX (mensaje AS STRING, modo AS INTEGER)
DIM Pmensaje AS STRING
Tmensaje = LEN(mensaje)
IF modo = 0 THEN
FOR num = 1 TO Lmensaje
Pmensaje = LEFT$(mensaje, RND * Tmensaje + 1)
Pmensaje = RIGHT$(Pmensaje, 1)
CALL MORSE(Pmensaje)
respuesta = respuesta + Pmensaje
NEXT num
ELSE
FOR num = 1 TO Tmensaje
Pmensaje = LEFT$(mensaje, num)
Pmensaje = RIGHT$(Pmensaje, 1)
CALL MORSE(Pmensaje)
respuesta = ""
NEXT num
END IF
END SUB