'Entrenador Bmorse '================ 'Inicialmente se enva 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 "emilio@sdf.org" LOCATE 22, 5 PRINT "Chiapas, M‚xico. 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