#include <stdio.h> #include <gemlib.h> #include <morse.c> #include <sendgem.c> short ytext[4], yprompt[4]; main() { short i, done, speed, score; char text[132]; gem_init(); clear_window( ywork ); /* Define box for explanatory text */ i = (wwork - 40*gl_wchar)/2; if( i < 0 ) terminate( "[3][Insufficient screen resolution!][Abort]" ); ytext[0] = xwork+i; ytext[2] = xwork+wwork-i; ytext[1] = ywork+gl_hchar; ytext[3] = ytext[1] + (gl_hchar<<3) + gl_hchar; /* Define box for prompts and messages */ yprompt[0] = ytext[0]; yprompt[2] = ytext[2]; yprompt[1] = ytext[3] + (gl_hchar<<2); yprompt[3] = yprompt[1] + (gl_hchar<<2); i = form_alert( 1, "[1][What level are you practicing for?][Novice|General|Extra]" ); if( i == 1 ) speed = 7; else if( i == 2 ) speed = 15; else if( i == 3 ) speed = 25; done = FALSE; while( !done ) { score = code_quiz( speed ); graf_mouse( M_ON, 0x0L ); graf_mouse( ARROW, 0x0L ); sprintf( text, "[3][Quiz completed!|Your score: %d%%][Repeat|Quit]", score ); if( form_alert( 2, text ) == 2 ) done = TRUE; } terminate( NULL ); } /* main */ code_quiz( speed ) /* Perform code quiz */ short speed; { char qstr[44], codech[2], ans, get_answer(); short lastch, guessflag, nw, nr; long i; clear_window( ywork ); graf_mouse( M_OFF, 0x0L ); /* Set timing values */ l_dot = l_el = 1200/speed; l_dash = l_char = l_dot*3; l_word = l_dot*7; /* Initialize test string */ strcpy( qstr, "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ.,?+*=/" ); lastch = 42; codech[1] = '\0'; /* Write messages */ textbox( ytext ); wputs( "Type the character that you hear." ); wputs( "Special codes:" ); wputs( " + is AR (end of message)" ); wputs( " * is SK (end of work)" ); wputs( " = is BT" ); wputs( "The test covers 0-9, A-Z, AR, SK, BT," ); wputs( "?, /, period, and comma." ); wputs( "Press UNDO to interrupt the quiz." ); m_wait( 2000 ); nw = nr = 0; while( lastch >= 0 ) { guessflag = 0; textbox( yprompt ); wputs( "Identify this one." ); i = Random() % (lastch+1); codech[0] = qstr[i]; while( guessflag >= 0 ) { ev_mkreturn = 0; send_morse( codech ); ans = toupper( get_answer() ); if( ans == 0 ) /* assume UNDO, quit */ return( nr ? (nr*100)/(nr+nw) : 0 ); textbox( yprompt ); if( ans != codech[0] ) { nw++; wputs( "No, that isn't right." ); if( ++guessflag > 2 ) { wputs( "The character was:" ); wputs( codech ); guessflag = -1; m_wait( 1000 ); } else wputs( "Try that one again." ); } else { nr++; wputs( "That is correct." ); if( guessflag == 0 ) qstr[i] = qstr[lastch--]; guessflag = -1; } m_wait( 2000 ); } } return( (nr*100)/(nr+nw) ); } /* code_quiz */ char get_answer() { if( ev_mkreturn == 0 ) ev_mkreturn = evnt_keybd(); return( (char) (ev_mkreturn & 0x0ff) ); } /* get_answer */